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, 2018.1.x, 2017.3.x, 2017.2.x, 2016.4.x
- Puppet >= 4.10.0 < 7.0.0
- , , , , ,
Start using this module
Add this module to your Puppetfile:
mod 'puppet-puppetboard', '5.0.0'
Learn more about managing modules with a PuppetfileDocumentation
puppetboard
Table of Contents
- Overview
- Setup
- Usage
- Number of Reports
- Offline Mode
- Set Default Environment
- Disable SELinux
- Development
Overview
This is the puppetboard puppet module.
Puppetboard is an open source puppet dashboard
https://github.com/voxpupuli/puppetboard
Setup
Installation
puppet module install puppet-puppetboard
Dependencies
Note Oracle linux 5 on puppet versions 4.6.0 to 4.7.1 has pip package problem which will cause an error trying to install puppetboard.
Note that this module no longer explicitly requires the puppetlabs apache module. If you want to use the apache functionality of this module you will have to specify that the apache module is installed with:
puppet module install puppetlabs-apache
On RedHat type systems, EPEL may also need to be configured; you can use the stahnma/epel module if you don't already have it configured.
This module also requires the git
and virtualenv
packages. These can be enabled in the module by:
class { 'puppetboard':
manage_git => true,
manage_virtualenv => true,
}
or by:
class { 'puppetboard':
manage_git => 'latest',
manage_virtualenv => 'latest',
}
Usage
Declare the base puppetboard manifest:
class { 'puppetboard': }
Number of Reports
NOTE: In order to have reports present in the dashboard, report storage must be enabled on the Puppet master node. This is not the default behavior, so it mush be enabled.
See https://docs.puppet.com/puppetdb/latest/connect_puppet_master.html#enabling-report-storage for instructions on report storage.
By default, puppetboard displays only 10 reports. This number can be controlled to set the number of reports to show.
class { 'puppetboard':
reports_count => 40
}
Offline Mode
If you are running puppetboard in an environment which does not have network access to public CDNs, puppet board can load static assets (jquery, semantic-ui, tablesorter, etc) from the local web server instead of a CDN:
class { 'puppetboard':
offline_mode => true,
}
Set Default Environment
by default, puppetboard defaults to "production" environment. This can be set to default to a different environment.
class { 'puppetboard':
default_environment => 'customers',
}
or to default to "All environments":
class { 'puppetboard':
default_environment => '*',
}
Disable SELinux
class { 'puppetboard':
manage_selinux => false,
}
Apache
If you want puppetboard accessible through Apache and you're able to use the
official puppetlabs/apache
Puppet module, this module contains two classes
to help configuration.
The first, puppetboard::apache::vhost
, will use the apache::vhost
defined-type to create a full virtual host. This is useful if you want
puppetboard to be available from http://pboard.example.com:
# Configure Apache on this server
class { 'apache': }
class { 'apache::mod::wsgi': }
# Configure Puppetboard
class { 'puppetboard': }
# Access Puppetboard through pboard.example.com
class { 'puppetboard::apache::vhost':
vhost_name => 'pboard.example.com',
port => 80,
}
The second, puppetboard::apache::conf
, will create an entry in
/etc/apache2/conf.d
(or /etc/httpd/conf.d
, depending on your distribution).
This is useful if you simply want puppetboard accessible from
http://example.com/puppetboard:
# Configure Apache
# Ensure it does *not* purge configuration files
class { 'apache':
purge_configs => false,
mpm_module => 'prefork',
default_vhost => true,
default_mods => false,
}
class { 'apache::mod::wsgi': }
# Configure Puppetboard
class { 'puppetboard': }
# Access Puppetboard from example.com/puppetboard
class { 'puppetboard::apache::conf': }
Apache (with Reverse Proxy)
You can also relocate puppetboard to a sub-URI of a Virtual Host. This is useful if you want to reverse-proxy puppetboard, but are not planning on dedicating a domain just for puppetboard:
class { 'puppetboard::apache::vhost':
vhost_name => 'dashes.acme',
wsgi_alias => '/pboard',
}
In this case puppetboard will be available (on the default) on http://dashes.acme:5000/pboard. You can then reverse-proxy to it like so:
Redirect /pboard /pboard/
ProxyPass /pboard/ http://dashes.acme:5000/pboard/
ProxyPassReverse /pboard/ http://dashes.acme:5000/pboard/
Using the puppetlabs/apache module:
apache::vhost { 'example.acme':
port => '80',
docroot => '/var/www/html',
redirect_source => [ '/pboard' ],
redirect_dest => [ '/pboard/' ],
proxy_pass => [
{
'path' => '/pboard/',
'url' => 'http://dashes.acme:5000/pboard/',
},
],
}
Redhat/CentOS
RedHat/CentOS has restrictions on the /etc/apache directory that require wsgi to be configured to use /var/run.
class { 'apache::mod::wsgi':
wsgi_socket_prefix => "/var/run/wsgi",
}
Apache, RedHat/CentOS and a non-standard port
# Configure Apache on this server
class { 'apache': }
class { 'apache::mod::version': }
class { 'apache::mod::wsgi':
wsgi_socket_prefix => "/var/run/wsgi",
}
# Configure Puppetboard
class { 'puppetboard': }
# Access Puppetboard through pboard.example.com, port 8888
class { 'puppetboard::apache::vhost':
vhost_name => 'puppetboard.example.com',
port => '8888',
}
Using SSL to the PuppetDB host
If you would like to use certificate auth into the PuppetDB service you must configure puppetboard to use a client certificate and private key.
You have two options for the source of the client certificate & key:
- Generate a new certificate, signed by the puppetmaster CA
- Use the existing puppet client certificate
If you choose option 1, generate the new certificates on the CA puppet master as follows:
sudo puppet cert generate puppetboard.example.com
Note: this name cannot conflict with an existing certificate name.
The new certificate and private key can be found in $certdir/.pem and $privatekeydir/.pem on the CA puppet master. If you are not running puppetboard on the CA puppet master you will need to copy the certificate and key to the node running puppetboard.
Here's an example, using new certificates:
$ssl_dir = '/var/lib/puppetboard/ssl'
$puppetboard_certname = 'puppetboard.example.com'
class { 'puppetboard':
manage_virtualenv => true,
puppetdb_host => 'puppetdb.example.com',
puppetdb_port => 8081,
puppetdb_key => "${ssl_dir}/private_keys/${puppetboard_certname}.pem",
puppetdb_ssl_verify => "${ssl_dir}/certs/ca.pem",
puppetdb_cert => "${ssl_dir}/certs/${puppetboard_certname}.pem",
}
If you are re-using the existing puppet client certificates, they will already exist on the node (assuming puppet has been run and the client cert signed by the puppet master). However, the puppetboaard user will not have permission to read the private key unless you add it to the puppet group.
Here's a complete example, re-using the puppet client certs:
$ssl_dir = $::settings::ssldir
$puppetboard_certname = $::certname
class { 'puppetboard':
groups => 'puppet',
manage_virtualenv => true,
puppetdb_host => 'puppetdb.example.com',
puppetdb_port => 8081,
puppetdb_key => "${ssl_dir}/private_keys/${puppetboard_certname}.pem",
puppetdb_ssl_verify => "${ssl_dir}/certs/ca.pem",
puppetdb_cert => "${ssl_dir}/certs/${puppetboard_certname}.pem",
}
Note that both the above approaches only work if you have the Puppet CA root certificate added to the root certificate authority file used by your operating system. If you want to specify the location to the Puppet CA file ( you probably do) you have to use the syntax below. Currently this is a bit of a gross hack, but it's an open issue to resolve it in the Puppet module:
$ssl_dir = $::settings::ssldir
$puppetboard_certname = $::certname
class { 'puppetboard':
groups => 'puppet',
manage_virtualenv => true,
puppetdb_host => 'puppetdb.example.com',
puppetdb_port => 8081,
puppetdb_key => "${ssl_dir}/private_keys/${puppetboard_certname}.pem",
puppetdb_ssl_verify => "${ssl_dir}/certs/ca.pem",
puppetdb_cert => "${ssl_dir}/certs/${puppetboard_certname}.pem",
}
Development
This module is maintained by Vox Pupuli. Voxpupuli welcomes new contributions to this module, especially those that include documentation and rspec tests. We are happy to provide guidance if necessary.
Please see CONTRIBUTING for more details.
Please log tickets and issues on github.
Authors
- Spencer Krum krum.spencer@gmail.com
- Voxpupuli Team
- The core of this module was based on Hunter Haugen's puppetboard-vagrant repo.
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.
v5.0.0 (2018-10-14)
Breaking changes:
Implemented enhancements:
Closed issues:
- Listen IP of Apache Vhost is not configurable #226
- Does puppetboard supports multiple puppetdb connections ? #219
- stankevich-python has been deprecated #215
Merged pull requests:
- modulesync 2.2.0 and allow puppet 6.x #230 (bastelfreak)
- allow puppetlabs/stdlib 5.x #221 (bastelfreak)
- drop EOL OSs; fix puppet version range #214 (bastelfreak)
- Rely on beaker-hostgenerator for docker nodesets #212 (ekohl)
v4.1.0 (2018-05-08)
Fixed bugs:
Closed issues:
- Default vhost configuration causes Apache to fail to start #192
Merged pull requests:
- Document that apache::mod::version should be included #211 (mattock)
- bump puppet to latest supported version 4.10.0 #209 (bastelfreak)
- add reverseproxy example using puppetlabs/apache module #207 (kpankonen)
- fix ProxyPass example #206 (kpankonen)
- Group should be a system group. #203 (ryanc)
- Propose small spelling change #201 (jeis2497052)
- update minimal vcsrepo version #198 (pgassmann)
- Set custom vhost parameters. for example Basic Auth #196 (c33s)
v4.0.0 (2017-11-11)
Breaking changes:
Implemented enhancements:
- Update to support Apache 2.4 - rework of #136 #189 (wyardley)
- Add boolean to control EPEL #181 (lukebigum)
Closed issues:
- Puppet CA certificate not configured correctly #142
Merged pull requests:
- Update (and run in Travis) acceptance tests, fix formatting in LDAP templates #190 (wyardley)
- Revert "Add apache file auth support" #188 (wyardley)
- Sort extra_settings to prevent churn #175 (barneycg)
- Add apache file auth support #149 (arioch)
v3.0.0 (2017-09-17)
Implemented enhancements:
- Add the ability to override home directory for the created user #183 (coreone)
- Apache vhost testing #172 (mterzo)
- replace all validate functions with datatypes #167 (bastelfreak)
Fixed bugs:
- Fixes puppetdb_verify_ssl parameter and apache::vhost unit tests #177 (fuero)
- Update the puppetdb_ssl_verify setting. #169 (rnelson0)
- Restart the web server when the settings file changes #159 (rnelson0)
Closed issues:
- New install, puppetboard start error #171
- Reduce dependency on other modules #166
- Problem with installing puppetboard. #163
Merged pull requests:
- Make EPEL soft dependency per style guide #185 (wyardley)
- Switch to puppet_install_helper (and fix rubocop warning in process) #184 (wyardley)
- add instructions on how to enable report storage to be able to view i… #182 (jonmosco)
- Fix github license detection #179 (alexjfisher)
Document usage of Puppet CA via puppetdb\_ssl\_verify [\#150](https://github.com/voxpupuli/puppet-puppetboard/pull/150) ([apeeters](https://github.com/apeeters))
v2.9.0 (2017-01-13)
Implemented enhancements:
Closed issues:
- Add DEFAULT_ENVIRONMENT to settings.py #132
- Add Ability to pass OFFLINE_MODE to settings.py #130
- Release 2.7.5 to PuppetForge #118
- Adding ::puppetboard::apache::ldapauth? #110
Merged pull requests:
- Bump minimum version dependencies (for Puppet 4) #157 (juniorsysadmin)
- Remove unknown parameter from documentation #145 (ghoneycutt)
- Add ldap support #144 (elmobp)
- adding default_environment param #133 (james-powis)
- added offline mode #131 (james-powis)
- Explicitly ensure python-dev is installed #129 (dskad)
v2.8.2 (2016-05-05)
Merged pull requests:
- Release 2.8.2 #127 (bastelfreak)
- Fix Travis CI status image #126 (brandonweeks)
- rename to puppet-puppetboard #124 (bastelfreak)
v2.8.1 (2016-05-05)
Merged pull requests:
- Release 2.8.1 #123 (bastelfreak)
v2.7.5 (2016-05-05)
Closed issues:
- The parameter 'reports_count' is declared more than once in the parameter list #114
- please make a fresh release #103
- dependency error when specifying manage_virtualenv #101
- Documentation wrong on SSL #94
- progress or next steps for puppet 4 support #93
- Cut a new release #78
- Module version differences #77
- Setting 'PUPPETDB_SSL_VERIFY' via Hiera Fails #65
- Reference to missing service puppetboard #58
Merged pull requests:
- Update CHANGELONG.md #120 (bastelfreak)
- Release 2.7.5 #117 (jyaworski)
- Changelog md #116 (jyaworski)
- Version 2.7.4 #115 (jyaworski)
- Closes #93 #113 (jyaworski)
- Fixes #58. #111 (jyaworski)
- Move to voxpupuli #109 (jyaworski)
- add ssl parameter to puppetboard::apache::vhost #108 (brandonweeks)
- Update README and metadata.json to reflect org changes #106 (jyaworski)
- Ubuntu exceptions #104 (dalesit)
- Fix duplicate virtualenv declaration #102 (ogdensan)
- Feature/catalog #100 (bahner)
- Fixing what was broken in: 6b95a6ae53e7c4fc74ae830fe4123e3fdf7cb15b #99 (ryno75)
- Remove duplicate reports_count parameter #98 (badgerben)
- added conditionals around package installs #97 (ryno75)
- Default to managing selinux if ::selinux is true #96 (jyaworski)
- The process must match the group #95 (jyaworski)
- Correct selboolean value for selinux on RedHat osfamily. #92 (johnzimm)
- Fix some typo/syntax. Only on/off are valid for selboolean value #91 (Zophar78)
- update documentation for puppetdb_ssl #89 (mkinney)
- Support for .htaccess files #88 (tombuildsstuff)
- Correct default value for experimental in doc #86 (Vincent--)
- Adding the selinux setup to allow this to work on RHEL with selinux e… #84 (jlcox1970)
- Add bounds to dependency versions in metadata #79 (ghoneycutt)
2.7.3 (2015-07-20)
Merged pull requests:
2.7.2 (2015-07-15)
Merged pull requests:
- "remove pry" #81 (nibalizer)
- "Puppetboard now lives in puppet-community" #74 (nibalizer)
- Adding ability to specify limit on number of requests to the daemon #73 (holtwilkins)
- Require Vcsrepo[$dcroot] for wsgi.py file creation #72 (dbogen)
- No more testing on 1.8.7 #70 (nibalizer)
- fixup tests for trusty, add docker nodeset #69 (nibalizer)
2.7.1 (2015-02-04)
2.7.0 (2015-02-04)
Closed issues:
- SSL Cert permissions with managed user #49
- make static/ really static #48
- More flexibility with apache::vhost #47
- Quoting default_settings.py #35
Merged pull requests:
- Better comment about default value of reports_count #64 (txaj)
- Support adding arbitrary values to settings.py #63 (robinbowes)
- Clean up arrow alignement and add a default case to params.pp #62 (krionux)
- Description for rake task for metadata #60 (nibalizer)
- Fix missing listen parameter #57 (eshamow)
- Update metadata.json: fix dependency for stdlib #55 (codec)
- Linting metadata.json #54 (nibalizer)
- Moving to metadata.json #53 (nibalizer)
- Feature/set supplementary groups #52 (robinbowes)
- puppetdb_ssl renamed to puppetdb_ssl_verify #51 (robinbowes)
- Add CentOS caveats #50 (Paulche)
- Adding the ability to control the number of reports that you want to add... #40 (stack72)
2.5.0 (2014-06-23)
Closed issues:
- Have custom settings in settings.py. Don't manage default_settings.py #41
- manage user/groups separately #28
Merged pull requests:
- params: Make key and cert undef. #46 (daenney)
- Output the REPORTS_COUNT parameter to settings.py. Otherwise node pages ... #44 (sigmunau)
- Update wsgi.py.erb #43 (tommodore)
- move custom settings into settings.py. #42 (rmnwolf)
- Improve the docs after having tested the module #39 (nibalizer)
- Update Rakefile to ignore vendor gems in syntax task #38 (cmurphy)
- Quotes in conf file #37 (nibalizer)
- Beaker2 #36 (nibalizer)
- Adding lint and syntax testing #32 (nibalizer)
- introduce a prefix (wsgi_alias) into ::vhost #31 (igalic)
- Add the 'localise_timestamp' configuration option #30 (tomtheun)
- make managing of user/group optional #29 (igalic)
2.4.0 (2014-05-29)
Closed issues:
- Add a virtualenv dependency. Getting "Error: sh: 1: virtualenv: not found" #23
- Add git package dependency #21
- Offer security (ie basic auth) #19
- Allow configuration with SSL #18
- needs non-librarian(?) install instructions #16
Merged pull requests:
- Remove Puppetfile #26 (mcallaway)
- Ensure virtualenv package is 'installed' instead of 'true' #25 (nickchappell)
- Add support for virtualenv #24 (nibalizer)
- add a flag to manage git #22 (nibalizer)
- Add support for setting the git repository source. #20 (jasperla)
- Permit passing $proxy param #17 (hakamadare)
- Add stdlib version requirement to Modulefile #15 (bderickson)
- Users can specify Puppetboard Git SHA to use #14 (bderickson)
1.3.0 (2014-01-23)
Merged pull requests:
- PUPPETDB_SSL setting is now PUPPETDB_SSL_VERIFY #13 (fpletz)
- Document parameters for all classes, and variables used by templates #12 (jantman)
- Fix problem with pip install git requirement #11 (pavel-drobushevich)
1.1.0 (2013-11-25)
Closed issues:
Merged pull requests:
- add class parameters to configure default_settings.py #10 (juliushaertl)
- change base install directory to '$basedir' #9 (ashleygould)
- Fix typo in $docroot declaration #8 (cmurphy)
- Fix parameter list typo in README #5 (cmurphy)
- Fix parameter list typo in README #4 (cmurphy)
- Refactor module #3 (jtopjian)
- Update module dependencies #2 (blkperl)
* This Changelog was automatically generated by github_changelog_generator
Dependencies
- puppetlabs/stdlib (>= 4.13.1 < 6.0.0)
- puppet/python (>= 1.12.0 < 3.0.0)
- puppetlabs/vcsrepo (>= 1.3.1 < 3.0.0)
Copyright (C) 2013-2014 Spencer Krum 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