system
Version information
This version is compatible with:
- Puppet Enterprise 2018.1.x, 2017.3.x, 2017.2.x, 2016.4.x
- Puppet >= 4.10.0 < 6.0.0
- , , , , , , , ,
This module has been deprecated by its author since Jun 26th 2023.
Start using this module
Documentation
Transferred to the good people at Vox Pupuli.
puppet-system
Manage Linux system resources and services from hiera configuration.
Please take note that this module works only with RedHat like systems.
- augeas: apply file changes using the augeas tool
- crontabs: set user crontab entries
- execs: run idempotent external commands
- facts: set custom facts
- files: create/update files or directories
- groups: manage entries in /etc/group
- hosts: manage entries in /etc/hosts
- limits: manage entries in /etc/security/limits.conf
- mail manage entries in /etc/aliases or set a relay host
- mounts: manage entries in /etc/fstab
- network: configure basic networking and dns
- ntp: configure NTP servers in /etc/ntp.conf
- packages: manage system packages
- schedules: determine when resource config should not be applied and how often
- selbooleans: manage SELinux booleans
- services: manage system services
- sshd: manage configuration in /etc/ssh/sshd_config including subsystems like sftp
- sysconfig: manage files under /etc/sysconfig: clock, i18n, keyboard, puppet-dashboard, puppet, puppetmaster, selinux
- sysctl: manage entries in /etc/sysctl.conf
- templates: create files from ERB templates
- users: manage users in /etc/passwd and /etc/shadow
- yumgroups: manage system package groups
- yumrepos: manage yum repository files under /etc/yum.repos.d
Documentation
For default types (users, groups, mounts, yumrepos, packages, cron, exec) see the documentation at http://docs.puppetlabs.com/references/latest/type.html for the parameters that can be passed to each of the resources.
For augeasproviders types (sysctl, sshd) see http://forge.puppetlabs.com/domcleal/augeasproviders.
For limits see http://forge.puppetlabs.com/erwbgy/limits.
Usage
Include the system module in your puppet configuration:
include system
and add required hiera configuration.
Note: To exclude certain system classes when doing 'include system' you can set their schedule parameter to 'never'. This may be useful when testing or debugging issues or just to prevent config lower in the hierarchy being applied.
For example:
system::packages::schedule: 'never'
system::yumgroups::schedule: 'never'
will ignore any configuration for system::packages and system::yumgroups.
augeas
Apply changes to files using the augeas tool. This enables simple configuration file changes to be made without writing new classes.
Example 1:
system::augeas:
'ntp':
context: '/files/etc/ntp.conf'
changes:
- 'set server[1] 0.uk.pool.ntp.org'
- 'set server[2] 1.uk.pool.ntp.org'
- 'set server[3] 2.uk.pool.ntp.org'
Example 2:
system::augeas:
'test1':
context: '/files/etc/sysconfig/firstboot'
changes:
- 'set RUN_FIRSTBOOT YES'
onlyif: 'match other_value size > 0'
Example 3:
system::augeas:
'jboss_conf':
context: '/files'
changes:
- 'set etc/jbossas/jbossas.conf/JBOSS_IP $ipaddress'
- 'set etc/jbossas/jbossas.conf/JAVA_HOME /usr'
load_path: '/usr/share/jbossas/lenses'
Defaults:
- ensure: present
- user: root
crontabs
Set user crontab entries
Example configuration:
system::crontabs:
'root-logrotate':
command: '/usr/sbin/logrotate'
user: 'root'
hour: '2'
minute: '0'
Defaults:
- ensure: present
- user: root
execs
Run idempotent external commands
Example configuration:
system::execs:
'/bin/mkdir -p /apps/tomcat1/deploy':
unless: '/usr/bin/test -d /apps/tomcat1/deploy'
"/usr/bin/perl -pi -e 's: grep 1.6: egrep \"1.6/1.7\":' /apps/wso2esb1/product/wso2esb/bin/wso2server.sh":
onlyif: '/bin/grep -w "grep 1.6" /apps/wso2esb1/product/wso2esb/bin/wso2server.sh'
Note: The commands will be run on every Puppet run unless you specify 'onlyif', 'unless' or 'refreshonly' parameters.
facts
Set custom facts using the facter_dot_d Facter plugin that loads facts from /etc/facter/facts.d (https://github.com/ripienaar/facter-facts/tree/master/facts-dot-d)
Example configuration:
system::facts:
location:
value: 'London'
ntpq:
type: 'script'
value: "#!/bin/bash\nprintf ntpq=\n/usr/sbin/ntpq -p | /usr/bin/tail -1\n"
These facts can be queried on a host using 'facter -p':
$ facter -p location
London
$ facter -p ntpq
*10.43.4.8 158.43.128.33 2 u 820 1024 377 0.538 0.155 0.048
Set:
system::facts::cleanold: true
to remove facts from the old locations under /etc/profile.d and in /etc/sysconfig/puppet.
files
Create or update files or directories
Example 1 - create a mount point for an NFS mounted directory:
system::files:
/apps:
ensure: 'directory'
owner: 'root'
group: 'root'
mode: '0755'
Example 2 - create a file with the given content:
system::files:
/etc/motd:
ensure: 'present'
owner: 'root'
group: 'root'
mode: '0644'
content: "Authorised access only\nIf unauthorised log off now or face prosecution\n"
Note: Use double-quotes if your content contains embedded newlines (\n) or tabs (\t). Normally you will also want a terminating newline.
groups
Manage entries in /etc/group
Example configuration:
system::groups:
'sysadmins':
ensure: 'present'
gid: '1500'
'ops':
gid: '1503'
system::groups::realize:
- 'keith'
Defaults:
- ensure: present
By default virtual group resources are created that must then be realized. To create real resources instead (as with earlier versions of this module) use:
system::groups::real: 'true'
hosts
Manage entries in /etc/hosts
Example configuration:
system::hosts:
puppet:
ensure: 'present'
ip: '10.5.11.19'
host_aliases: [ 'puppet.local' ]
Defaults:
- ensure: present
See: http://docs.puppetlabs.com/references/latest/type.html#host
limits
Manage entries in /etc/security/limits.conf
Example configuration:
system::limits:
'*':
nofile:
soft: 1024
hard: 2048
'@weblogic':
nofile:
soft: 16384
hard: 16384
nproc:
soft: 2048
hard: 2048
No defaults.
Manage entries in /etc/aliases or set a relay host
Example configuration:
system::mail:
aliases:
postmaster:
recipient: 'root'
webmaster:
recipient: 'fred@domain.com'
relayhost: 'mail.domain.com'
type: 'postfix'
No defaults.
See: http://docs.puppetlabs.com/references/latest/type.html#mailalias
Currently only 'postfix' is supported for setting a relay host.
mounts
Manage entries in /etc/fstab
Example configuration:
system::mounts:
'/home':
ensure: 'mounted'
device: '/dev/mapper/vg_x120-lv_home'
atboot: 'true'
fstype: 'ext4'
options: 'defaults'
Defaults:
- atboot: true
- ensure: mounted
Note: These resources are created last so any required users, groups or mount point directories have a chance to be created first.
network
Configure basic networking: set hostname, enable/disable zeroconf/IPv6, set the default route, configure interfaces and their static routes, configure nameserver resolvers and domains
Example configuration:
system::network::hostname: 'puppet.domain.com'
system::network::gateway: '10.7.0.1'
system::network::ipv6: 'false'
system::network::zeroconf: 'false'
system::network::dns:
nameservers: [ '10.7.96.2', '10.7.96.2' ]
domains: [ 'domain.com', 'sub.domain.com' ]
system::network::interfaces:
eth0:
ipaddress: '10.7.96.21'
netmask: '255.255.240.0'
routes:
'10.0.0.0/8':
via: '10.16.0.250'
ntp
Manage NTP servers in /etc/ntp.conf
Example 1:
system::ntp::iburst: 'true'
system::ntp::servers: [ 'ntp1.example.com' ]
Example 2:
system::ntp::iburst: 'true'
system::ntp::country: 'uk'
See https://github.com/erwbgy/puppet-ntp for more details
Note: The NTP algorithm does not work properly with two NTP servers.
packages
Manage system packages
Example configuration:
system::packages:
AdobeReader_enu:
ensure: '9.5.1-1'
ConsoleKit:
ensure: '0.4.5-2.fc17'
Defaults:
- ensure: installed
schedules
Create schedules that determine when a resource should not be applied and the number times it should be applied within a specified time period.
Example configuration:
system::schedules:
'maintenance':
range: '2 - 4'
period: 'daily'
repeat: 1
'half-hourly':
period: 'hourly'
repeat: 2
The defined schedules can then be passed using the 'schedule' parameter to other types.
Example 1:
system::schedule: 'maintenance'
sets the default schedule for all system resources so that they are only run during the maintenance window of 2:00 to 04:59.
Example 2:
system::services::schedule: 'daily'
sets the default schedule for all system::services resources to be once a day.
Example 3:
system::services:
httpd:
ensure: 'running'
enable: 'true'
schedule: 'half-hourly'
overrides the services schedule for the httpd resource using a custom schedule we defined above.
The default Puppet schedules are:
- daily
- hourly
- monthly
- never
- weekly
and the system::schedule class defines another called always that schedules the resource on every Puppet run.
selbooleans
Manages SELinux booleans
Example configuration:
system::selbooleans:
'httpd_can_network_connect':
value: 'on'
persistent: 'true'
Defaults:
- persistent: false
services
Manage system services
Example configuration:
system::services:
cups:
ensure: 'stopped'
enable: 'false'
sshd:
ensure: 'running'
enable: 'true'
ntpd:
ensure: 'running'
enable: 'true'
Defaults:
- ensure: running
Note:
- Do not specify any services that are managed by other Puppet modules (eg. ntpd or network) otherwise you may get conflicts
sshd
Manage settings in /etc/ssh/sshd.conf
Synchronize host keys file entries across all puppet-managed hosts.
Example configuration:
system::sshd:
AllowGroups:
value: [ 'sshusers', 'admin' ]
PermitRootLogin:
value: 'without-password'
condition: 'Host example.net'
system::sshd::subsystem:
sftp:
command: '/usr/libexec/openssh/sftp-server -u 0002'
system::sshd::sync_host_keys: 'true'
No defaults.
See:
- https://github.com/domcleal/augeasproviders/blob/master/lib/puppet/type/sshd_config.rb
- https://github.com/domcleal/augeasproviders/blob/master/lib/puppet/type/sshd_config_subsystem.rb
sysconfig
Manage settings in files under /etc/sysconfig
Example configuration:
system::sysconfig::clock:
timezone: 'Europe/London'
system::sysconfig::i18n:
# Run 'locale -a' to see possible lang values
lang: 'en_GB.utf8'
system::sysconfig::keyboard:
keytable: 'uk'
model: 'pc105'
layout: 'gb'
keyboardtype: 'pc'
system::sysconfig::puppet:
server: 'puppet.sbet'
system::sysconfig::selinux:
state: 'enforcing'
No defaults.
Note: Values must not contain whitespace
sysctl
Manage settings in /etc/sysctl.conf
Example configuration:
system::sysctl:
kernel.msgmnb:
value: '131072'
comment: 'Controls the default maximum size of a message queue'
kernel.msgmax:
value: '131072'
comment: ' Controls the maximum size of a message, in bytes'
No defaults.
See:
Note: Quote numeric values to avoid "can't convert Fixnum into String" errors
templates
Create files from ERB templates
Example configuration:
system::templates:
/etc/motd:
owner: 'root'
group: 'root'
mode: '0644'
template: "/var/lib/puppet/templates/motd-%{osfamily}.erb"
/etc/environment:
owner: 'root'
group: 'root'
mode: '0644'
template: "environment.erb"
Default:
- owner: root
- group: root
If template is a relative path then Puppet will look for template file in template_dir (eg. /var/lib/puppet/templates).
Templates can use any facts set for the destination host.
users
Manage users entries in /etc/passwd and /etc/shadow
Example configuration:
system::users:
'keith':
ensure: 'present'
comment: 'Keith Burdis'
gid: '500'
groups: ['wheel']
home: '/home/keith'
shell: '/bin/bash'
uid: '500'
'fred':
comment: 'Fred Bloggs'
uid: '503'
gid: '503'
home: '/home/fred'
managehome: true
system::users::realize:
- 'keith'
Defaults:
- ensure: present
- shell: /bin/bash
By default virtual user resources are created that must then be realized. To create real resources instead (as with earlier versions of this module) use:
system::users::real: 'true'
yumgroups
Manage system package groups
Example configuration:
system::yumgroups:
'Base':
ensure: 'present'
'Console internet tools':
ensure: 'present'
'Perl Support':
ensure: 'present'
usecache: false
'Ruby Support':
ensure: 'present'
optional: true
usecache: false
Defaults:
- optional: false
- usecache: true
- schedule: daily
Note: Set 'usecache: false' if 'yum -C grouplist' does not work on your system and you are getting System::Yumgroup resources created on every Puppet run
Note: By default the yumgroup type has a 'daily' schedule to reduce the time Puppet runs take - package group changes are usually rare after the host is first set up. This means that it will run once every 24 hours. You override this by supplying your own schedule parameter - see system::schedules to create your own custom schedules.
yumrepos
Manage yum repository files under /etc/yum.repos.d
Example configuration:
system::yumrepos:
'puppetlabs-deps':
baseurl: 'http://yum.puppetlabs.com/fedora/f17/dependencies/$basearch'
descr: 'Puppet Labs Dependencies Fedora 17 - $basearch'
enabled: '1'
gpgcheck: '1'
gpgkey: 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs'
'puppetlabs-products':
baseurl: 'http://yum.puppetlabs.com/fedora/f17/products/$basearch'
descr: 'Puppet Labs Products Fedora 17 - $basearch'
enabled: '1'
gpgcheck: '1'
gpgkey: 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs'
Defaults:
- enabled: 1
- gpgcheck: 1
providers
The augeasproviders module can be an alternate provider for the host, mailalias and mounttab types.
Example configuration:
system::providers:
host: 'augeas'
mailalias: 'augeas'
mounttab: 'augeas'
Notes
-
Do not specify resources that are managed by other Puppet modules otherwise you will get conflict errors.
-
As with many default types you can often specify a 'target' parameter to specify a different configuration filename to change.
Changelog
All notable changes to this project will be documented in this file. Each new release typically also includes the latest modulesync defaults. These should not affect the functionality of the module.
v0.8.2 (2018-09-09)
Closed issues:
- RHEL 7 mismatching dependencies and lookup failure #43
Merged pull requests:
- allow puppetlabs/concat 5.x and herculesteam/augeasproviders 2.x #54 (bastelfreak)
- allow puppetlabs/stdlib 5.x #52 (bastelfreak)
- Remove docker nodesets #49 (bastelfreak)
- drop EOL OSs; fix puppet version range #47 (bastelfreak)
v0.8.1 (2018-03-29)
Merged pull requests:
- Bump puppet dependency to minimum supported version 4.10.0 #45 (bastelfreak)
- Fix changelog and update README with VP badges etc #36 (alexjfisher)
v0.8.0 (2017-10-15)
Closed issues:
- system::files #11
Merged pull requests:
- fix typo in .sync.yml #32 (bastelfreak)
- Stop using meta parameter as a variable #24 (ianlunam)
- add options into the resolver configuration #21 (skroes)
- Allow the use of 3rd party ntp modules #19 (level99)
- Small fixes for system::selbooleans #18 (MasonM)
- Add OS limitation to README.md #14 (marcw)
- Don't require ipaddress and netmask if DHCP is enabled #12 (MasonM)
v0.7.4 (2013-09-22)
-
Documentation fixes
-
Script to generate hiera network config on an existing host
-
Change dependency from ripienaar/concat to puppetlabs/concat (thanks #eshkay)
v0.7.3 (2013-03-19)
-
Enable files to be created from ERB templates
-
Only apply SELinux boolean changes if SELinux is enabled
-
Manage simple mail smart host configuration (initially just Postfix). Mail aliases are now set under 'mail' instead of a separate 'mailaliases'.
-
Do not try to set a MAC address on a virtual interface. Instead make virtual interfaces dependent on their parents (#3 thanks eglis).
-
Added basic IPv6 support (#2 thanks eglis)
v0.7.2 (2013-02-19)
-
Realize groups before users so that user primary groups exist when the user is created.
-
Make 'include system' work again (#1 thanks mkm85) by avoiding mandatory parameters in network and adding checks instead.
-
Do not restart the network service when config file changes are made as this sometimes causes issues (like the default route going missing). This should be fixed in a later release but for now the network service must be manually restarted.
v0.7.1 (2013-02-13)
-
Added ldif2users script to create user/group config from an LDAP export
-
Fixed bugs in user and group realize preventing hiera data lookup from working and fixed silly typos in routes.pp
v0.7.0 (2013-02-11)
- By default virtual user and group resources are now created that must then be realized rather than real resources as before. This allows all of the user and group configuration to be added to a common part of the hiera hierarchy but only the relevent users and groups created on each host.
To create real resources instead (and make things work as they did with earlier versions of this module) use:
system::users::real: 'true'
system::groups::real: 'true'
-
Added support for basic networking: set hostname, enable/disable zeroconf/IPv6, set the default route, configure interfaces and their static routes, configure nameserver resolvers and domains
-
Manage NTP servers in /etc/ntp.conf
v0.6.3 (2013-02-11)
- Added support for managing SELinux booleans
v0.6.2 (Never released)
-
Facts that have array values now create multiple facts with the array index as a suffix. For example:
system::facts: software: [ 'jboss', 'httpd' ]
creates the facts:
software0: 'jboss'
software1: 'httpd'
v0.6.1 (2013-01-26)
-
Set custom facts using the facter_dot_d Facter plugin that loads facts from /etc/facter/facts.d. Set 'system::facts::cleanold: true' to remove facts from the old locations under /etc/profile.d and in /etc/sysconfig/puppet.
-
Facts can now be set by running scripts - see example.yaml.
v0.6.0 (2013-01-25)
-
Refactoring to make it easier to use without hiera (ie. just as parameterised classes).
-
Added support for schedules so that configuration does not need to be applied with every Puppet run. All classes other than system::providers and system::schedules can be configured with a default schedule, including the system class itself. An 'always' schedule is provided in addition to the default schedules available (eg. hourly, daily, weekly).
-
Changed the yumgroup type to have a default 'daily' schedule to reduce the time Puppet runs take - package group changes are usually rare after the host is first set up. Users can override this by supplying their own schedule.
-
Documented that particular system classes can be excluded when doing 'include system' by setting their default schedule to 'never' which is useful when testing or debugging issues or just to prevent config lower in the hierarchy from being applied.
-
Added support for the augeas type to enable simple configuration file changes to be made without writing new classes
-
Use augeas to make sysconfig file changes as it is more reliable. One limitation is that all values are now unquoted so they can't have any whitespace. This only appears to potentially affect system::sysconfig::puppet puppet-extra_opts.
v0.5.3 (2013-01-06)
-
Added 'crontabs' to create user crontab entries
-
Added 'execs' to run idempotent external commands
v0.5.2 (2012-12-21)
-
limits: Fixed examples to show changes due to multiple entry support
-
Actually fix the typo in mounts.pp preventing it from working!
-
mounts: Updated example to show an NFS share
-
example.yaml: Added files examples
-
sysctl: Added a note to quote numeric values to avoid "can't convert Fixnum into String" errors
-
yumgroups: added a usecache option for when 'yum -C grouplist' does not work
v0.5.1 (2012-12-21)
-
Added 'files' to create directories and populate the content of files. The initial reason was to create mount points for NFS shares.
-
Fixed typo in mounts.pp preventing it from working.
-
Run 'mounts' in the last stage so that any required users, groups and mount points can be created first.
-
Require augeasproviders > 0.5.1 to get bug fix for problems running under 'puppet apply'.
-
Require limits > 0.3.1 as this allows more than one entry per user or group.
* This Changelog was automatically generated by github_changelog_generator
Dependencies
- puppetlabs-stdlib (>= 4.13.1 < 6.0.0)
- puppetlabs-concat (>= 2.2.1 < 6.0.0)
- erwbgy-limits (>= 0.3.1 < 1.0.0)
- erwbgy-ntp (>= 0.7.1 < 1.0.0)
- herculesteam-augeasproviders (>= 0.5.1 < 3.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.