Version information
This version is compatible with:
- Puppet Enterprise 2019.8.x, 2019.7.x, 2019.5.x, 2019.4.x, 2019.3.x, 2019.2.x, 2019.1.x, 2019.0.x, 2018.1.x, 2017.3.x, 2017.2.x, 2017.1.x, 2016.5.x, 2016.4.x
- Puppet >= 4.0.0 < 7.0.0
- , , , Alpine, ,
This module has been deprecated by its author since Aug 26th 2021.
The reason given was: No longer maintained
The author has suggested puppet-postfix as its replacement.
Start using this module
Documentation
Postfix Puppet Module
This module requires Augeas.
Simple usage
include postfix
postfix::config { 'relay_domains':
ensure => present,
value => 'localhost host.foo.com',
}
Classes
postfix
The top-level class, to install and configure Postfix.
Parameters
alias_maps
A string defining the location of the alias map file.
Default: 'hash:/etc/aliases'.
Example: 'hash:/etc/other_aliases'.
configs
A hash containing optional configuration values for main.cf. The values are configured using postfix::config.
Default: An empty hash.
Example: '{message_size_limit': {'value': '51200000'}}.
inet_interfaces
A string defining the network interfaces that Postfix will listen on.
Default: 'all'.
Example: '127.0.0.1, [::1]'.
inet_protocols
A string defining the internet protocols that Postfix will use.
Default: 'all'.
Example: 'ipv4'.
ldap
A Boolean defining whether to configure Postfix for LDAP use.
Default: false.
ldap_base
A string defining the LDAP search base to use. This parameter maps to the search_base parameter (ldap_table(5)).
Default: Undefined.
Example 'cn=Users,dc=example,dc=com'.
ldap_host
A string defining the LDAP host. This parameter maps to the server_host parameter (ldap_table(5)).
Default: Undefined.
Example: 'ldaps://ldap.example.com:636 ldap://ldap2.example.com'.
ldap_options
A free form string that can define any ldap options to be passed through (ldap_table(5)).
Default: Undefined.
Example: 'start_tls = yes'.
mail_user
A string defining the mail user, and optionally group, to execute external commands as. This parameter maps to the user parameter (pipe(8)).
Default: 'vmail'.
Example: 'vmail:vmail'.
mailman
A Boolean defining whether to configure a basic smtp server that is able to work for the mailman mailing list manager.
Default: false.
maincf_source
A string defining the location of a skeleton main.cf file to be used. The default file supplied is blank. However, if the main.cf file already exists on the system the contents will NOT be replaced by the contents from maincf_source.
Default: "puppet:///modules/${module_name}/main.cf".
Example: 'puppet:///modules/some/other/location/main.cf'.
manage_conffiles
A Boolean defining whether the puppet module should replace the configuration files for postfix.
This setting currently effects only the following files:
- /etc/mailname
- /etc/postfix/master.cf
This setting does NOT effect the following files:
- /etc/aliases
- /etc/postfix/main.cf
Default: true.
manage_mailx
A Boolean defining whether the puppet module should manage the mailx package. See also $mailx_ensure.
Default: true.
mastercf_source
A string defining the location of a skeleton master.cf file to be used.
Default: Undefined.
Example: 'puppet:///modules/some/other/location/master.cf'.
master_smtp
A string to define the smtp line in the /etc/postfix/master.cf file. If this is defined the smtp_listen parameter will be ignored.
Default: Undefined.
Example: 'smtp inet n - n - - smtpd'.
master smtps
A string to define the smtps line in the /etc/postfix/master.cf file.
Default: Undefined.
Example: 'smtps inet n - n - - smtpd'.
master_submission
A string to define the submission line in the /etc/postfix/master.cf file.
Default: Undefined.
Example: 'submission inet n - n - - smtpd'.
master_entries
Array of strings containing additional entries for the /etc/postfix/master.cf file. Default: Undefined. Example: 'submission inet n - n - - smtpd'.
mta
A Boolean to define whether to configure Postfix as a mail transfer agent. This option is mutually exclusive with the satellite Boolean.
Default: False.
mydestination
A string to define the mydestination parameter in main.cf (postconf(5)).
Default: The systems FQDN.
Example: 'example.com, foo.example.com'.
mynetworks
A string to define the mynetworks parameter that holds trusted remote smtp clients (postconf(5)).
Default: '127.0.0.0/8'.
Example: '127.0.0.0/8, [::1]/128'.
myorigin
A string to define the myorigin parameter that holds the domain name that mail appears to come from (postconf(5)).
Default: The FQDN of the host.
Example: 'example.com'
relayhost
A string to define the relayhost parameter (postconf(5)).
Default: Undefined.
Example: 'smtp.example.com'.
root_mail_recipient
A string to define the e-mail address to which all mail directed to root should go (aliases(5)).
Default: 'nobody'.
Example: 'root_catch@example.com'.
chroot
A boolean to define if postfix should be run in a chroot jail or not. If not defined, '-' is used (OS dependant) Default: Undefined. Example: true
satellite
A Boolean to define whether to configure postfix as a satellite relay host. This setting is mutually exclusive with the mta Boolean.
Default: False.
smtp_listen
A string to define the IP on which to listen in master.cf. This can also be set to 'all' to listen on all interfaces. If master_smtp is defined smtp_listen will not be used.
Default: '127.0.0.1'.
Example: '::1'.
use_amavisd
A Boolean to define whether to configure master.cf to allow the use of the amavisd scanner.
Default: False.
use_dovecot_lda
A Boolean to define whether to configure master.cf to use dovecot as the local delivery agent.
Default: False.
use_schleuder
A Boolean to define whether to configure master.cf to use the Schleuder GPG-enabled mailing list.
Default: False.
use_sympa
A Boolean to define whether to configure master.cf to use the Sympa mailing list management software.
Default: False.
Examples
Include
include postfix
or
Class Resource
class { 'postfix':
inet_interfaces => 'localhost',
inet_protocols => 'ipv4',
relayhost => "mail.${facts['domain']}",
root_mail_recipient => 'dont_bother_the_sysadmins@example.com',
}
postfix::config
Add/alter/remove options in Postfix main configuration file (main.cf). This uses Augeas to do the editing of the configuration file, as such any configuration value can be used.
Parameters
ensure
A string whose value can be any of 'present', 'absent', 'blank'.
Default: present.
Example: blank.
value
A string that can contain any text to be used as the configuration value.
Default: Undefined.
Example: 'btree:${data_directory}/smtp_tls_session_cache'.
Examples
Configure Postfix to use TLS as a client
postfix::config {
'smtp_tls_mandatory_ciphers': value => 'high';
'smtp_tls_security_level': value => 'secure';
'smtp_tls_CAfile': value => '/etc/pki/tls/certs/ca-bundle.crt';
'smtp_tls_session_cache_database': value => 'btree:${data_directory}/smtp_tls_session_cache';
}
Configure Postfix to disable the vrfy command
postfix::config { 'disable_vrfy_command':
ensure => present,
value => 'yes',
}
postfix::hash
Creates Postfix hashed "map" files, and builds the corresponding db file.
Parameters
ensure
Defines whether the hash map file is present or not. Value can either be present or absent.
Default: present.
Example: absent.
content
A free form string that defines the contents of the file. This parameter is mutually exclusive with the source parameter.
Default: Undefined.
Example: '#Destination Credentials\nsmtp.example.com gssapi:nopassword'.
source
A string whose value is a location for the source file to be used. This parameter is mutually exclusive with the content parameter, one or the other must be present, but both cannot be present.
Default: Undefined.
Example: 'puppet:///modules/some/location/sasl_passwd'.
Examples
Create a sasl_passwd hash from a source file
postfix::hash { '/etc/postfix/sasl_passwd':
ensure => 'present',
source => 'puppet:///modules/profile/postfix/client/sasl_passwd',
}
Create a sasl_passwd hash with contents defined in the manifest
postfix::hash { '/etc/postfix/sasl_passwd':
ensure => 'present',
content => '#Destination Credentials\nsmtp.example.com gssapi:nopassword',
}
postfix::transport
Manages content of the /etc/postfix/transport map.
Requirements
Augeas is, of course, required.
The following code is required to use transport maps.
include postfix
postfix::hash { '/etc/postfix/transport':
ensure => present,
}
postfix::config { 'transport_maps'
ensure => present,
value => 'hash:/etc/postfix/transport',
}
Parameters
ensure
Defines whether the transport entry is present or not. Value can either be present or absent.
Default: present.
Example: absent.
destination
The destination to be delivered to (transport(5)).
Default: Undefined.
Example: 'mailman'.
nexthop
A string to define where and how to deliver the mail (transport(5)).
Default: Undefined.
Example: '[smtp.google.com]:25'.
Examples
postfix::virtual
Manages the contents of the virtual map.
Requirements
Augeas is, of course, required.
The following code is necessary to make virtual maps work:
include postfix
postfix::hash { '/etc/postfix/virtual':
ensure => present,
}
postfix::config { 'virtual_alias_maps':
ensure => present,
value => 'hash:/etc/postfix/virtual',
}
Parameters
ensure
A string whose valid values are present or absent.
Default: present.
Example: absent.
file
A string defining the location of the virtual map, pre hash.
Default: '/etc/postfix/virtual'.
Example: '/etc/postfix/my_virtual_map'.
destination
A string defining where the e-mails will be delivered to, (virtual(8)).
Default: Undefined.
Example: 'root'
Examples
Route mail bound for 'user@example.com' to root.
postfix::virtual {'user@example.com':
ensure => present,
destination => 'root',
}
postfix::conffile
Manages postfix configuration files. With it, you could create configuration files (other than, main.cf, master.cf, etc.) restarting postfix when necessary.
Parameters
ensure
A string whose valid values are present, absent or directory.
Default: present.
Example: absent.
source
A string with the source of the file. This is the source parameter of the underlying file resource.
Default: undef
Example: 'puppet:///modules/postfix/configfile.cf'
content
The content of the postfix configuration file. This is an alternative to the source parameter. If you don't provide source neither content parameters a default template is used and the content is created with values in the options hash.
Default: undef
path
Path where to create the configuration file.
Default: '/etc/postfix/${name}'
mode
Permissions of the configuration file. This option is useful if you want to create the file with specific permissions (for example, because you have passwords in it).
Default: '0644'
Example: '0640'
options
Hash with the options used in the default template that is used when neither source neither contentparameters are provided.
Default: {}
Example:
postfix::conffile { 'ldapoptions.cf':
options => {
server_host => ldap.mydomain.com,
bind => 'yes',
bind_dn => 'cn=admin,dc=mydomain,dc=com',
bind_pw => 'password',
search_base => 'dc=example, dc=com',
query_filter => 'mail=%s',
result_attribute => 'uid',
}
}
Contributing
Please report bugs and feature request using GitHub issue tracker.
For pull requests, it is very much appreciated to check your Puppet manifest with puppet-lint to follow the recommended Puppet style guidelines from the Puppet Labs style guide.
Changelog
1.12.0 (2021-04-23)
Implemented enhancements:
- puppetlabs/stdlib: Allow 7.x #294 (bastelfreak)
- Add FreeBSD support #288 (smortex)
Fixed bugs:
1.11.0 (2021-01-20)
Implemented enhancements:
- Add Solaris support #274 (rstuart-indue)
- Feature/allow specify master cf content & template #217 (c33s)
- Add a variable definition and two examples. #212 (dafydd2277)
- Include parameter title in error output #209 (mrintegrity)
- more than two amavis processes #175 (farlerac)
Closed issues:
Merged pull requests:
- Fix CI #291 (towo)
- Fix CI #289 (smortex)
- Fix hardcoded map path #287 (towo)
- Transport: allow [host]:port smtp syntax #285 (raphink)
- README.md: fix link to puppet-lint #283 (kenyon)
- Fixes postmap when ensure=absent #202 (earsdown)
- Add virtual and transport regexp examples #116 (micah)
1.10.0 (2020-01-23)
Implemented enhancements:
- Add the possibility to manage (or not) aliases #271 (Bodenhaltung)
- Convert to PDK #270 (raphink)
- Convert params.pp to hiera data #269 (raphink)
Closed issues:
Merged pull requests:
1.9.0 (2019-11-26)
Implemented enhancements:
- Upping version dependency on puppet-alternatives #260 (cubiclelord)
- Add RedHat 8 support #257 (zeromind)
- Add missing inet_protocols parameter to the README. #254 (catay)
- add retry and proxywrite for debian family OSes #253 (Dan33l)
- Allow
puppetlabs/stdlib6.x #246 (alexjfisher) - Add show_diff parameter to postfix::conffile #226 (treydock)
Fixed bugs:
- Should mailalias_core be declared as a dependency ? #236
Closed issues:
- Add Debian Stretch to metadata.json #259
- qmgr warning: connect to transport private/retry #252
- Clarify license #250
Merged pull requests:
- Release 1.9.0 #265 (alexjfisher)
- Add missing Variable for Suse #245 (cocker-cc)
1.8.0 (2019-04-05)
- Deprecate Puppet 3 support
- Add new config parameter to add configuration from hiera (GH #240)
- Allow Sensitive postfix::hash content (GH #243)
- Add master_bounce_command and master_defer_command (GH #239)
- Schleuder: port invocation syntax to Schleuder 3. (GH #234)
- Allow multiple spaces in postfix::mta::mynetworks (GH #235)
- Add postfix::mailalias (GH #233)
- Remove legacy instructions on exec paths
1.7.0 (2018-11-01)
- Add chroot parameter (GH #170, #224)
- Fix resource dependencies (GH #185)
- Add postfix::service_ensure and postfix::service_enabled parameters (GH #184)
- Fix email address matching for postfix::virtual augeas lens (GH #177)
- Add master_entries parameter (GH #171)
- Add templates for SLES12 SP2 and SP3 (GH #198)
- Install sendmail alternative on RedHat (GH #199)
- Move Exec['newaliases'] to services to it could be run after service restart (GH #205)
- Unbreak sendmail (GH #201)
- Add retry to RedHat master.cf (GH #215)
- Support '+' in canonical maps (GH #222, fix #220)
- Add support for Alpine Linux (GH #213)
- Support multiple destinations in postfix::virtual (#223, fix #164)
- Make transport pattern accept regexp (GH #225, fix #92)
- Ensure that map files are regenerated if removed (GH #228, fix #161)
- Allow puppetlabs-stdlib < 6.0.0 (GH #229)
- Modulesync: update testing harness and add Puppet 6
1.6.0 (2017-08-25)
- Fix package name resolution for Debian stretch (GH #179)
- Do not generate postmap when postfix::map ensure is absent (GH #178)
- Add inet_protocol param. (GH #172)
- Create master.cf.SLES11.4.erb (GH #156)
- Allow mydestination to be blank (GH #162)
- Fix hash.pp doc (GH #159)
1.5.0 (2016-11-17)
- Fix params validation + specs (GH #154)
- Fix map calling in hash (GH #153)
- Fix the path of the database (GH #149)
- Add a map define to create postfix maps (#138)
1.4.0 (2016-08-23)
- Add manage_root_alias parameter to disable management of root's mailalias resource (GH #133)
- set mode 0644 for /etc/mailname (GH #142)
- Fix virtual.db and transport.db creation (GH #135, GH #130)
- Add $manage_mailx boolean to control whether mailx is managed (GH #143, GH #141)
- Add conffile define (GH #139)
- Fix acceptance tests (GH #144)
- Update test system
1.3.1 (2016-03-16)
- Fix tests for Puppet 4
1.3.0 (2016-03-15)
- Consistent formating of documentation (GH #125)
- Add ensure class arguments for packages (GH #99)
- Various testing changes/fixes
1.2.14 (2015-08-21)
- Use docker for acceptance tests
1.2.13 (2015-06-30)
- Fix documentation
1.2.12 (2015-06-26)
- Fix strict_variables activation with rspec-puppet 2.2
1.2.11 (2015-06-24)
- Add support for SLES 12 and newest openSUSE releases
- Add acceptance test
- Restart postfix instead of reload after package installation (Fixes #90)
- Use RHEL SELinux type for /etc/aliases
1.2.10 (2015-06-19)
- Update documentation
1.2.9 (2015-05-28)
- Add beaker_spec_helper to Gemfile
1.2.8 (2015-05-26)
- Use random application order in nodeset
1.2.7 (2015-05-26)
- add utopic & vivid nodesets
1.2.6 (2015-05-25)
- Don't allow failure on Puppet 4
1.2.5 (2015-05-19)
- Add missing ownership
1.2.4 (2015-05-13)
- Add puppet-lint-file_source_rights-check gem
1.2.3 (2015-05-12)
- Don't pin beaker
1.2.2 (2015-04-27)
- Add nodeset ubuntu-12.04-x86_64-openstack
1.2.1 (2015-04-15)
- Use file() function instead of fileserver (way faster)
- Fix issue with ldap-alias map
1.2.0 (2015-04-03)
- Allow to pass arrays to postfix::hash::source and postfix::hash::content
- IPv6 support
- Fix for RedHat
- Add RedHat 7 support
- Use rspec-puppet-facts for unit tests
1.1.1 (2015-03-24)
- Various spec improvements
1.1.0 (2015-02-19)
- Various specs improvements
- Fix specs for postfix::config with ensure => blank
- Simplify relationships and avoid spaceship operators
- nexthop parameter is not necessary for postfix::canonical
1.0.5 (2015-01-07)
- Fix unquoted strings in cases
1.0.2 (2014-11-17)
- Add missing postfix_canonical lens to postfix::augeas (GH #59)
- Fix unit tests for RH 7
1.0.1 (2014-10-20)
- Setup automatic Forge releases
* This Changelog was automatically generated by github_changelog_generator
Dependencies
- puppetlabs/stdlib (>=4.13.0 < 8.0.0)
- camptocamp/augeas (>=1.0.0 <2.0.0)
- puppet/alternatives (>=2.0.0 <4.0.0)
- puppetlabs/mailalias_core (>=1.0.5 <2.0.0)
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.