Version information
This version is compatible with:
- Puppet Enterprise 2019.8.x, 2019.7.x, 2019.5.x, 2019.4.x, 2019.3.x, 2019.2.x, 2019.1.x, 2019.0.x
- Puppet >= 6.0.0 < 7.0.0
- ,
Start using this module
Add this module to your Puppetfile:
mod 'helio-fluentbit', '0.3.0'
Learn more about managing modules with a PuppetfileDocumentation
Reference
Table of Contents
Classes
fluentbit
: Installs and configures fluentbitfluentbit::config
: configures the main fluentbit main configfluentbit::install
: Installs fluentbit packagefluentbit::repo
: configures the fluentbit repofluentbit::repo::debian
: A short summary of the purpose of this classfluentbit::service
: Manages the td-agent-bit service
Defined types
fluentbit::filter::modify
: Filter to modify records using rules and conditionsfluentbit::input::forward
: Inputs / listen and forward messagesfluentbit::input::syslog
: Ingest logs from (r)syslogfluentbit::input::tail
: Input plugin to monitor one or several text files.fluentbit::output::es
: Plugin to output logs to a configured elasticsearch instancefluentbit::output::http
: Manage the configuration of a HTTP output plugin.
Classes
fluentbit
Installs and configures fluentbit
- See also https://docs.fluentbit.io/manual/
Examples
include fluentbit
Parameters
The following parameters are available in the fluentbit
class.
manage_package_repo
Data type: Boolean
Installs the package repositories
service_name
Data type: String[1]
the td-agent-bit service name
input_plugins
Data type: Array[Fluentbit::Plugin]
Hash of the INPUT plugins to be configured
output_plugins
Data type: Array[Fluentbit::Plugin]
Hash of the OUTPUT plugins to be configured
filter_plugins
Data type: Array[Fluentbit::Plugin]
Hash of the filter to be configured
manage_package_repo
Installs the package repositories
repo_key_fingerprint
Data type: String[1]
GPG key identifier of the repository
repo_key_location
Data type: Stdlib::HTTPUrl
GPG key location
package_ensure
Data type: String[1]
Whether to install the Fluentbit package, and what version to install. Values: 'present', 'latest', or a specific version number. Default value: 'present'.
package_name
Data type: String[1]
Specifies the Fluentbit package to manage. Default value: 'td-agent-bit'
manage_service
Data type: Boolean
Whether to manage the service at all. Default value: true
service_enable
Data type: Boolean
Whether to enable the fluentbit service at boot. Default value: true.
service_ensure
Data type: Stdlib::Ensure::Service
Whether the fluentbit service should be running. Default value: 'running'.
service_manage
Whether to manage the fluentbit service. Default value: true.
service_hasstatus
Whether the service has a functional status command. Default value: true.
service_hasrestart
Whether the service has a restart command. Default value: true.
manage_config_dir
Data type: Boolean
Whether to manage the configuration directory. When enabled, will remove all unmanaged files from the directory the configuration resides in. Default value: true
config_file
Data type: Stdlib::Absolutepath
Path of the daemon configuration.
config_file_mode
Data type: Stdlib::Filemode
File mode to apply to the daemon configuration file
storage_path
Data type: Optional[Stdlib::Absolutepath]
Set an optional location in the file system to store streams and chunks of data. If this parameter is not set, Input plugins can only use in-memory buffering.
storage_sync
Data type: Optional[Enum['normal', 'full']]
Configure the synchronization mode used to store the data into the file system. It can take the values normal or full. Default value: 'normal'
storage_checksum
Data type: Boolean
Enable the data integrity check when writing and reading data from the filesystem. The storage layer uses the CRC32 algorithm. Default value: false
storage_backlog_mem_limit
Data type: Optional[String[1]]
If storage.path is set, Fluent Bit will look for data chunks that were not delivered and are still in the storage layer, these are called backlog data. This option configure a hint of maximum value of memory to use when processing these records. Default value: 5M
manage_plugins_file
Data type: Boolean
Whether to manage the enabled external plugins
plugins_file
Data type: Stdlib::Absolutepath
A plugins configuration file allows to define paths for external plugins.
plugins
Data type: Array[Stdlib::Absolutepath]
List of external plugin objects to enable
manage_streams_file
Data type: Boolean
Whether to manage the stream processing configuration
streams_file
Data type: Stdlib::Absolutepath
Path for the Stream Processor configuration file.
streams
Data type: Array[Fluentbit::Stream]
Stream processing tasks
manage_parsers_file
Data type: Boolean
Whether to manage the parser definitions
parsers_file
Data type: Stdlib::Absolutepath
Path for a parsers configuration file. Multiple Parsers_File entries can be used.
parsers
Data type: Array[Fluentbit::Parser]
List of parser definitions. The default value consists of all the available definitions provided by the upstream project as of version 1.3
flush
Data type: Integer
Set the flush time in seconds. Everytime it timeouts, the engine will flush the records to the output plugin.
daemon
Data type: Boolean
Boolean value to set if Fluent Bit should run as a Daemon (background) or not. Allowed values are: yes, no, on and off.
log_file
Data type: Optional[Stdlib::Absolutepath]
Absolute path for an optional log file.
log_level
Data type: Enum['error', 'warning', 'info', 'debug', 'trace']
Set the logging verbosity level. Values are: error, info, debug and trace. Values are accumulative, e.g: if 'debug' is set, it will include error, info and debug. Note that trace mode is only available if Fluent Bit was built with the WITH_TRACE option enabled.
http_server
Data type: Boolean
Enable built-in HTTP Server
http_listen
Data type: Stdlib::IP::Address::Nosubnet
Set listening interface for HTTP Server when it's enabled
http_port
Data type: Stdlib::Port
Set TCP Port for the HTTP Server
coro_stack_size
Data type: Integer
Set the coroutines stack size in bytes. The value must be greater than the page size of the running system.
variables
Data type: Hash
macro definitions to use in the configuration file the will be registered using the @SET command.
service_has_status
Data type: Boolean
service_has_restart
Data type: Boolean
fluentbit::config
Includes all [input] and [output] configs. (@include) Sets global variables (@set) Configures global [service] section
fluentbit::install
Installs fluentbit package
fluentbit::repo
configures the fluentbit repo
fluentbit::repo::debian
A description of what this class does
Examples
include fluentbit::repo::debian
fluentbit::service
Manages the td-agent-bit service
Defined types
fluentbit::filter::modify
Filter to modify records using rules and conditions
Examples
fluentbit::filter::modify { 'namevar': }
Parameters
The following parameters are available in the fluentbit::filter::modify
defined type.
configfile
Data type: String
Path to the filter configfile. Naming should be filter_*.conf to make sure it's getting included by the main config.
Default value: '/etc/td-agent-bit/filter_modify.conf'
set
Data type: Optional
Add a key/value pair with key KEY and value VALUE. If KEY already exists, this field is overwritten
Default value: undef
add
Data type: Optional
Add a key/value pair with key KEY and value VALUE if KEY does not exist
Default value: undef
remove
Data type: Optional
Remove a key/value pair with key KEY if it exists
Default value: undef
remove_wildcard
Data type: Optional
Remove all key/value pairs with key matching wildcard KEY
Default value: undef
remove_regex
Data type: Optional
Remove all key/value pairs with key matching regexp KEY
Default value: undef
rename
Data type: Optional
Rename a key/value pair with key KEY to RENAMED_KEY if KEY exists AND RENAMED_KEY does not exist
Default value: undef
hard_rename
Data type: Optional
Rename a key/value pair with key KEY to RENAMED_KEY if KEY exists. If RENAMED_KEY already exists, this field is overwritten
Default value: undef
copy
Data type: Optional
Copy a key/value pair with key KEY to COPIED_KEY if KEY exists AND COPIED_KEY does not exist
Default value: undef
hard_copy
Data type: Optional
Copy a key/value pair with key KEY to COPIED_KEY if KEY exists. If COPIED_KEY already exists, this field is overwritten
Default value: undef
match
Data type: String
Default value: '*'
fluentbit::input::forward
Forward is the protocol used by Fluent Bit and Fluentd to route messages between peers. This plugin implements the input service to listen for Forward messages.
Parameters
The following parameters are available in the fluentbit::input::forward
defined type.
configfile
Data type: String
Path to the input configfile. Naming should be input_*.conf to make sure it's getting included by the main config.
Default value: "/etc/td-agent-bit/inputforward${name}.conf"
listen
Data type: Stdlib::IP::Address::Nosubnet
Listener network interface
Default value: '0.0.0.0'
port
Data type: Stdlib::Port
TCP port to listen for incoming connections.
Default value: 24224
buffer_max_size
Data type: Optional[String]
Specify the maximum buffer memory size used to receive a Forward message. The value must be according to the Unit Size specification.
Default value: undef
buffer_chunk_size
Data type: Optional[String]
By default the buffer to store the incoming Forward messages, do not allocate the maximum memory allowed, instead it allocate memory when is required. The rounds of allocations are set by Buffer_Chunk_Size. The value must be according to the Unit Size specification.
Default value: undef
fluentbit::input::syslog
Setups config file for fluentbit and configures listen on rsyslog. Reloads services if something changes.
Parameters
The following parameters are available in the fluentbit::input::syslog
defined type.
mode
Data type: String
Defines transport protocol mode: unix_udp (UDP over Unix socket), unix_tcp (TCP over Unix socket), tcp or udp
Default value: 'unix_udp'
listen
Data type: Optional[String]
If Mode is set to tcp, specify the network interface to bind.
Default value: $mode
port
Data type: Optional[String]
If Mode is set to tcp, specify the TCP port to listen for incoming connections.
Default value: $mode
path
Data type: Optional[String]
If Mode is set to unix_tcp or unix_udp, set the absolute path to the Unix socket file.
Default value: $mode
parser
Data type: String
Specify an alternative parser for the message. By default, the plugin uses the parser syslog-rfc3164. If your syslog messages have fractional seconds set this Parser value to syslog-rfc5424 instead.
Default value: 'syslog-rfc3164'
rsyslog_config
Data type: String
Specify the path to the rsyslog config file for fluentbit to enable listening.
Default value: '/etc/rsyslog.d/60-fluent-bit.conf'
configfile
Data type: String
Path to the input configfile. Naming should be input_*.conf to make sure it's getting included by the main config.
Default value: '/etc/td-agent-bit/input_syslog.conf'
fluentbit::input::tail
The tail input plugin allows to monitor one or several text files.
It has a similar behavior like tail -f
shell command.
Parameters
The following parameters are available in the fluentbit::input::tail
defined type.
configfile
Data type: Stdlib::Absolutepath
Path to the input configfile. Naming should be input_*.conf to make sure it's getting included by the main config.
Default value: "/etc/td-agent-bit/inputtail${name}.conf"
path
Data type: Stdlib::Absolutepath
Pattern specifying a specific log files or multiple ones through the use of common wildcards.
routing_tag
Data type: Optional[String[1]]
Set a tag (with regex-extract fields) that will be placed on lines read.
Default value: undef
storage_type
Data type: Optional[Enum['memory', 'filesystem']]
Specify the buffering mechanism to use. Values: memory, filesystem
Default value: undef
buffer_chunk_size
Data type: Optional[Fluentbit::Sizeunit]
Set the initial buffer size to read files data.
Default value: undef
buffer_max_size
Data type: Optional[Fluentbit::Sizeunit]
Set the limit of the buffer size per monitored file.
Default value: undef
path_key
Data type: Optional[String[1]]
Appends the name of the monitored file as part of the record. The value assigned becomes the key in the map.
Default value: undef
exclude_path
Data type: Array[String]
Shell patterns to exclude files matching a certain criteria.
Default value: []
refresh_interval
Data type: Optional[Integer[1]]
The interval of refreshing the list of watched files in seconds.
Default value: undef
rotate_wait
Data type: Optional[Integer[1]]
Specify the number of extra time in seconds to monitor a file once is rotated in case some pending data is flushed.
Default value: undef
ignore_older
Data type: Optional[Fluentbit::Timeunit]
Ignores files that have been last modified before this time.
Default value: undef
skip_long_lines
Data type: Boolean
When a monitored file reach it buffer capacity due to a very long line (Buffer_Max_Size), the default behavior is to stop monitoring that file. Skip_Long_Lines alters that behavior and instructs Fluent Bit to skip long lines and continue processing other lines that fits into the buffer size.
Default value: false
db
Data type: Optional[Stdlib::Absolutepath]
Specify the database file to keep track of monitored files and offsets.
Default value: undef
db_sync
Data type: Optional[Enum['Extra', 'Full', 'Normal', 'Off']]
Set a default synchronization (I/O) method. Values: Extra, Full, Normal, Off.
Default value: undef
mem_buf_limit
Data type: Optional[Fluentbit::Sizeunit]
Set a limit of memory that Tail plugin can use when appending data to the Engine.
Default value: undef
key
Data type: Optional[String[1]]
Name of the key to append any unstructured data to the output as.
Default value: undef
tag_regex
Data type: Optional[String[1]]
Set a regex to exctract fields from the file.
Default value: undef
multiline
Data type: Boolean
Try to discover multiline messages and use the proper parsers to compose the outgoing messages.
Default value: false
multiline_flush
Data type: Optional[Integer[1]]
Wait period time in seconds to process queued multiline messages.
Default value: undef
parsers
Data type: Array[String[1]]
Name of parsers to use for disecting the message. When multiline is enabled, the first array entry becomes the configuration value for Parser_Firstline, with the remaining entry being assigned to the Parser_N attributes. When multiline is disabled, only the first item is used for the Parser configuration value.
Default value: []
docker_mode
Data type: Boolean
Recombine split Docker log lines before passing them to any parser.
Default value: false
docker_mode_flush
Data type: Optional[Integer[1]]
Wait period time in seconds to flush queued unfinished split lines.
Default value: undef
fluentbit::output::es
Plugin to output logs to a configured elasticsearch instance
Examples
include fluentbit::output::es
Parameters
The following parameters are available in the fluentbit::output::es
defined type.
configfile
Data type: String
Path to the output configfile. Naming should be output_*.conf to make sure it's getting included by the main config.
Default value: "/etc/td-agent-bit/outputes${name}.conf"
match
Data type: String
Tag to route the output.
Default value: '*'
tls
Data type: Enum['on', 'off']
Turn TLS encrypted communication with Elasticsearch on / off.
Default value: 'off'
host
Data type: Stdlib::Host
IP address or hostname of the target Elasticsearch instance
Default value: '127.0.0.1'
port
Data type: Stdlib::Port
TCP port of the target Elasticsearch instance
Default value: 9200
path
Elasticsearch accepts new data on HTTP query path "/_bulk". But it is also possible to serve Elasticsearch behind a reverse proxy on a subpath. This option defines such path on the fluent-bit side. It simply adds a path prefix in the indexing HTTP POST URI.
buffer_size
Specify the buffer size used to read the response from the Elasticsearch HTTP service. This option is useful for debugging purposes where is required to read full responses, note that response size grows depending of the number of records inserted. To set an unlimited amount of memory set this value to False, otherwise the value must be according to the Unit Size specification.
pipeline
Newer versions of Elasticsearch allows to setup filters called pipelines. This option allows to define which pipeline the database should use. For performance reasons is strongly suggested to do parsing and filtering on Fluent Bit side, avoid pipelines.
http_user
Data type: Optional[String]
Optional username credential for Elastic X-Pack access
Default value: undef
http_passwd
Data type: Optional[String]
Password for user defined in HTTP_User
Default value: undef
index
Data type: String
Index name
Default value: 'fluentbit'
type
Data type: String
Type name
Default value: 'flb_type'
logstash_format
Enable Logstash format compatibility.
logstash_prefix
When Logstash_Format is enabled, the Index name is composed using a prefix and the date, e.g: If Logstash_Prefix is equals to 'mydata' your index will become 'mydata-YYYY.MM.DD'. The last string appended belongs to the date when the data is being generated.
logstash_dateformat
Time format (based on strftime) to generate the second part of the Index name.
time_key
When Logstash_Format is enabled, each record will get a new timestamp field. The Time_Key property defines the name of that field.
time_key_format
When Logstash_Format is enabled, this property defines the format of the timestamp.
include_tag_key
When enabled, it append the Tag name to the record.
tag_key
When Include_Tag_Key is enabled, this property defines the key name for the tag.
generate_id
When enabled, generate _id for outgoing records. This prevents duplicate records when retrying ES.
replace_dots
When enabled, replace field name dots with underscore, required by Elasticsearch 2.0-2.3.
trace_output
When enabled print the elasticsearch API calls to stdout (for diag only)
current_time_index
Use current time for index generation instead of message record
logstash_prefix_key
Prefix keys with this string
fluentbit::output::http
The http output plugin allows to flush your records into a HTTP endpoint. This type manages the configuration for it.
Examples
fluentbit::output::http { 'logstash': }
Parameters
The following parameters are available in the fluentbit::output::http
defined type.
configfile
Data type: Stdlib::Absolutepath
Path to the output configfile. Naming should be output_*.conf to make sure it's getting included by the main config.
Default value: "/etc/td-agent-bit/outputhttp${name}.conf"
match
Data type: Optional[String[1]]
Tag to route the output.
Default value: undef
tls
Data type: Fluentbit::TLS
TLS configuration. By default TLS is disabled.
Default value: {}
headers
Data type: Hash[String[1], String[1]]
Map of headers to add to requests.
Default value: {}
retry_limit
Data type: Variant[Undef, Boolean, Integer[1]]
Number of retries if upstream refuses the records. false will disable retries, true will cause it to retry once. All other values are passed on verbatim.
Default value: undef
host
Data type: Optional[Stdlib::Host]
IP address or hostname of the target HTTP Server.
Default value: undef
port
Data type: Optional[Stdlib::Port]
TCP port of the target HTTP Server.
Default value: undef
http_user
Data type: Optional[String[1]]
Basic Auth Username.
Default value: undef
http_passwd
Data type: Optional[String[1]]
Basic Auth Password. Requires HTTP_User to be set.
Default value: undef
proxy
Data type: Optional[Stdlib::HTTPUrl]
Specify an HTTP Proxy.
Default value: undef
uri
Data type: Optional[Stdlib::Absolutepath]
Specify an optional HTTP URI for the target web server.
Default value: undef
format
Data type: Optional[Enum['msgpack', 'json', 'json_stream', 'json_lines', 'gelf']]
Specify the data format to be used in the HTTP request body.
Default value: undef
header_tag
Data type: Optional[String[1]]
Specify an optional HTTP header field for the original message tag.
Default value: undef
json_date_key
Data type: Optional[String[1]]
Specify the name of the date field in output.
Default value: undef
json_date_format
Data type: Optional[Enum['double', 'iso8601']]
Specify the format of the date.
Default value: undef
gelf_timestamp_key
Data type: Optional[String[1]]
Specify the key to use for timestamp in gelf format.
Default value: undef
gelf_host_key
Data type: Optional[String[1]]
Specify the key to use for host in gelf format.
Default value: undef
gelf_short_messge_key
Data type: Optional[String[1]]
Specify the key to use for short in gelf format.
Default value: undef
gelf_full_message_key
Data type: Optional[String[1]]
Specify the key to use for full in gelf format.
Default value: undef
gelf_level_key
Data type: Optional[String[1]]
Specify the key to use for level in gelf format.
Default value: undef
Dependencies
- puppetlabs/stdlib (>= 4.24.0 < 6.0.0)
- puppetlabs/apt (>= 4.5.1 < 7.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.