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, 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, 2016.4.x
- Puppet >= 4.10.0 < 9.0.0
- SmartOS, , , DragonFly, OpenBSD , , , , , ,
Start using this module
Add this module to your Puppetfile:
mod 'ssm-munin', '0.5.0'
Learn more about managing modules with a PuppetfileDocumentation
Puppet module ssm-munin
Overview
Configure munin master, node and plugins.
Module Description
This module installs the munin master using the munin::master
class, munin
node using the munin::node
class, and can install, configure and manage munin
plugins using the munin::plugin
defined type.
Munin nodes are automatically exported by the munin nodes, and collected on the munin master. (Requires puppetdb)
Setup
Add the Classify all nodes with munin::node
, and classify at least one node
with munin::master
. Use the munin::plugin
defined type to control plugin
installation and configuration.
Setup requirements
Munin should be available in most distributions. For RedHat OS Family, you need to install the EPEL source.
The munin::master
class does not manage any web server configuration. The
munin package installed might add some.
If your munin master is not on the same host as the munin node, you need to use
the allow
parameter on the munin::node
class.
Usage
On each node, include the munin::node
class. This will install munin-node,
and export a node definition to the Puppet DB that puppet will collect on the
munin server.
Use the allow
parameter to permit the munin server to connect. In this
example, 192.0.2.1
and 2001:db8::1
are the IP addresses of the munin
server.
class {'munin::node':
allow => ['192.0.2.1', '2001:db8::1'],
}
On the munin server, include the munin::master
class. This will collect the
node definitions from Puppet DB and configure munin to connect to nodes to
collect metrics.
To define additional nodes to collect metrics from, use the
munin::master::node_definition
defined resource type.
You can define a set of node definitions for the node_definitions
parameter
to the munin::master
class. Defined in Hiera with YAML it may look something
like this:
---
munin::master::node_definitions:
foo.example.com:
address: 192.0.2.12
bar.example.com:
address: 192.0.2.13
config:
- load.graph_future 30
- load.load.trend yes
- load.load.predict 86400,12
For advanced usage and additional examples, see the ssm-munin reference.
Reference
Table of Contents
Classes
Public Classes
munin::master
: configure a munin mastermunin::node
: configure a munin node
Private Classes
munin::master::collect
: Helper class to collect the exported munin nodes.munin::node::export
: Helper class to export the munin node.
Defined types
munin::master::node_definition
: Configure information about a munin node on the munin mastermunin::plugin
: Install and configure munin plugins
Classes
munin::master
The munin master will install munin, and collect all exported munin node definitions as files into /etc/munin/munin-conf.d/.
Examples
Basic usage
include munin::master
With TLS
class { 'munin::master':
tls => 'enabled',
tls_certificate => '/path/to/tls/certificate',
tls_private_key => '/path/to/tls/key',
}
Parameters
The following parameters are available in the munin::master
class:
node_definitions
host_name
graph_strategy
html_strategy
config_root
file_group
collect_nodes
dbdir
htmldir
rundir
logdir
package_name
tls
tls_certificate
tls_private_key
tls_verify_certificate
extra_config
node_definitions
Data type: Hash
A hash of node definitions used by create_resources to make static node definitions.
host_name
Data type: Stdlib::Host
A host name for this munin master, matched with munin::node::mastername for collecting nodes. Defaults to $::fqdn
This is used for collecting munin::master::node_definition resources exported by nodes using the munin::node class.
graph_strategy
Data type: Enum['cgi', 'cron']
Controls if munin-graph graphs all services ('cron') or if graphing is done by munin-cgi-graph (which must configured seperatly)
html_strategy
Data type: Enum['cgi', 'cron']
Controls if munin-html will recreate all html pages every run interval ('cron') or if html pages are generated by munin-cgi-graph (which must configured seperatly). Defaults to "cgi".
config_root
Data type: Stdlib::Absolutepath
The root directory of the munin master configuration. Default: /etc/munin on most platforms.
file_group
Data type: String
The group name for configuration file permissions.
collect_nodes
Data type: Enum['enabled', 'disabled', 'mine', 'unclaimed']
Controls which nodes to collect.
'enabled' (default) makes the munin master collect all exported node_definitions.
'disabled' disables collection.
'mine' makes the munin master collect nodes matching the $host_name parameter.
'unclaimed' makes the munin master collect nodes not tagged with a host name.
This is used for collecting munin::master::node_definition resources exported by nodes using the munin::node class.
dbdir
Data type: Optional[Stdlib::Absolutepath]
Path to the munin dbdir, where munin stores everything.
htmldir
Data type: Optional[Stdlib::Absolutepath]
Path to where munin will generate HTML documents and graphs, used if graph_strategy is cron.
rundir
Data type: Optional[Stdlib::Absolutepath]
Path to directory munin uses for pid and lock files.
logdir
Data type: Optional[Stdlib::Absolutepath]
Path to directory munin uses for log files.
package_name
Data type: Variant[String,Array[String]]
The package name used for installing the munin master.
tls
Data type: Enum['enabled', 'disabled']
Controls the use of TLS globally for master to node communications. Default 'disabled'.
tls_certificate
Data type: Stdlib::Absolutepath
Path to a file containing a TLS certificate. No default. Required if tls is enabled.
tls_private_key
Data type: Stdlib::Absolutepath
Path to a file containing a TLS key. No default. Required if tls is enabled.
tls_verify_certificate
Data type: Enum['yes','no']
If TLS is used, verify the certificate. Defaults to 'yes'.
extra_config
Data type: Array[String]
Extra lines of config to put in munin.conf.
munin::node
Configure a munin node, and export configuration a munin master can collect.
List of IPv4 and IPv6 addresses and networks to allow remote munin masters to connect. By default, the munin node only permits connections from the local host.
Examples
Basic usage
include munin::node
Permitting a remote munin server to connect
class {'munin::node':
allow => ['192.0.2.1', '2001:db8::1'],
}
Parameters
The following parameters are available in the munin::node
class:
allow
config_root
nodeconfig
host_name
log_dir
log_file
log_destination
purge_configs
syslog_facility
export_node
masterconfig
mastername
mastergroup
plugins
address
bind_address
bind_port
package_name
service_name
service_ensure
file_group
timeout
plugin_share_dir
allow
Data type: Array
config_root
Data type: Stdlib::Absolutepath
Root directory for munin configuration.
nodeconfig
Data type: Array
List of lines to append to the munin node configuration.
host_name
Data type: Stdlib::Host
The host name munin node identifies as. Defaults to the $::fqdn fact.
log_dir
Data type: Stdlib::Absolutepath
The log directory for the munin node process. Defaults change according to osfamily, see munin::params::node for details.
log_file
Data type: String
File name for the log file, this is appended to "log_dir". Defaults to "munin-node.log".
log_destination
Data type: Enum['file','syslog']
Configures the log destination. Defaults to "file". If set to "syslog", the "logfile" and "log_dir" parameters are ignored, and the "syslog*" parameters are used if set.
purge_configs
Data type: Boolean
Removes all munin plugins and munin plugin configuration files not managed by Puppet. Defaults to false.
syslog_facility
Data type:
Optional[
Variant[
Integer[0,23],
Enum[
'kern','user','mail','daemon','auth','syslog','lpr','news','uucp',
'authpriv','ftp','cron','local0','local1','local2','local3','local4',
'local5','local6','local7'
]]]
Defaults to undef, which makes munin-node use the perl Net::Server module default of "daemon". Possible values are any syslog facility by number, or lowercase name.
export_node
Data type: Enum['enabled','disabled']
Causes the node config to be exported to puppetmaster. Defaults to "enabled".
This is used for exporting a munin::master::node_definition, to be collected by a node with munin::master.
masterconfig
Data type: Array
List of configuration lines to append to the munin master node definition.
This is used for exporting a munin::master::node_definition, to be collected by a node with munin::master.
mastername
Data type: Optional[Stdlib::Host]
The name of the munin master server which will collect the node definition.
This is used for exporting a munin::master::node_definition, to be collected by a node with munin::master.
mastergroup
Data type: Optional[String]
The group used on the master to construct a FQN for this node. Defaults to "", which in turn makes munin master use the domain. Note: changing this for a node also means you need to move rrd files on the master, or graph history will be lost.
This is used for exporting a munin::master::node_definition, to be collected by a node with munin::master.
plugins
Data type: Hash
A hash used by create_resources to create munin::plugin instances.
address
Data type: String
The address used in the munin master node definition.
bind_address
Data type: Variant[Enum['*'],Stdlib::Host]
The IP address the munin-node process listens on. Defaults: *.
bind_port
Data type: Stdlib::Port
The port number the munin-node process listens on.
package_name
Data type: String
The name of the munin node package to install.
service_name
Data type: String
The name of the munin node service.
service_ensure
Data type: Enum['running','stopped']
Used as parameter "ensure" for the munin node service.
file_group
Data type: String
The UNIX group name owning the configuration files, log files, etc.
timeout
Data type: Optional[Integer[0]]
Set the global plugin runtime timeout for this node. Defaults to undef, which lets munin-node use its default of 10 seconds.
Default value: $munin::params::node::timeout
plugin_share_dir
Data type: Stdlib::Absolutepath
Defined types
munin::master::node_definition
This will add configuration for the munin master to connect to a munin node, and ask for data from its munin plugins.
The resource title is used as the munin FQN, or "fully qualified name". This defines the node name and group. It is common to use the host's fully qualified domain name, where the domain name will be implicitly used as the node group.
Note: By default, using munin::node on a node will create a export a munin::master::node_definition to PuppetDB. The node classified with munin::master will collect all these exported instances.
Examples
A minimal, static node definition
munin::master::node_definition { 'foo.example.com':
address => '192.0.2.1',
}
A node definition with configuration
munin::master::node_definition { 'bar.example.com':
address => '192.0.2.2',
config => [ 'load.graph_future 30',
'load.load.trend yes',
'load.load.predict 86400,12' ],
}
Using a group in the FQN
munin::master::node_definition { 'webservers;web01.example.com':
address => '192.0.2.3',
}
Parameters
The following parameters are available in the munin::master::node_definition
defined type:
address
Data type: String
The address of the munin node. A hostname, an IP address, or a ssh:// uri for munin-async node.
mastername
Data type: Optional[String]
The name of the munin master server which will collect the node definition. This is used when exporting and collecting munin::master::node_definition resources between hosts.
Default value: ''
config
Data type: Array[String]
An array of configuration lines to be added to the node definition.
Default value: []
fqn
Data type: String
The Munin FQN (Fully Qualified Name) of the node. This should be 'hostname', 'group;hostname', 'group;subgroup;hostname').
If a group is not set, munin will by default use the domain of the node as a group, if the node name is a fully qualified host name.
The title of the defined resource should be a munin FQN. See the "fqn" parameter
Default value: $title
munin::plugin
Install and configure munin plugins
Examples
Activate a packaged plugin
munin::plugin { 'cpu':
ensure => link,
}
Activate a packaged wildcard plugin
munin::plugin { 'foo_bar':
ensure => link,
target => 'foo_',
}
Install and activate a plugin
munin::plugin { 'gazonk':
ensure => present,
source => 'puppet:///modules/profile/foo/monitoring/gazonk',
}
A plugin with configuration
munin::plugin { 'bletch':
ensure => link,
config => ['env.database thing', 'user bletch'],
}
A plugin configuration file, but no plugin
munin::plugin { 'slapd':
config => ['env.rootdn cn=admin,dc=example,dc=org'],
config_label => 'slapd_*',
}
Parameters
The following parameters are available in the munin::plugin
defined type:
ensure
Data type: Enum['','present','absent','link']
The ensure parameter is mandatory for installing a plugin.
With "ensure => link", a symlink is created in the munin plugin directory to where the plugin file is installed.
With "ensure => present", the plugin is installed in the munin plugin directory, and the "source" or "content" parameter is required to provide a source for the plugin.
With "ensure => absent", remove the munin plugin.
When ensure is not set, a plugin will not be installed, but extra plugin configuration can be managed with the config and config_label parameters.
Default value: ''
source
Data type: Optional[String]
When ensure => present, path to a source file
Default value: undef
content
Data type: Optional[String[1]]
When ensure => present, content of the plugin.
Default value: undef
checksum
Data type: Optional[String[1]]
Checksum type for the plugin file.
Default value: undef
checksum_value
Data type: Optional[String[1]]
Checksum value for the plugin file.
Default value: undef
target
Data type: String
When "ensure => link", Add a link in the plugin directory to the link target.
If target is an absolute path (starts with "/") it is used directly.
If target is a relative path, $munin::node::plugin_share_dir is prepended.
If target is unset, a link is created to a plugin with the same name in the packaged $munin::node:: plugin_share_dir directory. (In other words, activate a plugin that is already installed)
Default value: ''
config
Data type: Optional[Array[String]]
Lines for the munin plugin config.
Default value: []
config_label
Data type: String
Label for munin plugin config
Default value: $title
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.5.0] - 2024-09-16
Added
- Support Munin master on OpenBSD using 'munin-server' (Pull request #76)
Fixed
- Fix collect_nodes=mine and collect_nodes=unclaimed (Bug #70) (Pull request #78)
- Fix variable lookup method (Pull request #77)
0.4.0 - 2022-04-21
Fixed
- Fix hiera lookup invocation syntax (#75)
- Fix TLS configuration (#74)
- Fix Archlinux hiera data file name (#72)
Added
- Add parameters
content
,checksum
andchecksum_value
to themunin::plugin
define. (#73)
0.3.0 - 2020-06-29
Changed
- Replaced params classes with module hieradata.
- Replaced function based parameter validation with Puppet Types.
- Require
puppetlabs/stdlib
version4.25.0
to support the types used. - Allow
puppetlabs/stdlib
< 7.0.0
. - Allow Puppet version
< 7.0.0
. - Changed parameter
munin::plugin::config
default value fromundef
to[]
. - Converted some templates from
erb
toepp
.
Added
- New parameter
munin::master::node_definition::fqn
. This is the namevar for the defined type, and will default to the value of the title. - Added support for osfamily RedHat version 8
- Added Puppet Strings documentation
Deprecated
- Module is no longer supported on Puppet versions before 4.10.0
- Module is no longer supported on osfamily RedHat version 5
- Module is no longer supported on osfamily RedHat version 6
- Module is no longer supported on Ubuntu 14.04
0.2.0 - 2019-03-03
Added
- Support for DragonFly BSD (#46)
- Support for FreeBSD as master (#46)
- Export additional nodes with
munin::node::export::node_definitions
ifmunin::node::export_node
is enabled. (#44) - New parameter
munin::master::package_name
- New parameter
munin::master::file_group
- New parameter
munin::master::config_root
Changed
- Support puppet 4 and newer. (#49)
- Scaffolding updated with PDK 1.9.0
Fixed
- Support for Arch Linux (#53)
- Fixed bug with parameter
munin::master::node_definitions
Deprecated
- Module is no longer tested with Puppet 3.x and 2.x
- Module is no longer tested on Ruby < 2.1.9
0.1.0 - 2015-12-12
- Added support for Archlinux (#40)
- Added acceptance tests
- Added CONTRIBUTING.md for how to contribute to the module (#41)
- Document all parameters in README.md
munin::node
- Two new parameters: bind_address and bind_port (#37)
- Bugfix: Rescue InvalidAddressError only if ruby is capable (#38)
contributors
Contributors to this release: David Hayes, Julien Pivotto, Stig Sandbeck Mathisen, Victor Engmark
0.0.10 - 2015-08-01
- Bugfix: Add missing dependency for the "munin-node" package when $munin::node::purge_configs is true. (#34)
Contributors to this release: Martin Meinhold
0.0.9 - 2015-07-29
-
Bugfix: The mastergroup, if used in the node's FQN (Fully Qualified Name), should no longer be empty on Puppet 4.0. (#27)
-
Bugfix: Using munin::master and munin::node with export and collect disabled should no longer trigger warnings about missing storeconfigs. (#30, #33)
munin::master
- Add FreeBSD support.
munin::node
-
New feature: Log to syslog with the "log_destination" and "syslog_facility" parameters. (#23, #24, #25)
-
New feature: Set the plugin runtime timeout with the "timeout" parameter. (#29, #32)
-
New feature: Purge unmanaged plugins and plugin configuration with the "purge_configs" parameter. (#28, #31)
0.0.8 - 2015-02-06
Support the future parser.
Contributors to this release: Rike-Benjamin Schuppner, Stig Sandbeck Mathisen
0.0.7 - 2014-12-05
This release adds support for DragonFly BSD, FreeBSD, OpenBSD.
Other changes listed below, per component.
Contributors to this release: Alex Hornung, Chris Roddy, Frank Groeneveld, Fredrik Thulin, Julien Pivotto, Martin Jackson, Sebastian Wiesinger, Stig Sandbeck Mathisen
munin::node
-
Add "host_name" parameter to override the host name of the munin node.
-
Add "file_group" parameter, used for configuration and log files.
-
Add "log_dir" parameter.
-
Improved handling of "allow" ACL parameter.
munin::master
-
Improved collection logic. Set "collect_nodes" to "mine" to collect nodes which are targeted for this master, or "unclaimed" to pick up nodes not aimed a specific master.
-
Add global tls_* parameters for connecting to nodes.
-
Add "dbdir", "htmldir", "rundir" parameters.
-
Add "extra_config" parameter, which takes an array of extra configuration lines for munin.conf.
munin::plugin
- Support absolute paths as target for a plugin.
0.0.6 - 2014-12-05
- Retracted, had a breaking bug on older (3.4.x) puppet versions.
0.0.5 - 2014-03-19
-
Support multiple masters with different nodes (Thanks: Cristian Gae)
-
Support older (1.4.6) munin versions (Thanks: Sergio Oliveira)
-
Update for compatibility with puppet 3.4 (Thanks: Harald Skoglund)
-
Easier configuration with more parameters. All parameters have trivial validation.
munin::master
- new parameter "config_root". Defaults should match supported operating systems.
munin::plugin
- new parameter "config_root". Defaults should match supported operating systems.
munin::node
-
new parameter "address". Default is $::fqdn. This will be used as the "address" when registering with the munin master.
-
new parameter "config_root". Defaults should match supported operating systems.
-
new parameter "package_name". Default should match supported operating systems.
-
new parameter "service_name". Default should match supported operating systems.
-
new parameter "service_ensure". Default is "". Possible values: "", "running" or "stopped".
munin::params
- new class
0.0.4 - 2013-08-13
Bugfix for the munin::plugin define.
-
Bugfix: Ensure that we can run tests on ruby 1.8.
-
Bugfix: No longer requires the class
Munin::Plugins
, which does not exist in this module. (#3) -
The
ensure
attribute no longer defaults to "link". If not set, a potentially existing plugin with the same name is not touched. -
Plugin and configuration directories are now configurable.
-
Improved rspec tests, which now actually match the documentation.
0.0.2 - 2013-06-31
A few pull requests
-
Bugfix: Install munin package before creating munin-conf.d directory (#1)
-
Make graph strategy configurable (#2)
-
Improve documentation
0.0.1 - 2013-06-02
Initial release
Dependencies
- puppetlabs/stdlib (>= 4.25.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.