Add logrotate cookbook
This commit is contained in:
parent
096b4900bd
commit
5d11298c1d
1
Batali
1
Batali
@ -37,5 +37,6 @@ Batali.define do
|
|||||||
cookbook 'timezone-ii'
|
cookbook 'timezone-ii'
|
||||||
cookbook 'nodejs', '~> 2.4.4'
|
cookbook 'nodejs', '~> 2.4.4'
|
||||||
cookbook 'ark'
|
cookbook 'ark'
|
||||||
|
cookbook 'logrotate'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -879,6 +879,18 @@
|
|||||||
"url": "https://supermarket.chef.io:443/api/v1/cookbooks/timezone-ii/versions/0.2.0/download",
|
"url": "https://supermarket.chef.io:443/api/v1/cookbooks/timezone-ii/versions/0.2.0/download",
|
||||||
"version": "0.2.0"
|
"version": "0.2.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "logrotate",
|
||||||
|
"dependencies": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"version": "1.9.2",
|
||||||
|
"source": {
|
||||||
|
"type": "Batali::Source::Site",
|
||||||
|
"url": "https://supermarket.chef.io:443/api/v1/cookbooks/logrotate/versions/1.9.2/download",
|
||||||
|
"version": "1.9.2"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
25
cookbooks/logrotate/.gitignore
vendored
Normal file
25
cookbooks/logrotate/.gitignore
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
*~
|
||||||
|
*#
|
||||||
|
.#*
|
||||||
|
\#*#
|
||||||
|
.*.sw[a-z]
|
||||||
|
*.un~
|
||||||
|
*.tmp
|
||||||
|
*.bk
|
||||||
|
*.bkup
|
||||||
|
.kitchen.local.yml
|
||||||
|
Berksfile.lock
|
||||||
|
|
||||||
|
.bundle/
|
||||||
|
.cache/
|
||||||
|
.kitchen/
|
||||||
|
.vagrant/
|
||||||
|
.vagrant.d/
|
||||||
|
bin/
|
||||||
|
tmp/
|
||||||
|
vendor/
|
||||||
|
|
||||||
|
# RVM
|
||||||
|
.ruby-version
|
||||||
|
.ruby-gemset
|
||||||
|
.rvmrc
|
20
cookbooks/logrotate/.kitchen.yml
Normal file
20
cookbooks/logrotate/.kitchen.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
driver_plugin: vagrant
|
||||||
|
driver_config:
|
||||||
|
require_chef_omnibus: true
|
||||||
|
|
||||||
|
platforms:
|
||||||
|
- name: ubuntu-12.04
|
||||||
|
run_list:
|
||||||
|
- recipe[fake::prep]
|
||||||
|
- name: centos-6.5
|
||||||
|
|
||||||
|
suites:
|
||||||
|
- name: default
|
||||||
|
run_list:
|
||||||
|
- recipe[logrotate::default]
|
||||||
|
- name: definition
|
||||||
|
run_list:
|
||||||
|
- recipe[fake::definition]
|
||||||
|
- name: global
|
||||||
|
run_list:
|
||||||
|
- recipe[logrotate::global]
|
4
cookbooks/logrotate/.rubocop.yml
Normal file
4
cookbooks/logrotate/.rubocop.yml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
AllCops:
|
||||||
|
Exclude:
|
||||||
|
- vendor/**
|
||||||
|
- .kitchen/**
|
6
cookbooks/logrotate/.travis.yml
Normal file
6
cookbooks/logrotate/.travis.yml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
rvm:
|
||||||
|
- 2.0.0
|
||||||
|
script:
|
||||||
|
- bundle exec foodcritic -f any . --tags ~FC015
|
||||||
|
- bundle exec rspec --color --format progress
|
||||||
|
- bundle exec rubocop -l
|
108
cookbooks/logrotate/CHANGELOG.md
Normal file
108
cookbooks/logrotate/CHANGELOG.md
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
logrotate Cookbook CHANGELOG
|
||||||
|
============================
|
||||||
|
This file is used to list changes made in each version of the
|
||||||
|
logrotate cookbook.
|
||||||
|
|
||||||
|
v1.8.0
|
||||||
|
------
|
||||||
|
|
||||||
|
### Resolved Bugs
|
||||||
|
|
||||||
|
- `su` parameter now supported in global config.
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
|
||||||
|
- firstaction and lastaction attributes documented in the README
|
||||||
|
- rotate attribute documented in the README
|
||||||
|
- Use hash-rocket syntax in rspec matcher to maintain 1.9 support.
|
||||||
|
|
||||||
|
v1.7.0
|
||||||
|
------
|
||||||
|
|
||||||
|
### Bugs
|
||||||
|
|
||||||
|
- Use `raise` rather than Application.fatal! to prevent killing a
|
||||||
|
daemonized chef-client
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
|
||||||
|
- Chefspec matcher for logrotate_app definition
|
||||||
|
- Support the following options: compressoptions, maxage,
|
||||||
|
shred/shredcycles, extension, tabooext
|
||||||
|
- Add Solaris support
|
||||||
|
|
||||||
|
|
||||||
|
v1.6.0
|
||||||
|
------
|
||||||
|
|
||||||
|
### Bugs
|
||||||
|
|
||||||
|
- Fix documentation error
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
|
||||||
|
- Support for options "compresscmd", "uncompresscmd", "compressext"
|
||||||
|
- Allow nodateext as parameter for logrotate_app definition
|
||||||
|
- Move to chefspec ~> 3.0
|
||||||
|
|
||||||
|
v1.5.0
|
||||||
|
------
|
||||||
|
|
||||||
|
### Bugs
|
||||||
|
- Fix missing end tag in template
|
||||||
|
- Don't re-initialize constants.
|
||||||
|
- Fix rubocop finding
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- [COOK-3911] Allow to use maxsize parameter.
|
||||||
|
- [COOK-4000] Allow to use dateyesterday option.
|
||||||
|
- [COOK-4024] Allow to use su parameter.
|
||||||
|
- [COOK-4175] Allows use of the dateformat parameter.
|
||||||
|
- Loosen test-kitchen version constraint
|
||||||
|
- Add rvm files to gitignore
|
||||||
|
|
||||||
|
|
||||||
|
v1.4.0
|
||||||
|
------
|
||||||
|
### Bug
|
||||||
|
- **[COOK-3632](https://tickets.chef.io/browse/COOK-3632)** - Raise Exception when adding more than one invalid option
|
||||||
|
- **[COOK-3141](https://tickets.chef.io/browse/COOK-3141)** - Do not duplicate template entires for multiple paths
|
||||||
|
- **[COOK-3034](https://tickets.chef.io/browse/COOK-3034)** - Update logrotate_app params to accept arrays and strings
|
||||||
|
|
||||||
|
### Improvement
|
||||||
|
- **[COOK-2646](https://tickets.chef.io/browse/COOK-2646)** - Add ability to choose file mode for logrotate template
|
||||||
|
|
||||||
|
v1.3.0
|
||||||
|
------
|
||||||
|
### Improvement
|
||||||
|
- **[COOK-3341](https://tickets.chef.io/browse/COOK-3341)** - Add optional `frequency` and `rotate` params when defined globally
|
||||||
|
- **[COOK-3298](https://tickets.chef.io/browse/COOK-3298)** - Use `Array` instead of `respond_to?(:each)`
|
||||||
|
- **[COOK-3285](https://tickets.chef.io/browse/COOK-3285)** - Change `logrotate.d` config file mode to `0644`
|
||||||
|
- **[COOK-3250](https://tickets.chef.io/browse/COOK-3250)** - Add `minsize`
|
||||||
|
|
||||||
|
### Bug
|
||||||
|
- **[COOK-3274](https://tickets.chef.io/browse/COOK-3274)** - Fix README typo that suggested the opposite action
|
||||||
|
|
||||||
|
### New Feature
|
||||||
|
- **[COOK-2923](https://tickets.chef.io/browse/COOK-2923)** - Add `olddir` option
|
||||||
|
- **[COOK-1651](https://tickets.chef.io/browse/COOK-1651)** - Add `dateext` ability
|
||||||
|
|
||||||
|
v1.2.2
|
||||||
|
-----
|
||||||
|
### Bug
|
||||||
|
- [COOK-2872]: Add firstaction/lastaction ability to logrotate
|
||||||
|
- [COOK-2908]: Argument error in `logrotate_app` definition
|
||||||
|
|
||||||
|
v1.2.0
|
||||||
|
-----
|
||||||
|
- [COOK-2401] - Add the ability to manage the global logrotate configuration
|
||||||
|
|
||||||
|
v1.1.0
|
||||||
|
-----
|
||||||
|
- [COOK-2218] - Logrotate size parameter
|
||||||
|
|
||||||
|
v1.0.2
|
||||||
|
-----
|
||||||
|
- [COOK-1027] - Add support for pre-/post-rotate commands
|
||||||
|
- [COOK-1338] - Update log rotate for more flexibility of rotate options
|
||||||
|
- [COOK-1598] - "Create" isn't a mandatory option
|
16
cookbooks/logrotate/CONTRIBUTING.md
Normal file
16
cookbooks/logrotate/CONTRIBUTING.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
## Contribution Guidelines
|
||||||
|
|
||||||
|
- Please submit improvements and bug fixes via Github pull requests or
|
||||||
|
by sending an email to steve@chef.io in git's format-patch
|
||||||
|
format.
|
||||||
|
|
||||||
|
- All patches should have well-written commit message. The first line
|
||||||
|
should summarize the change while the rest of the commit message
|
||||||
|
should explain the reason the change is needed.
|
||||||
|
|
||||||
|
- Please ensure all tests and lint checking pass before submitting
|
||||||
|
pull requests.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
Please read TESTING.md for details on testing this cookbook.
|
9
cookbooks/logrotate/Gemfile
Normal file
9
cookbooks/logrotate/Gemfile
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
source 'https://rubygems.org'
|
||||||
|
gem 'chefspec', '~> 4.0'
|
||||||
|
gem 'foodcritic', '~> 4.0'
|
||||||
|
gem 'rubocop', '~> 0.12'
|
||||||
|
|
||||||
|
group :integration do
|
||||||
|
gem 'test-kitchen', '~> 1.0'
|
||||||
|
gem 'kitchen-vagrant', '~> 0.11'
|
||||||
|
end
|
150
cookbooks/logrotate/Gemfile.lock
Normal file
150
cookbooks/logrotate/Gemfile.lock
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
ast (2.0.0)
|
||||||
|
astrolabe (1.3.0)
|
||||||
|
parser (>= 2.2.0.pre.3, < 3.0)
|
||||||
|
chef (12.0.3)
|
||||||
|
chef-zero (~> 3.2)
|
||||||
|
diff-lcs (~> 1.2, >= 1.2.4)
|
||||||
|
erubis (~> 2.7)
|
||||||
|
ffi-yajl (~> 1.2)
|
||||||
|
highline (~> 1.6, >= 1.6.9)
|
||||||
|
mixlib-authentication (~> 1.3)
|
||||||
|
mixlib-cli (~> 1.4)
|
||||||
|
mixlib-config (~> 2.0)
|
||||||
|
mixlib-log (~> 1.3)
|
||||||
|
mixlib-shellout (>= 2.0.0.rc.0, < 3.0)
|
||||||
|
net-ssh (~> 2.6)
|
||||||
|
net-ssh-multi (~> 1.1)
|
||||||
|
ohai (~> 8.0)
|
||||||
|
plist (~> 3.1.0)
|
||||||
|
pry (~> 0.9)
|
||||||
|
chef-zero (3.2.1)
|
||||||
|
ffi-yajl (~> 1.1)
|
||||||
|
hashie (~> 2.0)
|
||||||
|
mixlib-log (~> 1.3)
|
||||||
|
rack
|
||||||
|
uuidtools (~> 2.1)
|
||||||
|
chefspec (4.2.0)
|
||||||
|
chef (>= 11.14)
|
||||||
|
fauxhai (~> 2.0)
|
||||||
|
rspec (~> 3.0)
|
||||||
|
coderay (1.1.0)
|
||||||
|
diff-lcs (1.2.5)
|
||||||
|
erubis (2.7.0)
|
||||||
|
fauxhai (2.3.0)
|
||||||
|
net-ssh
|
||||||
|
ohai
|
||||||
|
ffi (1.9.6)
|
||||||
|
ffi-yajl (1.4.0)
|
||||||
|
ffi (~> 1.5)
|
||||||
|
libyajl2 (~> 1.2)
|
||||||
|
foodcritic (4.0.0)
|
||||||
|
erubis
|
||||||
|
gherkin (~> 2.11)
|
||||||
|
nokogiri (~> 1.5)
|
||||||
|
rake
|
||||||
|
rufus-lru (~> 1.0)
|
||||||
|
treetop (~> 1.4)
|
||||||
|
yajl-ruby (~> 1.1)
|
||||||
|
gherkin (2.12.2)
|
||||||
|
multi_json (~> 1.3)
|
||||||
|
hashie (2.1.2)
|
||||||
|
highline (1.7.1)
|
||||||
|
ipaddress (0.8.0)
|
||||||
|
kitchen-vagrant (0.15.0)
|
||||||
|
test-kitchen (~> 1.0)
|
||||||
|
libyajl2 (1.2.0)
|
||||||
|
method_source (0.8.2)
|
||||||
|
mime-types (2.4.3)
|
||||||
|
mini_portile (0.6.2)
|
||||||
|
mixlib-authentication (1.3.0)
|
||||||
|
mixlib-log
|
||||||
|
mixlib-cli (1.5.0)
|
||||||
|
mixlib-config (2.1.0)
|
||||||
|
mixlib-log (1.6.0)
|
||||||
|
mixlib-shellout (2.0.1)
|
||||||
|
multi_json (1.10.1)
|
||||||
|
net-dhcp (1.3.2)
|
||||||
|
net-scp (1.2.1)
|
||||||
|
net-ssh (>= 2.6.5)
|
||||||
|
net-ssh (2.9.2)
|
||||||
|
net-ssh-gateway (1.2.0)
|
||||||
|
net-ssh (>= 2.6.5)
|
||||||
|
net-ssh-multi (1.2.0)
|
||||||
|
net-ssh (>= 2.6.5)
|
||||||
|
net-ssh-gateway (>= 1.2.0)
|
||||||
|
nokogiri (1.6.6.2)
|
||||||
|
mini_portile (~> 0.6.0)
|
||||||
|
ohai (8.1.1)
|
||||||
|
ffi (~> 1.9)
|
||||||
|
ffi-yajl (~> 1.1)
|
||||||
|
ipaddress
|
||||||
|
mime-types (~> 2.0)
|
||||||
|
mixlib-cli
|
||||||
|
mixlib-config (~> 2.0)
|
||||||
|
mixlib-log
|
||||||
|
mixlib-shellout (~> 2.0)
|
||||||
|
net-dhcp
|
||||||
|
rake (~> 10.1)
|
||||||
|
systemu (~> 2.6.4)
|
||||||
|
wmi-lite (~> 1.0)
|
||||||
|
parser (2.2.0.3)
|
||||||
|
ast (>= 1.1, < 3.0)
|
||||||
|
plist (3.1.0)
|
||||||
|
polyglot (0.3.5)
|
||||||
|
powerpack (0.1.0)
|
||||||
|
pry (0.10.1)
|
||||||
|
coderay (~> 1.1.0)
|
||||||
|
method_source (~> 0.8.1)
|
||||||
|
slop (~> 3.4)
|
||||||
|
rack (1.6.0)
|
||||||
|
rainbow (2.0.0)
|
||||||
|
rake (10.4.2)
|
||||||
|
rspec (3.2.0)
|
||||||
|
rspec-core (~> 3.2.0)
|
||||||
|
rspec-expectations (~> 3.2.0)
|
||||||
|
rspec-mocks (~> 3.2.0)
|
||||||
|
rspec-core (3.2.0)
|
||||||
|
rspec-support (~> 3.2.0)
|
||||||
|
rspec-expectations (3.2.0)
|
||||||
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
|
rspec-support (~> 3.2.0)
|
||||||
|
rspec-mocks (3.2.0)
|
||||||
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
|
rspec-support (~> 3.2.0)
|
||||||
|
rspec-support (3.2.1)
|
||||||
|
rubocop (0.29.1)
|
||||||
|
astrolabe (~> 1.3)
|
||||||
|
parser (>= 2.2.0.1, < 3.0)
|
||||||
|
powerpack (~> 0.1)
|
||||||
|
rainbow (>= 1.99.1, < 3.0)
|
||||||
|
ruby-progressbar (~> 1.4)
|
||||||
|
ruby-progressbar (1.7.1)
|
||||||
|
rufus-lru (1.0.5)
|
||||||
|
safe_yaml (1.0.4)
|
||||||
|
slop (3.6.0)
|
||||||
|
systemu (2.6.4)
|
||||||
|
test-kitchen (1.3.1)
|
||||||
|
mixlib-shellout (>= 1.2, < 3.0)
|
||||||
|
net-scp (~> 1.1)
|
||||||
|
net-ssh (~> 2.7)
|
||||||
|
safe_yaml (~> 1.0)
|
||||||
|
thor (~> 0.18)
|
||||||
|
thor (0.19.1)
|
||||||
|
treetop (1.5.3)
|
||||||
|
polyglot (~> 0.3)
|
||||||
|
uuidtools (2.1.5)
|
||||||
|
wmi-lite (1.0.0)
|
||||||
|
yajl-ruby (1.2.1)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
chefspec (~> 4.0)
|
||||||
|
foodcritic (~> 4.0)
|
||||||
|
kitchen-vagrant (~> 0.11)
|
||||||
|
rubocop (~> 0.12)
|
||||||
|
test-kitchen (~> 1.0)
|
201
cookbooks/logrotate/LICENSE
Normal file
201
cookbooks/logrotate/LICENSE
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
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.
|
171
cookbooks/logrotate/README.md
Normal file
171
cookbooks/logrotate/README.md
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
logrotate Cookbook
|
||||||
|
==================
|
||||||
|
[](http://travis-ci.org/stevendanna/logrotate)
|
||||||
|
|
||||||
|
Manages the logrotate package and provides a definition to manage application specific logrotate configuration.
|
||||||
|
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
Should work on any platform that includes a 'logrotate' package and writes logrotate configuration to /etc/logrotate.d. Tested on Ubuntu, Debian and Red Hat/CentOS.
|
||||||
|
|
||||||
|
|
||||||
|
Recipes
|
||||||
|
-------
|
||||||
|
### global
|
||||||
|
Generates and controls a global `/etc/logrotate.conf` file that will include additional files generated by the `logrotate_app` definition (see below). The contents of the configuration file is controlled through node attributes under `node['logrotate']['global']`. The default attributes are based on the configuration from the Ubuntu logrotate package.
|
||||||
|
|
||||||
|
To define a valueless directive (e.g. `compress`, `copy`) simply add an attribute named for the directive with a truthy value :
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
node['logrotate']['global']['compress'] = 'any value here'
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that defining a valueless directive with a falsey value will not make it false, but will remove it:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
# Removes a defaulted 'compress' directive; does not add a 'nocompress' directive.
|
||||||
|
node.override['logrotate']['global']['compress'] = false
|
||||||
|
```
|
||||||
|
|
||||||
|
To fully override a booleanish directive like `compress`, you should probably remove the positive form and add the negative form:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
node.override['logrotate']['global']['compress'] = false
|
||||||
|
node.override['logrotate']['global']['nocompress'] = true
|
||||||
|
```
|
||||||
|
|
||||||
|
The same is true of frequency directives; to be certain the frequency directive you want is included in the global configuration, you should override the ones you don't want as false:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
%w[ daily weekly yearly ].each do |freq|
|
||||||
|
node.override['logrotate']['global'][freq] = false
|
||||||
|
end
|
||||||
|
node.override['logrotate']['global']['monthly'] = true
|
||||||
|
```
|
||||||
|
|
||||||
|
To define a parameter with a value (e.g. `create`, `mail`) add an attribute with the desired value:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
node['logrotate']['global']['create'] = '0644 root adm'
|
||||||
|
```
|
||||||
|
|
||||||
|
To define a path stanza in the global configuration (generally unneeded because of the `logrotate_app` definition) just add an attribute with the path as the name and a hash containing directives and parameters as described above:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
node['logrotate']['global']['/var/log/wtmp'] = {
|
||||||
|
'missingok' => true,
|
||||||
|
'monthly' => true,
|
||||||
|
'create' => '0660 root utmp',
|
||||||
|
'rotate' => 1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`firstaction`, `prerotate`, `postrotate`, and `lastaction` scripts can be defined either as arrays of the lines to put in the script or multiline strings:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
node['logrotate']['global']['/var/log/foo/*.log'] = {
|
||||||
|
'missingok' => true,
|
||||||
|
'monthly' => true,
|
||||||
|
'create' => '0660 root adm',
|
||||||
|
'rotate' => 1,
|
||||||
|
'prerotate' => ['service foo start_rotate', 'logger started foo service log rotation'],
|
||||||
|
'postrotate' => <<-EOF
|
||||||
|
service foo end_rotate
|
||||||
|
logger completed foo service log rotation
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Definitions
|
||||||
|
-----------
|
||||||
|
### logrotate_app
|
||||||
|
This definition can be used to drop off customized logrotate config files on a per application basis.
|
||||||
|
|
||||||
|
The definition takes the following params:
|
||||||
|
|
||||||
|
- `path`: specifies a single path (string) or multiple paths (array) that should have logrotation stanzas created in the config file. No default, this must be specified.
|
||||||
|
- `enable`: true/false, if true it will create the template in /etc/logrotate.d.
|
||||||
|
- `frequency`: sets the frequency for rotation. Default value is 'weekly'. Valid values are: daily, weekly, monthly, yearly, see the logrotate man page for more information.
|
||||||
|
- `dateformat`: specifies date extension with %Y, %m, %d, and %s. The default value is -%Y%m%d.
|
||||||
|
- `size`: Log files are rotated when they grow bigger than size bytes.
|
||||||
|
- `maxsize`: Log files are rotated when they grow bigger than size bytes even before the additionally specified time interval.
|
||||||
|
- `su`: Rotate log files set under this user and group instead of using default user/group.
|
||||||
|
- `template`: sets the template source, default is "logrotate.erb".
|
||||||
|
- `template_mode`: the mode to create the logrotate template with (default "0440")
|
||||||
|
- `template_owner`: the owner of the logrotate template (default "root")
|
||||||
|
- `template_group`: the group of the logrotate template (default "root")
|
||||||
|
- `cookbook`: select the template source from the specified cookbook. By default it will use the template from the logrotate cookbook.
|
||||||
|
- `create`: creation parameters for the logrotate "create" config, follows the form "mode owner group". This is an optional parameter, and is nil by default.
|
||||||
|
- `firstaction`: lines to be executed once before all log files that match the wildcarded pattern are rotated, before pre-rotate script is run and only if at least one log will actually be rotated
|
||||||
|
- `postrotate`: lines to be executed after the log file is rotated
|
||||||
|
- `prerotate`: lines to be executed before the log file is rotated
|
||||||
|
- `lastaction`: lines to be executed once after all log files that match the wildcarded pattern are rotated, after postrotate script is run and only if at least one log is rotated
|
||||||
|
- `rotate`: Log files are rotated this many times before being removed or mailed.
|
||||||
|
- `sharedscripts`: if true, the sharedscripts options is specified which makes sure prescript and postscript commands are run only once (even if multiple files match the path)
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
The default recipe will ensure logrotate is always up to date.
|
||||||
|
|
||||||
|
To create application specific logrotate configs, use the `logrotate_app` definition. For example, to rotate logs for a tomcat application named myapp that writes its log file to `/var/log/tomcat/myapp.log`:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
logrotate_app 'tomcat-myapp' do
|
||||||
|
cookbook 'logrotate'
|
||||||
|
path '/var/log/tomcat/myapp.log'
|
||||||
|
frequency 'daily'
|
||||||
|
rotate 30
|
||||||
|
create '644 root adm'
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
To rotate multiple logfile paths, specify the path as an array:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
logrotate_app 'tomcat-myapp' do
|
||||||
|
cookbook 'logrotate'
|
||||||
|
path ['/var/log/tomcat/myapp.log', '/opt/local/tomcat/catalina.out']
|
||||||
|
frequency 'daily'
|
||||||
|
create '644 root adm'
|
||||||
|
rotate 7
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
To specify which logrotate options, specify the options as an array:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
logrotate_app 'tomcat-myapp' do
|
||||||
|
cookbook 'logrotate'
|
||||||
|
path '/var/log/tomcat/myapp.log'
|
||||||
|
options ['missingok', 'delaycompress', 'notifempty']
|
||||||
|
frequency 'daily'
|
||||||
|
rotate 30
|
||||||
|
create '644 root adm'
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
License & Authors
|
||||||
|
-----------------
|
||||||
|
- Author:: Scott M. Likens (<scott@likens.us>)
|
||||||
|
- Author:: Joshua Timberman (<joshua@chef.io>)
|
||||||
|
|
||||||
|
```text
|
||||||
|
Copyright 2009, Scott M. Likens
|
||||||
|
Copyright 2011-2012, Chef Software, Inc.
|
||||||
|
|
||||||
|
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.
|
||||||
|
```
|
49
cookbooks/logrotate/TESTING.md
Normal file
49
cookbooks/logrotate/TESTING.md
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
This cookbook uses a variety of testing components:
|
||||||
|
|
||||||
|
- Unit tests: [ChefSpec](https://github.com/acrmp/chefspec)
|
||||||
|
- Integration tests: [Test Kitchen](https://github.com/chef/test-kitchen)
|
||||||
|
- Chef Style lints: [Foodcritic](https://github.com/acrmp/foodcritic)
|
||||||
|
- Ruby Style lints: [Rubocop](https://github.com/bbatsov/rubocop)
|
||||||
|
|
||||||
|
|
||||||
|
Prerequisites
|
||||||
|
-------------
|
||||||
|
To develop on this cookbook, you must have a sane Ruby 1.9+ environment. Given the nature of this installation process (and it's variance across multiple operating systems), we will leave this installation process to the user.
|
||||||
|
|
||||||
|
You must also have `bundler` installed:
|
||||||
|
|
||||||
|
$ gem install bundler
|
||||||
|
|
||||||
|
You must also have Vagrant and VirtualBox installed:
|
||||||
|
|
||||||
|
- [Vagrant](https://vagrantup.com)
|
||||||
|
- [VirtualBox](https://virtualbox.org)
|
||||||
|
|
||||||
|
Once installed, you must install the `vagrant-berkshelf` plugin:
|
||||||
|
|
||||||
|
$ vagrant plugin install vagrant-berkshelf
|
||||||
|
|
||||||
|
|
||||||
|
Development
|
||||||
|
-----------
|
||||||
|
1. Clone the git repository from GitHub:
|
||||||
|
|
||||||
|
$ git clone git@github.com:stevendanna/logrotate.git
|
||||||
|
|
||||||
|
2. Install the dependencies using bundler:
|
||||||
|
|
||||||
|
$ bundle install
|
||||||
|
|
||||||
|
3. Create a branch for your changes:
|
||||||
|
|
||||||
|
$ git checkout -b my_bug_fix
|
||||||
|
|
||||||
|
4. Make any changes
|
||||||
|
5. Write tests to support those changes. It is highly recommended you write both unit and integration tests.
|
||||||
|
6. Run the tests:
|
||||||
|
- `bundle exec rspec`
|
||||||
|
- `bundle exec foodcritic .`
|
||||||
|
- `bundle exec rubocop -l `
|
||||||
|
- `bundle exec kitchen test`
|
||||||
|
|
||||||
|
7. Assuming the tests pass, open a Pull Request on GitHub
|
38
cookbooks/logrotate/attributes/default.rb
Normal file
38
cookbooks/logrotate/attributes/default.rb
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#
|
||||||
|
# Cookbook Name:: logrotate
|
||||||
|
# Attribute:: default
|
||||||
|
#
|
||||||
|
# Copyright 2013, Chef
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
default['logrotate']['global'] = {
|
||||||
|
'weekly' => true,
|
||||||
|
'rotate' => 4,
|
||||||
|
'create' => '',
|
||||||
|
|
||||||
|
'/var/log/wtmp' => {
|
||||||
|
'missingok' => true,
|
||||||
|
'monthly' => true,
|
||||||
|
'create' => '0664 root utmp',
|
||||||
|
'rotate' => 1
|
||||||
|
},
|
||||||
|
|
||||||
|
'/var/log/btmp' => {
|
||||||
|
'missingok' => true,
|
||||||
|
'monthly' => true,
|
||||||
|
'create' => '0660 root utmp',
|
||||||
|
'rotate' => 1
|
||||||
|
}
|
||||||
|
}
|
77
cookbooks/logrotate/definitions/logrotate_app.rb
Normal file
77
cookbooks/logrotate/definitions/logrotate_app.rb
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#
|
||||||
|
# Cookbook Name:: logrotate
|
||||||
|
# Definition:: logrotate_instance
|
||||||
|
#
|
||||||
|
# Copyright 2009, Scott M. Likens
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
log_rotate_params = {
|
||||||
|
:enable => true,
|
||||||
|
:frequency => 'weekly',
|
||||||
|
:template => 'logrotate.erb',
|
||||||
|
:cookbook => 'logrotate',
|
||||||
|
:template_mode => '0440',
|
||||||
|
:template_owner => 'root',
|
||||||
|
:template_group => 'root',
|
||||||
|
:postrotate => nil,
|
||||||
|
:prerotate => nil,
|
||||||
|
:firstaction => nil,
|
||||||
|
:lastaction => nil,
|
||||||
|
:sharedscripts => false
|
||||||
|
}
|
||||||
|
|
||||||
|
define(:logrotate_app, log_rotate_params) do
|
||||||
|
include_recipe 'logrotate::default'
|
||||||
|
|
||||||
|
options_tmp = params[:options] ||= %w(missingok compress delaycompress copytruncate notifempty)
|
||||||
|
options = options_tmp.respond_to?(:each) ? options_tmp : options_tmp.split
|
||||||
|
options << 'sharedscripts' if params[:sharedscripts]
|
||||||
|
|
||||||
|
if params[:enable]
|
||||||
|
invalid_options = options - CookbookLogrotate::DIRECTIVES
|
||||||
|
|
||||||
|
unless invalid_options.empty?
|
||||||
|
Chef::Log.error("Invalid option(s) passed to logrotate: #{invalid_options.join(', ')}")
|
||||||
|
raise
|
||||||
|
end
|
||||||
|
|
||||||
|
logrotate_config = {
|
||||||
|
:path => Array(params[:path]).map { |path| path.to_s.inspect }.join(' '),
|
||||||
|
:frequency => params[:frequency],
|
||||||
|
:options => options
|
||||||
|
}
|
||||||
|
CookbookLogrotate::VALUES.each do |opt_name|
|
||||||
|
logrotate_config[opt_name.to_sym] = params[opt_name.to_sym]
|
||||||
|
end
|
||||||
|
|
||||||
|
CookbookLogrotate::SCRIPTS.each do |script_name|
|
||||||
|
logrotate_config[script_name.to_sym] = Array(params[script_name.to_sym]).join("\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
template "/etc/logrotate.d/#{params[:name]}" do
|
||||||
|
source params[:template]
|
||||||
|
cookbook params[:cookbook]
|
||||||
|
mode params[:template_mode]
|
||||||
|
owner params[:template_owner]
|
||||||
|
group params[:template_group]
|
||||||
|
backup false
|
||||||
|
variables logrotate_config
|
||||||
|
end
|
||||||
|
else
|
||||||
|
file "/etc/logrotate.d/#{params[:name]}" do
|
||||||
|
action :delete
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
88
cookbooks/logrotate/libraries/logrotate_config.rb
Normal file
88
cookbooks/logrotate/libraries/logrotate_config.rb
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
#
|
||||||
|
# Cookbook Name:: logrotate
|
||||||
|
# Library:: CookbookLogrotate
|
||||||
|
#
|
||||||
|
# Copyright 2013, Chef
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Helper module for Logrotate configuration module CookbookLogrotate
|
||||||
|
module CookbookLogrotate
|
||||||
|
DIRECTIVES = %w(compress copy copytruncate daily dateext
|
||||||
|
dateyesterday delaycompress hourly ifempty mailfirst maillast
|
||||||
|
missingok monthly nocompress nocopy nocopytruncate nocreate
|
||||||
|
nodelaycompress nodateext nomail nomissingok noolddir
|
||||||
|
nosharedscripts noshred notifempty sharedscripts shred weekly
|
||||||
|
yearly) unless const_defined?(:DIRECTIVES)
|
||||||
|
|
||||||
|
VALUES = %w(compresscmd uncompresscmd compressext compressoptions
|
||||||
|
create dateformat include mail extension maxage minsize maxsize
|
||||||
|
rotate size shredcycles start tabooext su olddir) unless const_defined?(:VALUES)
|
||||||
|
|
||||||
|
SCRIPTS = %w(firstaction prerotate postrotate lastaction preremove) unless const_defined?(:SCRIPTS)
|
||||||
|
|
||||||
|
DIRECTIVES_AND_VALUES = DIRECTIVES + VALUES unless const_defined?(:DIRECTIVES_AND_VALUES)
|
||||||
|
|
||||||
|
# Helper class for creating configurations
|
||||||
|
class LogrotateConfiguration
|
||||||
|
attr_reader :directives, :values, :paths
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def from_hash(hash)
|
||||||
|
new(hash)
|
||||||
|
end
|
||||||
|
|
||||||
|
def directives_from(hash)
|
||||||
|
hash.select { |k, v| DIRECTIVES.include?(k) && v }.keys
|
||||||
|
end
|
||||||
|
|
||||||
|
def values_from(hash)
|
||||||
|
hash.select { |k| VALUES.include?(k) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def paths_from(hash)
|
||||||
|
hash.select { |k| !(DIRECTIVES_AND_VALUES.include?(k)) }.reduce({}) do | accum_paths, (path, config) |
|
||||||
|
accum_paths[path] = {
|
||||||
|
'directives' => directives_from(config),
|
||||||
|
'values' => values_from(config),
|
||||||
|
'scripts' => scripts_from(config)
|
||||||
|
}
|
||||||
|
|
||||||
|
accum_paths
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def scripts_from(hash)
|
||||||
|
defined_scripts = hash.select { |k| SCRIPTS.include?(k) }
|
||||||
|
defined_scripts.reduce({}) do | accum_scripts, (script, lines) |
|
||||||
|
if lines.respond_to?(:join)
|
||||||
|
accum_scripts[script] = lines.join("\n")
|
||||||
|
else
|
||||||
|
accum_scripts[script] = lines
|
||||||
|
end
|
||||||
|
|
||||||
|
accum_scripts
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def initialize(hash)
|
||||||
|
@directives = LogrotateConfiguration.directives_from(hash)
|
||||||
|
@values = LogrotateConfiguration.values_from(hash)
|
||||||
|
@paths = LogrotateConfiguration.paths_from(hash)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
154
cookbooks/logrotate/libraries/matchers.rb
Normal file
154
cookbooks/logrotate/libraries/matchers.rb
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
if defined?(ChefSpec)
|
||||||
|
def enable_logrotate_app(name)
|
||||||
|
LogrotateAppMatcher.new(name)
|
||||||
|
end
|
||||||
|
|
||||||
|
class LogrotateAppMatcher
|
||||||
|
def initialize(name)
|
||||||
|
@name = name
|
||||||
|
end
|
||||||
|
|
||||||
|
def with(parameters = {})
|
||||||
|
params.merge!(parameters)
|
||||||
|
self
|
||||||
|
end
|
||||||
|
|
||||||
|
def at_compile_time
|
||||||
|
raise ArgumentError, 'Cannot specify both .at_converge_time and .at_compile_time!' if @converge_time
|
||||||
|
@compile_time = true
|
||||||
|
self
|
||||||
|
end
|
||||||
|
|
||||||
|
def at_converge_time
|
||||||
|
raise ArgumentError, 'Cannot specify both .at_compile_time and .at_converge_time!' if @compile_time
|
||||||
|
@converge_time = true
|
||||||
|
self
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Allow users to specify fancy #with matchers.
|
||||||
|
#
|
||||||
|
def method_missing(m, *args, &block)
|
||||||
|
if m.to_s =~ /^with_(.+)$/
|
||||||
|
with($1.to_sym => args.first)
|
||||||
|
self
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def description
|
||||||
|
%Q{"enable" #{@name} "logrotate_app"}
|
||||||
|
end
|
||||||
|
|
||||||
|
def matches?(runner)
|
||||||
|
@runner = runner
|
||||||
|
|
||||||
|
if resource
|
||||||
|
resource.performed_action?('create') && unmatched_parameters.empty? && correct_phase?
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def failure_message
|
||||||
|
if resource
|
||||||
|
if resource.performed_action?('create')
|
||||||
|
if unmatched_parameters.empty?
|
||||||
|
if @compile_time
|
||||||
|
%Q{expected "#{resource}" to be run at compile time}
|
||||||
|
else
|
||||||
|
%Q{expected "#{resource}" to be run at converge time}
|
||||||
|
end
|
||||||
|
else
|
||||||
|
%Q{expected "#{resource}" to have parameters:} \
|
||||||
|
"\n\n" \
|
||||||
|
" " + unmatched_parameters.collect { |parameter, h|
|
||||||
|
"#{parameter} #{h[:expected].inspect}, was #{h[:actual].inspect}"
|
||||||
|
}.join("\n ")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
%Q{expected "#{resource}" actions #{resource.performed_actions.inspect}} \
|
||||||
|
" to include : create"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
%Q{expected "logrotate_app[#{@name}] with"} \
|
||||||
|
" enable : true to be in Chef run. Other" \
|
||||||
|
" #{@name} resources:" \
|
||||||
|
"\n\n" \
|
||||||
|
" " + similar_resources.map(&:to_s).join("\n ") + "\n "
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def failure_message_when_negated
|
||||||
|
if resource
|
||||||
|
message = %Q{expected "#{resource}" actions #{resource.performed_actions.inspect} to not exist}
|
||||||
|
else
|
||||||
|
message = %Q{expected "#{resource}" to not exist}
|
||||||
|
end
|
||||||
|
|
||||||
|
message << " at compile time" if @compile_time
|
||||||
|
message << " at converge time" if @converge_time
|
||||||
|
message
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def unmatched_parameters
|
||||||
|
return @_unmatched_parameters if @_unmatched_parameters
|
||||||
|
|
||||||
|
@_unmatched_parameters = {}
|
||||||
|
|
||||||
|
params.each do |parameter, expected|
|
||||||
|
unless matches_parameter?(parameter, expected)
|
||||||
|
@_unmatched_parameters[parameter] = {
|
||||||
|
:expected => expected,
|
||||||
|
:actual => safe_send(parameter),
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@_unmatched_parameters
|
||||||
|
end
|
||||||
|
|
||||||
|
def matches_parameter?(parameter, expected)
|
||||||
|
# Chef 11+ stores the source parameter internally as an Array
|
||||||
|
#
|
||||||
|
case parameter
|
||||||
|
when :cookbook
|
||||||
|
expected === safe_send(parameter)
|
||||||
|
when :path
|
||||||
|
Array(expected == safe_send('variables')[parameter])
|
||||||
|
else
|
||||||
|
expected == safe_send('variables')[parameter]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def correct_phase?
|
||||||
|
if @compile_time
|
||||||
|
resource.performed_action('create')[:compile_time]
|
||||||
|
elsif @converge_time
|
||||||
|
resource.performed_action('create')[:converge_time]
|
||||||
|
else
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def safe_send(parameter)
|
||||||
|
resource.send(parameter)
|
||||||
|
rescue NoMethodError
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def similar_resources
|
||||||
|
@_similar_resources ||= @runner.find_resources('template')
|
||||||
|
end
|
||||||
|
|
||||||
|
def resource
|
||||||
|
@_resource ||= @runner.find_resource('template', "/etc/logrotate.d/#{@name}")
|
||||||
|
end
|
||||||
|
|
||||||
|
def params
|
||||||
|
@_params ||= {}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
48
cookbooks/logrotate/metadata.json
Normal file
48
cookbooks/logrotate/metadata.json
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"name": "logrotate",
|
||||||
|
"description": "Installs logrotate package and provides a definition for logrotate configs",
|
||||||
|
"long_description": "Installs the logrotate package, manages /etc/logrotate.conf, and provides a logrotate_app definition.",
|
||||||
|
"maintainer": "Steven Danna",
|
||||||
|
"maintainer_email": "steve@chef.io",
|
||||||
|
"license": "Apache 2.0",
|
||||||
|
"platforms": {
|
||||||
|
"amazon": ">= 0.0.0",
|
||||||
|
"centos": ">= 0.0.0",
|
||||||
|
"debian": ">= 0.0.0",
|
||||||
|
"fedora": ">= 0.0.0",
|
||||||
|
"redhat": ">= 0.0.0",
|
||||||
|
"scientific": ">= 0.0.0",
|
||||||
|
"solaris2": ">= 0.0.0",
|
||||||
|
"ubuntu": ">= 0.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"recommendations": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"suggestions": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"conflicting": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"providing": {
|
||||||
|
"logrotate_app": ">= 0.0.0"
|
||||||
|
},
|
||||||
|
"replacing": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"attributes": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"groupings": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"recipes": {
|
||||||
|
"logrotate": "Installs logrotate package"
|
||||||
|
},
|
||||||
|
"version": "1.9.2",
|
||||||
|
"source_url": "",
|
||||||
|
"issues_url": ""
|
||||||
|
}
|
14
cookbooks/logrotate/metadata.rb
Normal file
14
cookbooks/logrotate/metadata.rb
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
name 'logrotate'
|
||||||
|
maintainer 'Steven Danna'
|
||||||
|
maintainer_email 'steve@chef.io'
|
||||||
|
license 'Apache 2.0'
|
||||||
|
description 'Installs logrotate package and provides a definition for logrotate configs'
|
||||||
|
long_description 'Installs the logrotate package, manages /etc/logrotate.conf, and provides a logrotate_app definition.'
|
||||||
|
version '1.9.2'
|
||||||
|
|
||||||
|
recipe 'logrotate', 'Installs logrotate package'
|
||||||
|
provides 'logrotate_app'
|
||||||
|
|
||||||
|
%w{amazon centos debian fedora redhat scientific solaris2 ubuntu}.each do |platform|
|
||||||
|
supports platform
|
||||||
|
end
|
35
cookbooks/logrotate/recipes/default.rb
Normal file
35
cookbooks/logrotate/recipes/default.rb
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#
|
||||||
|
# Cookbook Name:: logrotate
|
||||||
|
# Recipe:: default
|
||||||
|
#
|
||||||
|
# Copyright 2009-2013, Chef Software, Inc.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
package 'logrotate'
|
||||||
|
|
||||||
|
directory "/etc/logrotate.d" do
|
||||||
|
owner "root"
|
||||||
|
group "root"
|
||||||
|
mode "0755"
|
||||||
|
action :create
|
||||||
|
end
|
||||||
|
|
||||||
|
if platform? "solaris2" # ~FC023 style preference
|
||||||
|
cron "logrotate" do
|
||||||
|
minute "35"
|
||||||
|
hour "7"
|
||||||
|
command "/usr/sbin/logrotate /etc/logrotate.conf"
|
||||||
|
end
|
||||||
|
end
|
30
cookbooks/logrotate/recipes/global.rb
Normal file
30
cookbooks/logrotate/recipes/global.rb
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#
|
||||||
|
# Cookbook Name:: logrotate
|
||||||
|
# Recipe:: default
|
||||||
|
#
|
||||||
|
# Copyright 2009-2013, Chef Software, Inc.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
include_recipe 'logrotate::default'
|
||||||
|
|
||||||
|
parsed_configuration = CookbookLogrotate::LogrotateConfiguration.from_hash(node['logrotate']['global'].to_hash)
|
||||||
|
|
||||||
|
template '/etc/logrotate.conf' do
|
||||||
|
source 'logrotate-global.erb'
|
||||||
|
mode '0644'
|
||||||
|
variables(
|
||||||
|
:configuration => parsed_configuration
|
||||||
|
)
|
||||||
|
end
|
29
cookbooks/logrotate/templates/default/logrotate-global.erb
Normal file
29
cookbooks/logrotate/templates/default/logrotate-global.erb
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# This file was generated by Chef for <%= node['fqdn'] %>.
|
||||||
|
# Do not modify this file by hand!
|
||||||
|
|
||||||
|
<% @configuration.directives.each do |d| -%>
|
||||||
|
<%= d %>
|
||||||
|
<% end -%>
|
||||||
|
|
||||||
|
<% @configuration.values.each do |k, v| -%>
|
||||||
|
<%= k %> <%= v %>
|
||||||
|
<% end -%>
|
||||||
|
|
||||||
|
include /etc/logrotate.d
|
||||||
|
|
||||||
|
<% @configuration.paths.each do |path, path_config| -%>
|
||||||
|
<%= path %> {
|
||||||
|
<% path_config['directives'].each do |d|-%>
|
||||||
|
<%= d %>
|
||||||
|
<% end -%>
|
||||||
|
<% path_config['values'].each do | k, v | -%>
|
||||||
|
<%= k %> <%= v %>
|
||||||
|
<% end -%>
|
||||||
|
<% path_config['scripts'].each do | scripttype, body | -%>
|
||||||
|
<%= scripttype %>
|
||||||
|
<%= body %>
|
||||||
|
endscript
|
||||||
|
<% end -%>
|
||||||
|
}
|
||||||
|
|
||||||
|
<% end -%>
|
23
cookbooks/logrotate/templates/default/logrotate.erb
Normal file
23
cookbooks/logrotate/templates/default/logrotate.erb
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# This file was generated by Chef for <%= node['fqdn'] %>.
|
||||||
|
# Do not modify this file by hand!
|
||||||
|
|
||||||
|
<%= @path %> {
|
||||||
|
<%- if @frequency %>
|
||||||
|
<%= @frequency %>
|
||||||
|
<%- end %>
|
||||||
|
<%- CookbookLogrotate::VALUES.each do |opt_name| %>
|
||||||
|
<% if instance_variable_get("@#{opt_name}") %>
|
||||||
|
<%= "#{opt_name} #{instance_variable_get("@#{opt_name}")}" %>
|
||||||
|
<%- end %>
|
||||||
|
<%- end %>
|
||||||
|
<% @options.each do |o| -%>
|
||||||
|
<%= o %>
|
||||||
|
<% end -%>
|
||||||
|
<%- CookbookLogrotate::SCRIPTS.each do |script_name| %>
|
||||||
|
<% unless instance_variable_get("@#{script_name}").empty? %>
|
||||||
|
<%= script_name %>
|
||||||
|
<%= instance_variable_get("@#{script_name}") %>
|
||||||
|
endscript
|
||||||
|
<%- end %>
|
||||||
|
<%- end %>
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user