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 content
parameters 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/stdlib
6.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.