Version information
This version is compatible with:
- Puppet Enterprise 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
- Puppet >= 6.0.0 < 8.0.0
- , , , , , , , ,
Tasks:
- reboot
- last_boot_time
Plans:
- reboot
Start using this module
Add this module to your Puppetfile:
mod 'puppetlabs-reboot', '4.0.0'Learn more about managing modules with a PuppetfileDocumentation
reboot
Table of Contents
- Overview
- Module Description - What the reboot module does and why it is useful
- Setup - The basics of getting started with reboot
- 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 adds a type, and both Windows and generic POSIX providers, for managing target reboots.
Module Description
Some packages require a reboot of the target to complete their installation. Until that reboot is completed, the package might not be fully functional, and other installs might fail. This module provides a resource type to let Puppet perform that reboot, and providers to support Windows and POSIX systems. HP-UX is not supported.
By default, this module only reboots a target in response to another resource being applied --- e.g., after a package install. On Windows targets, you can also have Puppet check for pending reboots and complete them before applying the next resource in the catalog, by specifying when => pending.
Setup
Setup Requirements
On Windows targets, the 'shutdown.exe' command must be in the PATH.
On Windows 2003 (non-R2) x64 targets, KB942589 must be installed.
Beginning with reboot
The reboot module should work right out of the box. To test it, install a package (in this case 'SomePackage') and set up the module to reboot as follows:
package { 'SomePackage':
ensure => installed,
source => '\\server\share\some_installer.exe',
install_options => ['/Passive', '/NoRestart'],
}
reboot { 'after':
subscribe => Package['SomePackage'],
}
Usage
Complete any pending reboots before installing a package
reboot { 'before':
when => pending,
}
package { 'SomePackage':
ensure => installed,
source => '\\server\share\some_installer.exe',
install_options => ['/Passive', '/NoRestart'],
require => Reboot['before'],
}
Install multiple packages before rebooting
By default, when this module triggers a reboot, it skips any resources in the catalog that have not yet been applied. To apply the entire catalog before rebooting, specify apply => finished. For example, if you have several packages that all require reboots, but will not block each other:
package { 'Microsoft .NET Framework 4.5':
ensure => installed,
...
notify => Reboot['after_run'],
}
package { 'Microsoft Windows SDK for Windows 7 (7.0)':
ensure => installed,
...
notify => Reboot['after_run'],
}
reboot { 'after_run':
apply => finished,
}
Reboot when certain conditions are met
This usage applies to Windows only.
When using when => pending, use onlyif or unless to specify the reasons for which to reboot.
reboot { 'reboot on file renames':
when => 'pending',
onlyif => 'pending_file_rename_operations'
}
The possible reasons for rebooting are:
- reboot_required: A reboot has manually been requested through the provider.
- component_based_servicing: A new component has been installed.
- windows_auto_update: An automatic update requested a reboot.
- pending_file_rename_operations: There are files that need to be renamed at the next reboot.
- package_installer: A software update requested a reboot.
- package_installer_syswow64: A software update requested a reboot.
- pending_computer_rename: The computer needs to be renamed.
- pending_dsc_reboot: DSC has requested a reboot.
- pending_ccm_reboot: CCM has requested a reboot.
- pending_domain_join: System has joined domain and is pending a reboot.
Reference
Type: reboot
The main type of the module, responsible for all its functionality.
Providers
windows: Default for :operatingsystem => :windowslinux: Deprecated. Useposixinstead.posix: Default for :feature => :posix
Features
manages_reboot_pending: Detects whether a reboot is pending due to a prior change. If so, reboot the target. (Available with thewindowsprovider.)
Parameters
apply
Optional. Specifies when to apply the reboot. If set to 'immediately', the provider stops applying additional resources and performs the reboot as soon as Puppet finishes syncing. If set to 'finished', it continues applying resources and then performs the reboot at the end of the run. Valid options: 'immediately' and 'finished'. Default value: 'immediately'.
Note: With the default setting of 'immediately', resources further down in the catalog are skipped and recorded as such. (In Puppet versions prior to 3.3.0, they're left out of the report entirely.) The next time Puppet runs, it processes the skipped resources normally, and they might trigger additional reboots.
message
Optional. Provides a message to log when the reboot is performed. Valid options: a string. Default value: undefined.
name
Required. Sets the name of the reboot resource. Valid options: a string.
timeout
Optional. Sets the number of seconds to wait after the Puppet run completes for the reboot to happen. If the timeout is exceeded, the provider cancels the reboot. Valid options: any positive integer. Default value: '60'.
Note: POSIX systems (with the exception of Solaris) only support specifying the timeout as minutes. As such, the value of timeout must be a multiple of 60. Other values will be rounded up to the nearest minute and a warning will be issued.
when
Optional. Specifies how reboots are triggered. If set to 'refreshed', the provider only reboots the target in response to a refresh event from another resource, e.g., installing a package. If set to 'pending', Puppet checks for signs of any pending reboots and completes them before applying the next resource in the catalog. Valid options: 'refreshed' and 'pending'. Default value: 'refreshed'.
Note: For when => pending reboots, Puppet can normally detect a pending reboot based on some specific system conditions (such as the existence of the PendingFileRenameOperations registry key). However, if those conditions aren't resolved after the target reboots, Puppet triggers another reboot. This can lead to a reboot loop.
onlyif
Optional. Applies a pending reboot only for the specified reasons. This can take a single reason or an array of reasons.
See the Reboot when certain conditions are met section for reasons why you might reboot.
unless
Optional. Ignores the specified reasons when checking for a pending reboot. This can take a single reason or an array of reasons.
See the Reboot when certain conditions are met section for reasons why you might reboot.
Plan: reboot
This plan is intended to be used as part of other plans and allows Bolt to wait for a server to reboot before continuing. It requires Bolt 1.0+ and/or PE 2019.0+.
NOTE: The nodes parameters is deprecated in Bolt 2.0, and has been updated here to targets.
This breaks plans or workflows that explicitly call the nodes parameter, however this module is
still compatible with Bolt 1.x specifying the targets parameter instead.
Here is an example of using this module to reboot servers, wait for them to come back, then check the status of a service:
plan myapp::patch (
TargetSpec $servers,
TargetSpec $version,
) {
# Upgrade the application
run_task('myapp::upgrade', $servers, { 'version' => $version })
# Reboot the servers. This app is slow to shut down so give them 5 minutes to reboot.
run_plan('reboot', $servers, reconnect_timeout => 300)
# Check the status of the service
return run_task('service', $servers, {
'name' => 'myapp',
'action' => 'status',
})
}
Return value
The reboot plan returns a ResultSet on success. It also returns a ResultSet if fail_plan_on_errors is false.
The plan may raise an Error if any targets fail to reboot and fail_plan_on_errors is set to true. In that circumstance, the error raised will contain the ResultSet in its details key.
$plan_result = run_plan('reboot', targets => $targets)
$results = case $plan_result {
Error: { $plan_result.details['result_set'] }
default: { $plan_result }
}
$results.ok_set.targets # Targets that successfully rebooted
$results.error_set.targets # Targets that did not successfully reboot
Parameters
targets
A TargetSpec object containing all targets to wait for.
message
An optional message to log when rebooting.
reboot_delay
How long (in seconds) to wait before shutting down. Defaults to 0, shutdown immediately.
disconnect_wait
How long (in seconds) to wait before checking whether the server has rebooted. Defaults to 1.
reconnect_timeout
How long (in seconds) to attempt to reconnect before giving up. Defaults to 180.
retry_interval
How long (in seconds) to wait between retries. Defaults to 1.
fail_plan_on_errors
Whether or not to raise an exception if any targets fail to reboot. Defaults to true.
Setting this value to false allows the return value of a plan to be treated the same way a task return value with _catch_errors => true would be treated.
plan myapp::patch (
TargetSpec $targets,
String $version,
) {
$target_objects = get_targets($targets)
# Upgrade the application
$step1_results = run_task('myapp::upgrade', $target_objects,
version => $version,
_catch_errors => true,
)
# Reboot the servers. This app is slow to shut down so give them 5 minutes to reboot.
$step2_results = run_plan('reboot', targets => $step1_results.ok_set.targets,
reconnect_timeout => 300
fail_plan_on_errors => false,
)
# Check the status of the service
$step3_results = run_task('service', $step2_results.ok_set.targets,
name => 'myapp',
action => 'status',
_catch_errors => true,
)
return({
'errored-at-step1' => $step1_results.error_set.names,
'errored-at-step2' => $step2_results.error_set.names,
'errored-at-step3' => $step3_results.error_set.names,
'succeeded' => $step3_results.ok_set.names,
}.filter |$_, $names| { ! $names.empty })
}
Limitations
For an extensive list of supported operating systems, see metadata.json
Development
Puppet Labs modules on the Puppet Forge are open projects, and community contributions are essential for keeping them great. We can’t access the huge number of platforms and myriad of hardware, software, and deployment configurations that Puppet is intended to serve.
We want to keep it as easy as possible to contribute changes so that our modules work in your environment. There are a few guidelines that we need contributors to follow so that we can have a chance of keeping on top of things.
For more information, see our module contribution guide.
Contributors
To see who's already involved, see the list of contributors.
Reference
Table of Contents
Resource types
Functions
reboot::sleep: Sleeps for specified number of seconds.
Tasks
init: Reboots a machinelast_boot_time: Gets the last boot time of a Linux or Windows systemlast_boot_time_nix: Gets the last boot time of a Linux systemlast_boot_time_win: Gets the last boot time of a Windows systemnix: Reboots a machinewin: Reboots a machine
Plans
reboot: Reboots targets and waits for them to be available again.
Resource types
reboot
The reboot type.
Properties
The following properties are available in the reboot type.
when
Valid values: refreshed, pending
When to check for, and if needed, perform a reboot. If pending,
then the provider will check if a reboot is pending, and only
if needed, reboot the system. If refreshed then the reboot
will only be performed in response to a refresh event from
another resource, e.g. package.
Default value: refreshed
Parameters
The following parameters are available in the reboot type.
apply
Valid values: immediately, finished
When to apply the reboot. If immediately, then the provider
will stop applying additional resources and apply the reboot once
puppet has finished syncing. If finished, it will continue
applying resources and then perform a reboot at the end of the
run. The default is immediately.
Default value: immediately
message
Default value: Puppet is rebooting the computer
name
namevar
onlyif
For pending reboots, only reboot if the reboot is pending for one of the supplied reasons.
provider
The specific backend to use for this reboot resource. You will seldom need to specify this --- Puppet will usually
discover the appropriate provider for your platform.
timeout
The amount of time in seconds to wait between the time the reboot is requested and when the reboot is performed. The default timeout is 60 seconds. Note that this time starts once puppet has exited the current run.
Default value: 60
unless
For pending reboots, ignore the supplied reasons when checking pennding reboot
Functions
reboot::sleep
Type: Ruby 4.x API
Sleeps for specified number of seconds.
reboot::sleep(Integer $period)
Sleeps for specified number of seconds.
Returns: Any
period
Data type: Integer
Time to sleep (in seconds)
Tasks
init
Reboots a machine
Supports noop? false
Parameters
timeout
Data type: Optional[Variant[Pattern[/^[0-9]*$/],Integer]]
Timeout before shutdown (seconds); enforces a minimum of 3s
message
Data type: Optional[Pattern[/^[^|&]*$/]]
Shutdown message for systems that support it
shutdown_only
Data type: Optional[Boolean]
Only shut the machine down, do not reboot
last_boot_time
Gets the last boot time of a Linux or Windows system
Supports noop? false
last_boot_time_nix
Gets the last boot time of a Linux system
Supports noop? false
last_boot_time_win
Gets the last boot time of a Windows system
Supports noop? false
nix
Reboots a machine
Supports noop? false
Parameters
timeout
Data type: Optional[Integer[3]]
Timeout before shutdown (seconds)
message
Data type: Optional[Pattern[/^[^|&]*$/]]
Shutdown message for systems that support it
shutdown_only
Data type: Optional[Boolean]
Only shut the machine down, do not reboot
win
Reboots a machine
Supports noop? false
Parameters
timeout
Data type: Optional[Integer[3]]
Timeout before shutdown (seconds)
message
Data type: Optional[Pattern[/^[^|&]*$/]]
Shutdown message for systems that support it
shutdown_only
Data type: Optional[Boolean]
Only shut the machine down, do not reboot
Plans
reboot
Reboots targets and waits for them to be available again.
Parameters
The following parameters are available in the reboot plan:
targets
Data type: TargetSpec
Targets to reboot.
message
Data type: Optional[String]
Message to log with the reboot (for platforms that support it).
Default value: undef
reboot_delay
Data type: Integer[1]
How long (in seconds) to wait before rebooting. Defaults to 1.
Default value: 1
disconnect_wait
Data type: Integer[0]
How long (in seconds) to wait before checking whether the server has rebooted. Defaults to 10.
Default value: 10
reconnect_timeout
Data type: Integer[0]
How long (in seconds) to attempt to reconnect before giving up. Defaults to 180.
Default value: 180
retry_interval
Data type: Integer[0]
How long (in seconds) to wait between retries. Defaults to 1.
Default value: 1
fail_plan_on_errors
Data type: Boolean
Raise an error if any targets do not successfully reboot. Defaults to true.
Default value: true
What are tasks?
Modules can contain tasks that take action outside of a desired state managed by Puppet. It’s perfect for troubleshooting or deploying one-off changes, distributing scripts to run across your infrastructure, or automating changes that need to happen in a particular order as part of an application deployment.
Tasks in this module release
last_boot_time
Gets the last boot time of a Linux or Windows system
What are plans?
Modules can contain plans that take action outside of a desired state managed by Puppet. It’s perfect for troubleshooting or deploying one-off changes, distributing scripts to run across your infrastructure, or automating changes that need to happen in a particular order as part of an application deployment.
Change log
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.
v4.0.0 (2021-02-27)
Changed
- pdksync - Remove Puppet 5 from testing and bump minimal version to 6.0.0 #275 (carabasdaniel)
v3.2.0 (2021-01-19)
Added
- pdksync - (feat) Add support for Puppet 7 #265 (daianamezdrea)
v3.1.0 (2020-11-17)
Added
- pdksync - (IAC-973) - Update travis/appveyor to run on new default branch
main#253 (david22swan)
v3.0.0 (2020-02-27)
Changed
v2.4.0 (2020-02-03)
Added
- Add
shutdown\_onlyparameter to tasks #224 (MikaelSmith)
v2.3.0 (2019-12-06)
Added
- (FM-8700) - Addition of Support for CentOs 8 #221 (david22swan)
- pdksync - Add support on Debian10 #218 (lionce)
Fixed
2.2.0 (2019-07-24)
v2.2.0 (2019-07-24)
Added
- Fix plan return value #209 (reidmv)
- (FM-8051) Add RedHat 8 support #207 (eimlav)
- MODULES-8726: Ensure sbin is in the path #205 (xalimar)
- (MODULES-8148) - Add SLES 15 support #191 (eimlav)
Fixed
- Add additional guards for nix process detach #210 (reidmv)
- [MODULES-8718] Check for root or sudo in the reboot task nix.sh script #203 (thilinapiy)
- (MODULES-8717) Fix dependency issue on boltspec #202 (HelenCampbell)
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.
[Unreleased]
[2.1.2] - 2018-12-13
Fixed
- Fix infinite reboot plan wait loop on Windows when reboot takes under a minute (MODULES-8353)
- Mark last_boot_time task implementations as private so they're not listed by Bolt.
[2.1.1] - 2018-12-06
Added
- Use wait_until_available to reduce task runs (BOLT-956)
- Add bash and powershell implementations of reboot task (BOLT-459)
- Support for Puppet 6 (MODULES-7832)
- Add Rubocop to enforce PDK rules (MODULES-5896)
- Add Beaker Testmode Switcher (MODULES-6745)
- Add acceptance-test support for Debian 9, Ubuntu 16.04 and Ubuntu 18.04 (MODULES-7417)
Changed
- Update limitations in README (MODULES-7634)
- Convert module to PDK format (MODULES-7403)
- Use Beaker 4 (MODULES-7658)
Fixed
- Fix conditionals in Windows provider (MODULES-3975)
Removed
- Support for SLES 5 and Debian 7 (FM-6968)
Security
- Fix CVE-2018-6508
[2.0.0] - 2018-01-23
Added
- Support for Puppet 5
- Add a Puppet Task for performing on-demand reboots (MODULES5804)
- Add capability to reboot a Windows machine if specific conditions are met via the
onlyifparameter (MODULES-4328) - Add capability to prevent a reboot resource from rebooting a Windows machine if specific conditions are met via the
unlessparameter (MODULES-4328)
Fixed
- Converted test framework from Beaker to Beaker-RSpec (MODULES-5977)
Removed
- Ended support for Puppet 3
[1.2.1] - 2015-11-24
Added
- Pending reboot - Allow setting a flag directly on provider (MODULES-2822)
Changed
- Fix use of read method from Registry (MODULES-2804)
[1.2.0] - 2015-10-14
Added
- Pending reboot - detect computer rename (MODULES-2657)
- Pending reboot - Detect DSC pending reboot state (MODULES-2658)
- Pending reboot - Detect CCM pending reboot state (MODULES-2659)
Changed
- Fix Linux provider failing (MODULES-2585)
[1.1.0] - 2015-07-28 - Supported Release 1.1.0
Added
- Add notice when system is scheduling a reboot
Changed
- Move Linux provider to use new POSIX provider
- Fix Unit and Acceptance Test cases
[1.0.0] - 2015-04-15
Added
- Linux support
Changed
- Reboot is now triggered
at_exitinstead of watching for ruby process to end
Removed
- Prompt for windows reboot
catalog_apply_timeoutparameter
[0.1.9] - 2014-11-11
Changed
- Fixes issues URL in metadata
[0.1.8] - 2014-08-25
Changed
- Fixes for working on x64-native ruby.
[0.1.7] - 2014-07-15
Changed
- Update
metadata.jsonso the module can be uninstalled and upgraded via thepuppet modulecommand.
[0.1.6] - 2014-04-15
Changed
- Updated metadata.
[0.1.5] - 2014-03-04
Added
- The version is
0.xbut should be considered a1.xfor semantic versioning purposes.
[0.1.4] - 2014-02-07
Changed
- Add a workaround for a ruby bug that can prevent ruby.exe from exiting (PUP-1578)
[0.1.2] - 2013-09-27
Changed
- Never load sample.pp in production
[0.1.1] - 2013-09-27
- Only manage reboot resources on systems where shutdown.exe exists (FM-105)
- Module does not work on Windows 2003 (FM-106)
- Update description in init.pp (PP-433)
[0.1.0] - 2013-09-17
Added
- Initial release of the reboot module
* This Changelog was automatically generated by github_changelog_generator
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.
