diff --git a/kitchen.yml b/kitchen.yml index 2273dbf..4370902 100644 --- a/kitchen.yml +++ b/kitchen.yml @@ -467,14 +467,14 @@ suites: - name: default provisioner: dependencies: - - name: states - path: ./test/salt + - name: cron + repo: git + source: https://github.com/saltstack-formulas/cron-formula.git state_top: base: - 'G@os_family:Suse or G@os_family:Debian': - - states.cron '*': - logrotate._mapdata + - cron - logrotate pillars: top.sls: diff --git a/logrotate/config.sls b/logrotate/config.sls index e509c6b..5e4e3c1 100644 --- a/logrotate/config.sls +++ b/logrotate/config.sls @@ -3,22 +3,61 @@ include: - logrotate +{% set ns = namespace(hourly=False) %} +{% for key, value in logrotate.jobs.items() %} +{% set contents = value.get('contents', False) %} + {% if 'hourly' in (contents or value.config) %} + {% set ns.hourly = True %} + {% break %} + {% endif %} +{% endfor %} + logrotate-config: file.managed: - name: {{ logrotate.conf_file }} - source: salt://logrotate/templates/logrotate.conf.tmpl - template: jinja - - user: {{ salt['pillar.get']('logrotate:config:user', logrotate.user) }} - - group: {{ salt['pillar.get']('logrotate:config:group', logrotate.group) }} - - mode: {{ salt['pillar.get']('logrotate:config:mode', '644') }} + - user: {{ salt['config.get']('logrotate:config:user', logrotate.user) }} + - group: {{ salt['config.get']('logrotate:config:group', logrotate.group) }} + - mode: {{ salt['config.get']('logrotate:config:mode', '0644') }} - context: logrotate: {{ logrotate|tojson }} logrotate-directory: file.directory: - name: {{ logrotate.include_dir }} - - user: {{ salt['pillar.get']('logrotate:config:user', logrotate.user) }} - - group: {{ salt['pillar.get']('logrotate:config:group', logrotate.group) }} - - mode: 755 + - user: {{ salt['config.get']('logrotate:config:user', logrotate.user) }} + - group: {{ salt['config.get']('logrotate:config:group', logrotate.group) }} + - mode: '0755' - makedirs: True +{%- if ns.hourly %} +logrotate-hourly-config: + file.managed: + - name: {{ logrotate.hourly_conf_file }} + - user: {{ salt['config.get']('logrotate:config:user', logrotate.user) }} + - group: {{ salt['config.get']('logrotate:config:group', logrotate.group) }} + - mode: {{ salt['config.get']('logrotate:config:mode', '0644') }} + - contents: + - include {{ logrotate.hourly_include_dir }} + +logrotate-hourly-directory: + file.directory: + - name: {{ logrotate.hourly_include_dir }} + - user: {{ logrotate.user }} + - group: {{ logrotate.group }} + - mode: '0755' + - makedirs: True + +logrotate-hourly-cron: + file.managed: + - name: "/etc/cron.hourly/logrotate" + - source: salt://logrotate/templates/logrotate.hourly.tmpl + - template: jinja + - user: {{ salt['config.get']('logrotate:config:user', logrotate.user) }} + - group: {{ salt['config.get']('logrotate:config:group', logrotate.group) }} + - mode: '0775' + - context: + logrotate: {{ logrotate|tojson }} + +{%- endif %} diff --git a/logrotate/defaults.yaml b/logrotate/defaults.yaml index d388275..0c439bf 100644 --- a/logrotate/defaults.yaml +++ b/logrotate/defaults.yaml @@ -2,9 +2,13 @@ # vim: ft=yaml --- logrotate: + bin: /usr/sbin/logrotate + status_dir: /var/lib/logrotate pkg: logrotate conf_file: '/etc/logrotate.conf' include_dir: '/etc/logrotate.d' + hourly_conf_file: '/etc/logrotate.hourly.conf' + hourly_include_dir: '/etc/logrotate.hourly.d' user: root group: root service: cron diff --git a/logrotate/jobs.sls b/logrotate/jobs.sls index 2fd905a..9877a6b 100644 --- a/logrotate/jobs.sls +++ b/logrotate/jobs.sls @@ -7,9 +7,16 @@ include: {% for key, value in jobs.items() %} {% set contents = value.get('contents', False) %} + logrotate-{{ key }}: file.managed: + {% if 'hourly' in (contents or value.config) %} + - name: {{ logrotate.hourly_include_dir }}/{{ key.split("/")[-1] }} + - require: + - file: {{ logrotate.hourly_include_dir }} + {% else %} - name: {{ logrotate.include_dir }}/{{ key.split("/")[-1] }} + {% endif %} - user: {{ salt['pillar.get']('logrotate:config:user', logrotate.user) }} - group: {{ salt['pillar.get']('logrotate:config:group', logrotate.group) }} - mode: {{ salt['pillar.get']('logrotate:config:mode', '644') }} @@ -29,5 +36,5 @@ logrotate-{{ key }}: data: {{ value | json }} {% endif %} {% endif %} -{%- endfor -%} +{% endfor %} diff --git a/logrotate/osfamilymap.yaml b/logrotate/osfamilymap.yaml index b0b5390..8c0c396 100644 --- a/logrotate/osfamilymap.yaml +++ b/logrotate/osfamilymap.yaml @@ -26,6 +26,10 @@ Gentoo: tabooext: + .keep dateext: true FreeBSD: + bin: /usr/local/sbin/logrotate + status_dir: /var/run conf_file: /usr/local/etc/logrotate.conf + hourly_conf_file: /usr/local/etc/logrotate.hourly.conf include_dir: /usr/local/etc/logrotate.d + hourly_include_dir: /usr/local/etc/logrotate.hourly.d group: wheel diff --git a/logrotate/templates/logrotate.hourly.tmpl b/logrotate/templates/logrotate.hourly.tmpl new file mode 100644 index 0000000..f045611 --- /dev/null +++ b/logrotate/templates/logrotate.hourly.tmpl @@ -0,0 +1,9 @@ +#!/bin/sh + +{{ logrotate.bin }} -s {{ logrotate.status_dir }}/logrotate.hourly.status {{ logrotate.hourly_conf_file }} +EXITVALUE=$? +if [ $EXITVALUE != 0 ]; then + /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" +fi + +exit 0 diff --git a/pillar.example b/pillar.example index 05059d8..ca4fcb7 100644 --- a/pillar.example +++ b/pillar.example @@ -48,6 +48,22 @@ logrotate: - postrotate - /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true - endscript + nginx_high_traf: + path: + - /var/log/nginx_high_traf/*.log + config: + - hourly + - missingok + - rotate {{ 30 * 24 }} # keep 1 month's worth of hourly logs + - compress + - notifempty + - dateext + - dateformat .%Y-%m-%d-%H00 + - olddir /var/log/nginx_high_traf/archive + - sharedscripts + - postrotate + - 'kill -USR1 $(cat /var/run/nginx_high_traf.pid)' + - endscript nginx: contents: | /var/log/nginx/*.log{ diff --git a/test/integration/default/controls/base.rb b/test/integration/default/controls/base.rb index 8209c2b..6cbc87b 100644 --- a/test/integration/default/controls/base.rb +++ b/test/integration/default/controls/base.rb @@ -43,12 +43,10 @@ end control 'logrotate.service.running' do title 'The service should be installed, enabled and running' - only_if('Disabled on Arch Linux') do - !%w[arch].include?(platform[:name]) - end - service = - case platform[:family] + case system.platform[:family] + when 'arch' + 'cronie' when 'redhat', 'fedora' 'crond' else diff --git a/test/integration/default/controls/jobs.rb b/test/integration/default/controls/jobs.rb index 9809394..a2d94e4 100644 --- a/test/integration/default/controls/jobs.rb +++ b/test/integration/default/controls/jobs.rb @@ -69,3 +69,22 @@ describe file('/etc/logrotate.d/nginx') do its('content') { should include 'postrotate' } its('content') { should include ' invoke-rc.d nginx rotate >/dev/null 2>&1' } end + +describe file('/etc/logrotate.hourly.d/nginx_high_traf') do + it { should be_file } + it { should be_owned_by 'root' } + it { should be_grouped_into 'root' } + its('mode') { should cmp '0644' } + its('content') { should include '/var/log/nginx_high_traf/*.log' } + its('content') { should include 'hourly' } + its('content') { should include 'missingok' } + its('content') { should include 'rotate 720' } + its('content') { should include 'compress' } + its('content') { should include 'notifempty' } + its('content') { should include 'dateext' } + its('content') { should include 'dateformat .%Y-%m-%d-%H00' } + its('content') { should include 'olddir /var/log/nginx_high_traf/archive' } + its('content') { should include 'sharedscripts' } + its('content') { should include 'postrotate' } + its('content') { should include 'kill -USR1 $(cat /var/run/nginx_high_traf.pid)' } +end diff --git a/test/salt/states/cron.sls b/test/salt/states/cron.sls deleted file mode 100644 index 1570f2f..0000000 --- a/test/salt/states/cron.sls +++ /dev/null @@ -1,4 +0,0 @@ - -cron_package: - pkg.installed: - - name: cron