Version information
This version is compatible with:
- Puppet Enterprise 2017.2.x, 2017.1.x, 2016.5.x, 2016.4.x
- Puppet >= 4.7.0 < 5.0.0
- , , , , ,
Start using this module
Add this module to your Puppetfile:
mod 'puppet-splunk', '6.1.0'
Learn more about managing modules with a PuppetfileDocumentation
Splunk module for Puppet
Table of Contents
- Overview
- Module Description - What the module does and why it is useful
- Setup - The basics of getting started with splunk
- Usage - Configuration options and additional functionality
- Reference - An under-the-hood peek at what the module is doing and how
- Limitations - OS compatibility, etc.
- Development - Guide for contributing to the module
Overview
This module provides a method to deploy Splunk Server or Splunk Universal Forwarder with common configurations and ensure the services maintain a running state. It provides types/providers to interact with the various Splunk/Forwarder configuration files.
Module Description
This module does not configure firewall rules. Firewall rules will need to be configured separately in order to allow for correct operation of Splunk and the Splunk Universal Forwarder. Additionally, this module does not supply Splunk or Splunk Universal Forwarder installation media. Installation media will need to be aquired seperately, and the module configured to use it. Users can use yum or apt to install these components if they're self-hosted.
Setup
What splunk affects
- Installs the Splunk/Forwarder package and manages their config files. It does not purge them by default.
- The module will set up both Splunk and Splunkforwarder to run as the 'root' user on POSIX platforms.
Setup Requirements
To begin using this module, use the Puppet Module Tool (PMT) from the command line to install this module:
puppet module install puppet-splunk
This will place the module into your primary module path if you do not utilize the --target-dir directive.
You can also use r10k or code-manager to deploy the module so ensure that you have the correct entry in your Puppetfile.
Once the module is in place, there is just a little setup needed.
First, you will need to place your downloaded splunk installers into the files
directory, <module_path>/splunk/files/
. If you're using r10k or code-manager
you'll need to override the splunk::params::src_root
parameter to point at a
modulepath outside of the Splunk module because each deploy will overwrite the
files.
The files must be placed according to directory structure example given below.
The expected directory structure is:
`-- files
|-- splunk
| `-- $platform
| `-- splunk-${version}-${build}-${additl}
`-- universalforwarder
`-- $platform
`-- splunkforwarder-${version}-${build}-${additl}
A semi-populated example files directory might then contain:
`-- files
|-- splunk
| `-- linux
| |-- splunk-6.3.3-f44afce176d0-linux-2.6-amd64.deb
| |-- splunk-6.3.3-f44afce176d0-linux-2.6-intel.deb
| `-- splunk-6.3.3-f44afce176d0-linux-2.6-x86_64.rpm
`-- universalforwarder
|-- linux
| |-- splunkforwarder-6.3.3-f44afce176d0-linux-2.6-amd64.deb
| |-- splunkforwarder-6.3.3-f44afce176d0-linux-2.6-intel.deb
| `-- splunkforwarder-6.3.3-f44afce176d0-linux-2.6-x86_64.rpm
|-- solaris
| `-- splunkforwarder-6.3.3-f44afce176d0-solaris-9-intel.pkg
`-- windows
|-- splunkforwarder-6.3.3-f44afce176d0-x64-release.msi
`-- splunkforwarder-6.3.3-f44afce176d0-x86-release.msi
Second, you will need to supply the splunk::params
class with three critical
pieces of information.
- The version of Splunk you are using
- The build of Splunk you are using
- The root URL to use to retrieve the packages
In the example given above, the version is 6.3.3, the build is f44afce176d0, and the root URL is puppet:///modules/splunk. See the splunk::params class documentation for more information.
Beginning with splunk
Once the Splunk packages are hosted in the users repository or hosted by the Puppet Server in the modulepath the module is ready to deploy.
Usage
If a user is installing Splunk with packages provided from their modulepath, this is the most basic way of installing Splunk Server with default settings:
include ::splunk
This is the most basic way of installing the Splunk Universal Forwarder with default settings:
class { '::splunk::params':
server => $my_splunk_server,
}
include ::splunk::forwarder
Once both Splunk and Splunk Universal Forwarder have been deployed on their respective nodes, the Forwarder is ready to start sending logs.
In order to start sending some log data, users can take advantage of the
Splunkforwarder_input
type. Here is a basic example of adding an input to
start sending Puppet Server logs:
@splunkforwarder_input { 'puppetserver-sourcetype':
section => 'monitor:///var/log/puppetlabs/puppetserver/puppetserver.log',
setting => 'sourcetype',
value => 'puppetserver',
tag => 'splunk_forwarder'
}
This virtual resource will get collected by the ::splunk::forwarder
class if
it is tagged with splunk_forwarder
and will add the appropriate setting to
the inputs.conf file and refresh the service.
Reference
Types
-
splunk_config
: This is a meta resource used to configur defaults for all the splunkforwarder and splunk types. This type should not be declared directly as it is declared insplunk::params
and used internally by the types and providers. -
splunk_authentication
: Used to manage ini settings in authentication.conf -
splunk_authorize
: Used to manage ini settings in authorize.conf -
splunk_distsearch
: Used to manage ini settings in distsearch.conf -
splunk_indexes
: Used to manage ini settings in indexes.conf -
splunk_input
: Used to manage ini settings in inputs.conf -
splunk_limits
: Used to mange ini settings in limits.conf -
splunk_output
: Used to manage ini settings in outputs.conf -
splunk_props
: Used to manage ini settings in props.conf -
splunk_server
: Used to mangage ini settings in server.conf -
splunk_transforms
: Used to manage ini settings in transforms.conf -
splunk_web
: Used to manage ini settings in web.conf -
splunkforwarder_input
: Used to manage ini settings in inputs.conf -
splunkforwarder_output
:Used to manage ini settings in outputs.conf -
splunkforwarder_props
: Used to manage ini settings in props.conf -
splunkforwarder_transforms
: Used to manage ini settings in transforms.conf -
splunkforwarder_web
: Used to manage ini settings in web.conf -
splunkforwarder_limits
: Used to manage ini settings in limits.conf -
splunkforwarder_server
: Used to manage ini settings in server.conf
All of the above types use puppetlabs/ini_file
as a parent and are declared in
an identical way, and accept the following parameters:
section
: The name of the section in the configuration filesetting
: The setting to be managedvalue
: The value of the setting
Both section and setting are namevars for the types. Specifying a single string
as the title without a forward slash implies that the title is the section to be
managed (if the section attribute is not defined). You can also specify the
resource title as section/setting
and ommit both section
and setting
params
for a more shortform way of declaring the resource. Eg:
splunkforwarder_output { 'useless title':
section => 'default',
setting => 'defaultGroup',
value => 'splunk_9777',
}
splunkforwarder_output { 'default':
setting => 'defaultGroup',
value => 'splunk_9777',
}
splunkforwarder_output { 'default/defaultGroup':
value => 'splunk_9777',
}
The above resource declarations will all configure the following entry in outputs.conf
[default]
defaultGroup=splunk_9997
Note: if the section contains forward slashes you should not use it as the resource
title and should explicitly declare it with the section
attribute.
Parameters
Class: ::splunk::params
version
Optional Specifies the version of Splunk Enterprise that the module should install.
build
Optional Specifies the build of Splunk Enterprise that the module should use.
src_root
Optional The root path that the staging module will use to find packages for splunk and splunk::forwarder.
splunkd_port
Optional The splunkd port. Used as a default for both splunk and splunk::forwarder.
logging_port
Optional The port on which to send and listen for logs. Used as a default for both splunk and splunk::forwarder.
server
Optional The fqdn or IP address of the Splunk server. Used for setting up the default TCP output and input.
Class: ::splunk Parameters
package_source
The source URL for the splunk installation media (typically an RPM, MSI, etc). If a $src_root parameter is set in splunk::params, this will be automatically supplied. Otherwise it is required. The URL can be of any protocol supported by the nanliu/staging module. On Windows, this can be a UNC path to the MSI.
package_name
The name of the package(s) Puppet will use to install Splunk.
package_ensure
Ensure parameter which will get passed to the Splunk package resource. Default to the value in splunk::params
logging_port
The port to receive TCP logs on. Default to the port specified in splunk::params.
splunk_user
The user to run Splunk as. Default to the value set in splunk::params.
splunkd_port
The management port for Splunk. Default to the value set in splunk::params.
web_port
The port on which to service the Splunk Web interface. Default to 8000.
purge_inputs
Optional If set to true, inputs.conf will be purged of configuration that is no longer managed by the splunk_input type. Default to false.
purge_outputs
Optional If set to true, outputs.conf will be purged of configuration that is no longer managed by the splunk_output type. Default to false.
purge_authentication
Optional If set to true, authentication.conf will be purged of configuration that is no longer managed by the splunk_authentication type. Default to false.
purge_authorize
Optional If set to true, authorize.conf will be purged of configuration that is no longer managed by the splunk_authorize type. Default to false.
purge_distsearch
Optional If set to true, distsearch.conf will be purged of configuration that is no longer managed by the splunk_distsearch type. Default to false.
purge_indexes
Optional If set to true, indexes.conf will be purged of configuration that is no longer managed by the splunk_indexes type. Default to false.
purge_limits
Optional If set to true, limits.conf will be purged of configuration that is no longer managed by the splunk_limits type. Default to false.
purge_props
Optional If set to true, props.conf will be purged of configuration that is no longer managed by the splunk_props type. Default to false.
purge_server
Optional If set to true, server.conf will be purged of configuration that is no longer managed by the splunk_server type. Default to false.
purge_transforms
Optional If set to true, transforms.conf will be purged of configuration that is no longer managed by the splunk_transforms type. Default to false.
purge_web
Optional If set to true, web.conf will be purged of configuration that is no longer managed by the splunk_web type. Default to false.
Class ::splunk::forwarder Parameters
server
Optional The fqdn or IP address of the Splunk server. Default to the value in ::splunk::params.
package_source
The source URL for the splunk installation media (typically an RPM, MSI, etc). If a $src_root parameter is set in splunk::params, this will be automatically supplied. Otherwise it is required. The URL can be of any protocol supported by the nanliu/staging module. On Windows, this can be a UNC path to the MSI.
package_name
The name of the package(s) Puppet will use to install Splunk Universal Forwarder.
package_ensure
Ensure parameter which will get passed to the Splunk package resource. Default to the value in ::splunk::params
logging_port
Optional The port on which to send and listen for logs. Default to the value in ::splunk::params.
splunkd_port
The management port for Splunk. Default to the value set in splunk::params.
install_options
This variable is passed to the package resources' install_options parameter. Default to the value in ::splunk::params.
splunk_user
The user to run Splunk as. Default to the value set in splunk::params.
splunkd_listen
The address on which splunkd should listen. Defaults to 127.0.0.1.
purge_inputs
Optional If set to true, inputs.conf will be purged of configuration that is no longer managed by the splunkforwarder_input type. Default to false.
purge_outputs
Optional If set to true, outputs.conf will be purged of configuration that is no longer managed by the splunk_output type. Default to false.
purge_props
Optional If set to true, props.conf will be purged of configuration that is no longer managed by the splunk_props type. Default to false.
purge_transforms
Optional If set to true, transforms.conf will be purged of configuration that is no longer managed by the splunk_transforms type. Default to false.
purge_web
Optional If set to true, web.conf will be purged of configuration that is no longer managed by the splunk_web type. Default to false.
pkg_provider
Optional This will override the default package provider for the package resource. Default to undef.
forwarder_confdir
The root directory where Splunk Universal Forwarder is installed. Default to the value in ::splunk::params.
forwarder_input
Used to override the default forwarder_input type defined in ::splunk::params.
forwarder_output
Used to override the default forwarder_output type defined in ::splunk::params.
create_password
Not yet implemented.
Limitations
- Currently tested manually on Centos 7, but we will eventually add automated testing and are targeting compatibility with other platforms.
- Tested with Puppet 4.x
Development
TBD
Release Notes/Contributors/Etc
TBD
Types in this module release
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.
v6.1.0 (2017-09-20)
Implemented enhancements:
- Ability to manage ui-prefs.conf #103
- Added splunkforwarder_server and splunkforwarder_limits providers/types. #118 (nicholaspearson)
- Allow redirecting of settings into custom contexts #87 (michaelweiser)
Fixed bugs:
- splunkd_port not defined for forwarder #133
- concat dependency is missing from metadata.json #122
- splunkforwarder_server not working #121
- Fix .conf file modes for Windows forwarders #114 (natemccurdy)
- Allow for installing packages from UNC paths on Windows #113 (natemccurdy)
- Fix resource ordering in splunk class so that splunk types will properly notify services #91 (treydock)
Closed issues:
- Ruby load error when using splunk::forwarder on Windows #110
Merged pull requests:
- SplunkForwarder has no concept of a splunkd_port #134 (TraGicCode)
- Remove unused spec_helper_system.rb #132 (wyardley)
- SplunkForwarder has no concept of a server_service. #130 (TraGicCode)
- Update missing concat dependency in acceptance tests. #129 (TraGicCode)
- wire up splunkforwarder_server type #126 (alexcreek)
- Added missing concat dependency to metadata.json + .fixtures.yml #123 (TraGicCode)
- Fix typo in extension filename #117 (gregoirefra)
- This commit adds the pkg_provider 'chocolatey' to the module #108 (ralfbosz)
- Ability to configure ui-prefs.conf #104 (TraGicCode)
- Set
forwarder\_install\_options
to beundef
for OS other than Windows. #99 (shadow999)
v6.0.0 (2017-05-25)
Fixed bugs:
- Fix Windows Forwarder Installdir #102 (TraGicCode)
Closed issues:
- Support .conf files in non-standard locations #88
- Warnings produced when splunk resources are in catalog #86
Merged pull requests:
- Bump release for 6.0.0 #112 (petems)
- Add LICENSE file #109 (alexjfisher)
- This commit sets the splunk_user for Windows to 'administrator' #107 (ralfbosz)
- Lint fixes #101 (treydock)
- types: Fix purging when section contains '//' #96 (iamjamestl)
- splunk_config: Only load other splunk types #95 (iamjamestl)
- Remove unneded blank lines #93 (roidelapluie)
- Allow splunk server services to be overridden #90 (treydock)
- Ensure /etc/init.d/splunk is created before splunk services #89 (treydock)
- Update README.md from puppetlabs-splunk #85 (Cinderhaze)
- Modulesync 0.18.0 #83 (bastelfreak)
v5.1.0 (2017-01-12)
Closed issues:
- module doesn't notify splunk restart when changing an input #63
Merged pull requests:
- release 5.1.0 #82 (bastelfreak)
- modulesync 0.16.7 #81 (bastelfreak)
- Bump min version_requirement for Puppet + deps #80 (juniorsysadmin)
- modulesync 0.16.6 #79 (bastelfreak)
- modulesync 0.16.4 #78 (bastelfreak)
- modulesync 0.16.3 #74 (bastelfreak)
- Make the file reference use the variable and not a fixed path #73 (ralfbosz)
- modulesync 0.15.0 #72 (bastelfreak)
- Revert "Release deprecated version" #70 (hunner)
- Add missing badges #66 (dhoppe)
- Update based on voxpupuli/modulesync_config 0.14.1. This might fix #62 #64 (dhoppe)
v5.0.2 (2016-10-05)
Fixed bugs:
Closed issues:
- Invalid parameter key_val_separator #4
- inheritence and version overrides #3
- Add ability to upgrade universal forwarders and servers #1
Merged pull requests:
v5.0.1 (2016-10-04)
Fixed bugs:
Merged pull requests:
v5.0.0 (2016-10-03)
Closed issues:
- Add other supported OSes to metadata.json #54
Merged pull requests:
- prepped 5.0.0 #56 (crayfishx)
- Added rspec tests for types and splunk_config and other bugfixes #55 (crayfishx)
- Bug fixes, lint, rubocop, spec tests etc. #53 (alexjfisher)
- Add 'Build Status' badge #52 (alexjfisher)
- Modulesync 0.12.7 #51 (bastelfreak)
- Fixed service restarts with forwarders #50 (crayfishx)
- [REVIEW] [MODULES-3520] refactored types and providers and added purging #49 (crayfishx)
- (maint) Fix resource order for installing splunk forwarders #47 (briancain)
4.0.0 (2016-04-11)
Merged pull requests:
- (maint) Release prep. #45 (bmjen)
- Fix typo in README. #44 (Ziaunys)
- Update README with type documentation. #43 (Ziaunys)
- Fix module errors discovered while testing. #42 (Ziaunys)
- Add acceptance test skeleton. #41 (Ziaunys)
- Change file mode to string. #40 (Ziaunys)
- Add a more modern version of our README template with updates. #39 (Ziaunys)
- Various updates and fixes #38 (Ziaunys)
- Update the resource ordering for the new Splunk types. #37 (Ziaunys)
- Add conditional logic for using the staging module #36 (Ziaunys)
- Create additional Splunk types/providers #35 (Ziaunys)
- Add splunk_server type and provider #34 (Ziaunys)
- Correct the descriptions of existing splunk types #33 (Ziaunys)
- Actually use the variable somewhere #32 (kyledecot)
- Server ensure #31 (kyledecot)
- Adds param for ensuring forwarder can be the latest argument #30 (bmjen)
- forwarder::pkg_provider should default to $splunk::params::pkg_provider #29 (hunner)
- Fix dependencies #28 (mpdude)
- (MODULES-2953) fix order of assignments #27 (DavidS)
- added technology addon feature #26 (crayfishx)
- config items are collected with tag - make sure it exists #25 (asquelt)
- Expose splunk forwarder windows install options #14 (nanliu)
3.2.1 (2015-09-08)
Merged pull requests:
- 3.2.1 prep #24 (underscorgan)
- MODULES-2448 - Improved collector compatibility #23 (underscorgan)
3.2.0 (2015-07-21)
Merged pull requests:
- Release 3.2.0 #19 (hunner)
- Update splunkforwarder_output #18 (hunner)
- Repository and password changes #17 (ckyriakidou)
- (MODULES-2096) Move default cases last #16 (DavidS)
3.1.1 (2014-12-18)
Merged pull requests:
- 3.1.1 prep #13 (underscorgan)
- Fix lint issues #12 (underscorgan)
- Add solaris sparc parameters. #10 (nanliu)
3.1.0 (2014-08-06)
Merged pull requests:
- 3.1.0 prep #11 (underscorgan)
- Update the name of the module for PMT install. #8 (metcalfc)
- Add integration tests and fix forwarder bug #7 (hunner)
- Add T&Ps for Splunk indexer and forwarder props and transforms #6 (hunner)
- Add dependency on stdlib >= 2.4.0 #5 (hunner)
3.0.1 (2013-12-02)
3.0.0 (2013-11-22)
2.0.1 (2013-10-25)
2.0.0 (2013-09-30)
0.3.0 (2013-08-27)
Merged pull requests:
- typo in puppet module install command #2 (fiddyspence)
0.2.0 (2012-12-18)
* This Change Log was automatically generated by github_changelog_generator
Dependencies
- puppetlabs-stdlib (>= 4.13.1 < 5.0.0)
- puppetlabs-inifile (>= 1.4.1 < 2.0.0)
- puppet-staging (>= 2.0.1 < 3.0.0)
- puppetlabs-concat (4.x)
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.