Version information
This version is compatible with:
- Puppet Enterprise 2023.8.x, 2023.7.x, 2023.6.x, 2023.5.x, 2023.4.x, 2023.3.x, 2023.2.x, 2023.1.x, 2023.0.x, 2021.7.x, 2021.6.x, 2021.5.x, 2021.4.x, 2021.3.x, 2021.2.x, 2021.1.x, 2021.0.x
- Puppet >= 7.0.0 < 9.0.0
- Archlinux, , , , , , , ,
Start using this module
Add this module to your Puppetfile:
mod 'theforeman-dhcp', '9.2.0'
Learn more about managing modules with a PuppetfileDocumentation
DHCP module for Puppet
DHCP module for theforeman. Based on original DHCP module by ZLeslie, thanks to him for the original work.
Installs and manages a DHCP server.
Dependencies
Features
- Multiple subnet support
- Support for multiple pools within a subnet
- Host reservations
- Secure dynamic DNS updates when combined with Bind
- Failover support
Usage
Define the server and the zones it will be responsible for.
class { 'dhcp':
dnsdomain => [
'dc1.example.net',
'1.0.10.in-addr.arpa',
],
nameservers => ['10.0.1.20'],
interfaces => ['eth0'],
dnsupdatekey => "/etc/bind/keys.d/$ddnskeyname",
require => Bind::Key[ $ddnskeyname ],
pxeserver => '10.0.1.50',
pxefilename => 'pxelinux.0',
}
dhcp::pool
To create a subnet with a single pool, use dhcp::pool.
Define the pool attributes
dhcp::pool{ 'ops.dc1.example.net':
network => '10.0.1.0',
mask => '255.255.255.0',
range => '10.0.1.100 10.0.1.200',
gateway => '10.0.1.1',
}
Override global attributes with pool specific
dhcp::pool{ 'ops.dc1.example.net':
network => '10.0.1.0',
mask => '255.255.255.0',
range => '10.0.1.100 10.0.1.200',
gateway => '10.0.1.1',
nameservers => ['10.0.1.2', '10.0.2.2'],
pxeserver => '10.0.1.2',
}
For the support of static routes (RFC3442):
dhcp::pool{ 'ops.dc1.example.net':
network => '10.0.1.0',
mask => '255.255.255.0',
range => '10.0.1.100 10.0.1.200',
gateway => $gw,
static_routes => [ { 'mask' => '32', 'network' => '169.254.169.254', 'gateway' => $ip },
{ 'mask' => '0', 'gateway' => $gw } ],
}
dhcp::subnet
To create a subnet with multiple pools, use dhcp::subnet.
dhcp::subnet{ 'ops.dc1.example.net':
network => '10.0.1.0',
mask => '255.255.255.0',
pools => [
{
range => '10.0.1.101 10.0.1.110',
parameters => [
'allow members of "group1"',
'next-server 10.1.1.1',
],
},
{
range => '10.0.1.111 10.0.1.120',
parameters => [
'allow members of "group2"',
'next-server 10.1.1.2',
],
},
],
gateway => '10.0.1.1',
}
dhcp::host
Create host reservations.
dhcp::host {
'server1': mac => "00:50:56:00:00:01", ip => "10.0.1.51";
'server2': mac => "00:50:56:00:00:02", ip => "10.0.1.52";
'server3': mac => "00:50:56:00:00:03", ip => "10.0.1.53";
}
Contributors
Original authors:
- Zach Leslie zach.leslie@gmail.com
- Ben Hughes git@mumble.org.uk
- Greg Sutcliffe greg.sutcliffe@gmail.com
Copyright (c) 2010-2016 Zach Leslie, Ben Hughes, Greg Sutcliffe, Foreman developers
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
https://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.
Reference
Table of Contents
Classes
Public Classes
dhcp
: Manage an ISC DHCP serverdhcp::disable
: Remove and Disable the DHCP serverdhcp::failover
: Define a failover peer
Private Classes
dhcp::params
: Default parameters
Defined types
dhcp::dhcp_class
: Define a DHCP classdhcp::host
: Define a DHCP host reservationdhcp::pool
: Define a DHCP pooldhcp::subnet
: Define a DHCP subnet
Data types
Dhcp::DhcpPool
: Define a DHCP pool inside a DHCP configuration blockDhcp::Macaddress
Dhcp::Range
Dhcp::StaticRoute
Classes
dhcp
Manage an ISC DHCP server
Parameters
The following parameters are available in the dhcp
class:
option_static_route
dnsdomain
nameservers
failover
bootp
ntpservers
interfaces
interface
default_lease_time
max_lease_time
dnskeyname
dnsupdatekey
dnsupdateserver
omapi
omapi_name
omapi_algorithm
omapi_key
pxeserver
pxefilename
ipxe_filename
mtu
bootfiles
logfacility
dhcp_monitor
dhcp_dir
manage_dhcp_dir
conf_dir_mode
packagename
servicename
options
authoritative
dhcp_root_user
dhcp_root_group
ddns_updates
ddns_domainname
ddns_rev_domainname
ddns_update_style
client_updates
subnets
pools
hosts
includes
config_comment
option_static_route
Data type: Boolean
When enabled it sets the options rfc3442-classless-static-routes and ms-classless-static-routes
Default value: false
dnsdomain
Data type: Array[String]
Default value: $dhcp::params::dnsdomain
nameservers
Data type: Array[String]
Default value: []
failover
Data type: Boolean
Default value: false
bootp
Data type: Optional[Boolean]
Default value: undef
ntpservers
Data type: Array[String]
Default value: []
interfaces
Data type: Optional[Array[String]]
Default value: undef
interface
Data type: String
Default value: 'NOTSET'
default_lease_time
Data type: Integer[0]
Default value: 43200
max_lease_time
Data type: Integer[0]
Default value: 86400
dnskeyname
Data type: String
Default value: 'rndc-key'
dnsupdatekey
Data type: Optional[String]
Default value: undef
dnsupdateserver
Data type: Optional[String]
Default value: undef
omapi
Data type: Boolean
Default value: true
omapi_name
Data type: Optional[String]
Default value: undef
omapi_algorithm
Data type: String
Default value: 'HMAC-MD5'
omapi_key
Data type: Optional[String]
Default value: undef
pxeserver
Data type: Optional[String]
Default value: undef
pxefilename
Data type: String
Default value: $dhcp::params::pxefilename
ipxe_filename
Data type: Optional[String]
Default value: undef
mtu
Data type: Optional[Integer[0]]
Default value: undef
bootfiles
Data type: Hash[String, String]
Default value: $dhcp::params::bootfiles
logfacility
Data type: String
Default value: 'local7'
dhcp_monitor
Data type: Boolean
Default value: true
dhcp_dir
Data type: Stdlib::Absolutepath
Default value: $dhcp::params::dhcp_dir
manage_dhcp_dir
Data type: Boolean
Default value: $dhcp::params::manage_dhcp_dir
conf_dir_mode
Data type: Optional[Stdlib::Filemode]
Default value: $dhcp::params::conf_dir_mode
packagename
Data type: String
Default value: $dhcp::params::packagename
servicename
Data type: String
Default value: $dhcp::params::servicename
options
Data type: Variant[Array[String], Optional[String]]
Default value: undef
authoritative
Data type: Boolean
Default value: false
dhcp_root_user
Data type: String
Default value: 'root'
dhcp_root_group
Data type: String
Default value: $dhcp::params::root_group
ddns_updates
Data type: Boolean
Default value: false
ddns_domainname
Data type: Optional[String]
Default value: undef
ddns_rev_domainname
Data type: Optional[String]
Default value: undef
ddns_update_style
Data type: Enum['none', 'interim', 'standard']
Default value: 'interim'
client_updates
Data type: Optional[Boolean]
Default value: undef
subnets
Data type: Hash[String, Hash]
Default value: {}
pools
Data type: Hash[String, Hash]
Default value: {}
hosts
Data type: Hash[String, Hash]
Default value: {}
includes
Data type: Variant[Array[String], Optional[String]]
Default value: undef
config_comment
Data type: String
Default value: 'dhcpd.conf'
dhcp::disable
Remove and Disable the DHCP server
dhcp::failover
Define a failover peer
Parameters
The following parameters are available in the dhcp::failover
class:
peer_address
role
address
port
max_response_delay
max_unacked_updated
mclt
load_split
load_balance
omapi_key
max_unacked_updates
peer_address
Data type: String
The address of the failover peer.
role
Data type: Enum['primary', 'secondary']
Primary or Secondary role in DHCP failover relationship.
Default value: 'primary'
address
Data type: String
IP Address of the DHCP failover server.
Default value: $facts['networking']['ip']
port
Data type: Variant[Integer[0, 65535], String]
Port to listen for failover messages.
Default value: 519
max_response_delay
Data type: Variant[Integer[0], String]
max-response-delay in seconds before failover peer is considered failed.
Default value: 30
max_unacked_updated
max-unacked-updates before the server will wait to send additional packets to peer.
mclt
Data type: Variant[Integer[0], String]
MCLT, the maximum time a lease may be extended beyond expiration set by DHCP peer.
Default value: 300
load_split
Data type: Variant[Integer[0], String]
Load split between the DHCP servers as fraction out of 256.
Default value: 128
load_balance
Data type: Variant[Integer[0], String]
Load balance max seconds, cutoff after which load balancing is disabled.
Default value: 3
omapi_key
Data type: Optional[String]
OMAPI key to cryptographically sign traffic if OMAPI protocol is enabled.
Default value: undef
max_unacked_updates
Data type: Variant[Integer[0], String]
Default value: 10
Defined types
dhcp::dhcp_class
Define a DHCP class
Parameters
The following parameters are available in the dhcp::dhcp_class
defined type:
parameters
Data type: Variant[Array[String], String]
The parameters for the class definition. When specified as a string, it will be used verbatim with a semi colon at the end. When specified as an array, every string is used and appended with a semi colon.
dhcp::host
Define a DHCP host reservation
Parameters
The following parameters are available in the dhcp::host
defined type:
ip
Data type: String
The IP address in the reservation
mac
Data type: Dhcp::Macaddress
The host's MAC address
comment
Data type: Optional[String]
An optional comment for the host
Default value: undef
raw_append
Data type: Optional[String]
Host configuration to append as-is
Default value: undef
raw_prepend
Data type: Optional[String]
Host configuration to prepend as-is
Default value: undef
dhcp::pool
Define a DHCP pool
Parameters
The following parameters are available in the dhcp::pool
defined type:
network
mask
gateway
pool_parameters
range
failover
options
parameters
mtu
nameservers
pxeserver
pxefilename
domain_name
static_routes
search_domains
raw_append
raw_prepend
network
Data type: String
mask
Data type: String
gateway
Data type: Optional[String]
Default value: undef
pool_parameters
Data type: Variant[Array[String], Optional[String]]
Default value: undef
range
Data type: Variant[Array[Dhcp::Range], Optional[Dhcp::Range], Enum[''], Boolean]
Default value: undef
failover
Data type: Optional[String]
Default value: undef
options
Data type: Variant[Array[String], Optional[String]]
Default value: undef
parameters
Data type: Variant[Array[String], Optional[String]]
Default value: undef
mtu
Data type: Optional[Integer[0]]
Default value: undef
nameservers
Data type: Variant[Array[String], Optional[String]]
Default value: undef
pxeserver
Data type: Optional[String]
Default value: undef
pxefilename
Data type: Optional[String]
Default value: undef
domain_name
Data type: Optional[String]
Default value: undef
static_routes
Data type: Optional[Array[Dhcp::StaticRoute]]
Default value: undef
search_domains
Data type: Variant[Array[String], Optional[String]]
Default value: undef
raw_append
Data type: Optional[String]
Default value: undef
raw_prepend
Data type: Optional[String]
Default value: undef
dhcp::subnet
Define a DHCP subnet
Parameters
The following parameters are available in the dhcp::subnet
defined type:
network
mask
pools
gateway
options
parameters
mtu
nameservers
pxeserver
pxefilename
domain_name
static_routes
search_domains
raw_append
raw_prepend
network
Data type: Stdlib::IP::Address::Nosubnet
The network range (without the mask) from where IP's will be served
mask
Data type: Stdlib::IP::Address::Nosubnet
The subnet mask for our network
pools
Data type: Array[Dhcp::DhcpPool]
Specify a pool of addresses that will be treated differently than another pool of addresses, even on the same network segment or subnet.
gateway
Data type: Optional[String]
This option specifies a list of comma-separated IP addresses for routers on the client's subnet. Routers should be listed in order of preference.
Default value: undef
options
Data type: Variant[Array[String], Optional[String]]
Custom DHCP option statements DHCP option statements always start with the option keyword, followed by an option name, followed by option data. The option names and data formats are described below. It is not necessary to exhaustively specify all DHCP options - only those options which are needed by clients
Default value: undef
parameters
Data type: Variant[Array[String], Optional[String]]
Custom DHCP parameters Each element is added as a separate line
Default value: undef
mtu
Data type: Optional[Integer[0]]
This option specifies the MTU to use on this interface. The minimum legal value for the MTU is 68.
Default value: undef
nameservers
Data type: Variant[Array[String], Optional[String]]
Specifies a list of Domain Name System (STD 13, RFC 1035) name servers available to the client. Servers should be listed in order of preference.
Default value: undef
pxeserver
Data type: Optional[String]
This is used to specify the host address of the server from which the initial boot file (specified in the filename statement) is to be loaded. Server-name should be a numeric IP address or a domain name. If no next-server statement applies to a given client, the address 0.0.0.0 is used.
Default value: undef
pxefilename
Data type: Optional[String]
This can be used to specify the name of the initial boot file which is to be loaded by a client. The filename should be a filename recognizable to whatever file transfer protocol the client can be expected to use to load the file.
Default value: undef
domain_name
Data type: Optional[String]
This option specifies the domain name that client should use when resolving hostnames via the Domain Name System.
Default value: undef
static_routes
Data type: Optional[Array[Dhcp::StaticRoute]]
This option specifies a list of static routes that the client should install in its routing cache. If multiple routes to the same destination are specified, they are listed in descending order of priority.
Default value: undef
search_domains
Data type: Variant[Array[String], Optional[String]]
Specifies a ´search list´ of Domain Names to be used by the client to locate not-fully-qualified domain names. The difference between this option and historic use of the domain-name option for the same ends is that this option is encoded in RFC1035 compressed labels on the wire. For example:
Default value: undef
raw_append
Data type: Optional[String]
Partial that is appended to the dhcpd.conf (before the final }
)
Default value: undef
raw_prepend
Data type: Optional[String]
Partial that is prepended to the dhcpd.conf (after the first {
)
Default value: undef
Data types
Dhcp::DhcpPool
Define a DHCP pool inside a DHCP configuration block
- See also
- https://linux.die.net/man/5/dhcpd.conf
- More information about DHCP pools section "Address Pools"
- https://stevendiver.com/2020/02/21/isc-dhcp-failover-configuration/
- More information about failover
Alias of
Struct[{
'range' => Optional[Variant[Array[Dhcp::Range], Dhcp::Range, Enum[''], Boolean]],
Optional['failover'] => Optional[String],
Optional['parameters'] => Optional[Variant[Array[String], String]],
}]
Parameters
The following parameters are available in the Dhcp::DhcpPool
data type:
range
The range or ranges to assign IP's from
failover
Which peer to failover to
parameters
Custom parameters, added verbatim to the pool block
Dhcp::Macaddress
The Dhcp::Macaddress data type.
Alias of Pattern[/^[0-9A-Fa-f]{1,2}(:[0-9A-Fa-f]{1,2}){5}$/]
Dhcp::Range
The Dhcp::Range data type.
Alias of Pattern[/^(dynamic-bootp )?((([0-9](?!\d)|[1-9][0-9](?!\d)|1[0-9]{2}(?!\d)|2[0-4][0-9](?!\d)|25[0-5](?!\d))[.]){3}([0-9](?!\d)|[1-9][0-9](?!\d)|1[0-9]{2}(?!\d)|2[0-4][0-9](?!\d)|25[0-5](?!\d)))(\/((([0-9](?!\d)|[1-9][0-9](?!\d)|1[0-9]{2}(?!\d)|2[0-4][0-9](?!\d)|25[0-5](?!\d))[.]){3}([0-9](?!\d)|[1-9][0-9](?!\d)|1[0-9]{2}(?!\d)|2[0-4][0-9](?!\d)|25[0-5](?!\d))|[0-9]+))?( ((([0-9](?!\d)|[1-9][0-9](?!\d)|1[0-9]{2}(?!\d)|2[0-4][0-9](?!\d)|25[0-5](?!\d))[.]){3}([0-9](?!\d)|[1-9][0-9](?!\d)|1[0-9]{2}(?!\d)|2[0-4][0-9](?!\d)|25[0-5](?!\d)))(\/((([0-9](?!\d)|[1-9][0-9](?!\d)|1[0-9]{2}(?!\d)|2[0-4][0-9](?!\d)|25[0-5](?!\d))[.]){3}([0-9](?!\d)|[1-9][0-9](?!\d)|1[0-9]{2}(?!\d)|2[0-4][0-9](?!\d)|25[0-5](?!\d))|[0-9]+))?)?$/]
Dhcp::StaticRoute
The Dhcp::StaticRoute data type.
Alias of
Struct[{
'mask' => String,
'gateway' => String,
Optional['network'] => String,
}]
Changelog
9.2.0 (2024-05-16)
Implemented enhancements:
- Allow puppet/systemd 7.x #232 (evgeni)
- Add support for Debian 12 #231 (evgeni)
- Add Ubuntu 22.04 support #230 (evgeni)
9.1.0 (2023-11-14)
Implemented enhancements:
- Mark compatible with puppet/systemd 5.x & 6.x #227 (ekohl)
- allow stdlib 9.x #226 (jhoblitt)
- Add Puppet 8 support #222 (ekohl)
9.0.0 (2023-05-15)
Breaking changes:
- Drop Debian 9, Ubuntu 16.04, Fedora 31/32; Add Fedora 37/38 #220 (ekohl)
- Refs #36345 - Raise minimum Puppet version to 7.0.0 #219 (ekohl)
- debian grub2: update efi file name to align with symlink name #217 (jklare)
Implemented enhancements:
- Mark compatible with puppetlabs/concat 8.x #218 (ekohl)
- bump puppet/systemd to \< 5.0.0 #216 (jhoblitt)
Merged pull requests:
8.2.0 (2022-08-04)
Implemented enhancements:
- Update to voxpupuli-test 5 #214 (ekohl)
- Remove nameserver sorting for dhcp subnet configurations #213 (jan-win1993)
- Support CentOS 9 #209 (ekohl)
8.1.0 (2022-02-03)
Implemented enhancements:
- Add Debian 11 and Ubuntu 20.04 support #208 (ekohl)
- add support for raw configuration for host declarations. #206 (UiP9AV6Y)
- puppetlabs/stdlib: Allow 8.x #204 (bastelfreak)
- Add support for multiple pools in a subnet #164 (peterverraedt)
8.0.0 (2021-10-29)
Breaking changes:
Implemented enhancements:
Fixed bugs:
Closed issues:
- Use of notify_service requires systemd dependency version bump #201
7.0.0 (2021-07-23)
Breaking changes:
Implemented enhancements:
- Mark compatible with camptocamp/systemd 3 #190 (ekohl)
- Allow Puppet 7 compatible versions of mods #187 (ekohl)
- Support Puppet 7 #186 (ekohl)
Fixed bugs:
6.2.0 (2021-01-26)
Implemented enhancements:
6.1.0 (2020-09-22)
Implemented enhancements:
- Adjust config directory mode to the system defaults #177 (ezr-ondrej)
6.0.0 (2020-05-12)
Breaking changes:
Implemented enhancements:
Merged pull requests:
5.1.1 (2020-02-12)
Implemented enhancements:
5.1.0 (2019-10-24)
Implemented enhancements:
5.0.1 (2019-06-12)
Merged pull requests:
- allow newer puppetlabs-concat version #157 (mmoll)
- Allow
puppetlabs/stdlib
6.x #156 (alexjfisher)
5.0.0 (2019-04-15)
Breaking changes:
Implemented enhancements:
Fixed bugs:
4.3.0 (2019-01-10)
Implemented enhancements:
- update FreeBSD pkg name and support 12.x #144 (mmoll)
- Create some puppet-strings documentation #143 (ekohl)
- Support Puppet 6 #141 (ekohl)
4.2.0 (2018-10-04)
Implemented enhancements:
- Support Ubuntu/bionic, remove Debian 7 & Fedora 25 #127 (mmoll)
- make ddns-update-style adjustable #126 (zeromind)
Merged pull requests:
- allow puppetlabs-stdlib 5.x #135 (mmoll)
- allow puppetlabs-concat 5.x #134 (mmoll)
- Mark compatible with camptocamp-systemd 2.0 #131 (mateusz-gozdek-sociomantic)
4.1.1
- Correct listening on EL7 when using
$interface
4.1.0
- Make the OMAPI algorithm configurable
- Drop EOL operating systems and add new ones to metadata.json
4.0.2
- Fix listen on interfaces in EL7
- Add validation for the DHCP range
4.0.1
- Validate parameters using Puppet 4 types
4.0.0
- Drop Puppet 3 support
- Add
$omapi
, so OMAPI can be turned off - Add
$bootp
, so BOOTP can be turned off - Improve failover logic
3.1.0
- Add
$ddns_updates
parameter to allow insecure DDNS updates. - Add
$pxefilename
parameter todhcp::pool
. - Add
$raw_prepend
and$raw_append
parameters todhcp::pool
. - Fix classless static routes.
3.0.0
- Add bootfiles parameter with hash of client architectures to boot loaders used for "filename", defaulting to "pxelinux.0" (#14920)
- Add mtu parameter to main class and to dhcp::pool
- Add Arch Linux support
- Drop support for Ruby 1.8.7
- Many improvements to tests
2.3.2
- Fix metadata to show Puppet 4 compatibility
- Remove hashes around pool names for Webmin compatibility
2.3.1
- Fix domain-search syntax for multiple search domains (#70)
- Update FreeBSD package name for ISC DHCP 4.3
2.3.0
- Add dhcp::failover class to configure DHCP failover between servers
- Add includes parameter to include other config files
- Handle and ignore an empty omapi_key parameter
- Add tests for dhcp::dhcp_class
- Support Puppet 3.0 minimum
- Support Fedora 21, remove Debian 6 (Squeeze)
2.2.0
- Add pools, hosts parameters to dhcp to automatically create dhcp::pool and dhcp::host resources, usable from Hiera and Foreman
- Add ddns_domainname and ddns_rev_domainname parameters to dhcp
- Add ntpservers parameter to dhcp
- Permit the dhcp::pool range parameter to be an array of ranges
2.1.0
- Support configuration on FreeBSD
- Add options parameter for arbitrary options
- Add dhcp::class define to add new DHCP class definitions
- Add pool_parameters param to dhcp::pool for allow statements etc.
- Add authoritative parameter
- Add search_domains parameter to dhcp::pool
- Add omapi_name/omapi_key parameters
2.0.0
- Add parameters to dhcp and dhcp:pool to configure static routes
- Change theforeman-concat_native to puppetlabs-concat
- Fix quoting of domain-name option
- Test with future parser and Puppet 4
1.6.0
- Add
parameters
,options
parameters to dhcp::pool - Add
default_lease_time
,max_lease_time
parameters to dhcp - Use longer ISC defaults for lease times
- Minimising differences to puppetlabs/dhcp for eventual merger
- Do not set domain-name option if dnsdomain parameter is empty
- Strip pool config values before checking if they should be set
- Removing unused code, tidyups, better test coverage, increased linting
1.5.0
- Add nameservers parameter to dhcp::pool
- Fix config output when empty pool range is passed
1.4.0
- Add pxeserver parameter to dhcp::pool
- Unsetting pxeserver/pxefilename disables PXE in a subnet
- Add tests, fix lint and style issues
1.3.1
- Change Debian package name to prevent reinstallation on each run
- Fix puppet-lint issues
* This Changelog was automatically generated by github_changelog_generator
Dependencies
- puppet/systemd (>= 3.1.0 < 8.0.0)
- puppetlabs/concat (>= 1.0.0 < 10.0.0)
- puppetlabs/stdlib (>= 4.18.0 < 10.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.