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 'nodejs',          '~> 2.4.4' | ||||
|   cookbook 'ark' | ||||
|   cookbook 'logrotate' | ||||
| end | ||||
| 
 | ||||
|  | ||||
| @ -879,6 +879,18 @@ | ||||
|         "url": "https://supermarket.chef.io:443/api/v1/cookbooks/timezone-ii/versions/0.2.0/download", | ||||
|         "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