diff --git a/.fixtures.yml b/.fixtures.yml index 76d07a8..263613a 100644 --- a/.fixtures.yml +++ b/.fixtures.yml @@ -2,3 +2,4 @@ fixtures: repositories: stdlib: "https://github.com/puppetlabs/puppetlabs-stdlib.git" cron: "https://github.com/puppetlabs/puppetlabs-cron_core.git" + systemd: "https://github.com/voxpupuli/puppet-systemd.git" diff --git a/manifests/hourly.pp b/manifests/hourly.pp index bc77674..2f757e6 100644 --- a/manifests/hourly.pp +++ b/manifests/hourly.pp @@ -19,13 +19,8 @@ ) { assert_private() - $dir_ensure = $logrotate::ensure_cron_hourly ? { - 'absent' => $logrotate::ensure_cron_hourly, - 'present' => 'directory' - } - file { "${logrotate::rules_configdir}/hourly": - ensure => $dir_ensure, + ensure => 'directory', owner => $logrotate::root_user, group => $logrotate::root_group, mode => $logrotate::rules_configdir_mode, @@ -38,4 +33,66 @@ require => File["${logrotate::rules_configdir}/hourly"], } } + + # Make copies of the rpm provided unit and timers + if $logrotate::manage_systemd_timer { + $_lockfile = '/run/lock/logrotate.service' + $_timeout = 21600 + systemd::manage_dropin { 'hourly-service.conf': + ensure => $logrotate::ensure_systemd_timer, + unit => 'logrotate-hourly.service', + unit_entry => { + 'Description' => [ + '', + 'Extra service to run hourly logrotates only', + ], + }, + service_entry => { + 'ExecStart' => ['', "/usr/bin/flock --wait ${_timeout} ${_lockfile} /usr/sbin/logrotate ${logrotate::rules_configdir}/hourly"], + }, + before => Systemd::Unit_file['logrotate-hourly.service'], + } + + # Once logrotate >= 3.21.1 replace flock with the `--wait-for-state-lock` option. + systemd::manage_dropin { 'logrotate-flock.conf': + ensure => $logrotate::ensure_systemd_timer, + unit => 'logrotate.service', + service_entry => { + 'ExecStart' => ['', "/usr/bin/flock --wait ${_timeout} ${_lockfile} /usr/sbin/logrotate /etc/logrotate.conf"], + }, + } + + systemd::unit_file { 'logrotate-hourly.service': + ensure => $logrotate::ensure_systemd_timer, + source => 'file:///lib/systemd/system/logrotate.service', + before => Systemd::Unit_file['logrotate-hourly.timer'], + } + + systemd::manage_dropin { 'hourly-timer.conf': + ensure => $logrotate::ensure_systemd_timer, + unit => 'logrotate-hourly.timer', + unit_entry => { + 'Description' => [ + '', + 'Extra timer to run hourly logrotates only', + ], + }, + timer_entry => { + 'OnCalendar' => ['', 'hourly'], + }, + before => Systemd::Unit_file['logrotate-hourly.timer'], + } + + $_timer = $logrotate::ensure_systemd_timer ? { + 'present' => true, + default => false, + } + + systemd::unit_file { 'logrotate-hourly.timer': + ensure => $logrotate::ensure_systemd_timer, + source => 'file:///lib/systemd/system/logrotate.timer', + active => $_timer, + enable => $_timer, + } + } } diff --git a/metadata.json b/metadata.json index b2358b3..6afc09c 100644 --- a/metadata.json +++ b/metadata.json @@ -14,6 +14,10 @@ { "name": "puppetlabs/stdlib", "version_requirement": ">= 4.22.0 < 10.0.0" + }, + { + "name": "puppet/systemd", + "version_requirement": ">= 6.3.0 < 7.0.0" } ], "requirements": [ diff --git a/spec/classes/init_spec.rb b/spec/classes/init_spec.rb index 6cec0b8..28475bc 100644 --- a/spec/classes/init_spec.rb +++ b/spec/classes/init_spec.rb @@ -9,20 +9,6 @@ let(:facts) do facts end - let(:cron_ensure) do - if facts[:os]['family'] == 'RedHat' && facts[:os]['release']['major'].to_i >= 9 - 'absent' - else - 'present' - end - end - let(:hourly_dir_ensure) do - if cron_ensure == 'present' - 'directory' - else - 'absent' - end - end context 'logrotate class without any parameters' do it { is_expected.to compile.with_all_deps } @@ -54,23 +40,6 @@ is_expected.to contain_class('logrotate::defaults') end else - it do - is_expected.to contain_file('/etc/logrotate.d/hourly').with( - 'ensure' => hourly_dir_ensure, - 'owner' => 'root', - 'group' => 'root', - 'mode' => '0755' - ) - end - - it do - is_expected.to contain_file('/etc/cron.hourly/logrotate').with( - 'ensure' => cron_ensure, - 'owner' => 'root', - 'group' => 'root', - 'mode' => '0700' - ) - end it do is_expected.to contain_package('logrotate').with_ensure('present') @@ -80,11 +49,6 @@ 'group' => 'root', 'mode' => '0755') - is_expected.to contain_file('/etc/cron.daily/logrotate').with('ensure' => cron_ensure, - 'owner' => 'root', - 'group' => 'root', - 'mode' => '0700') - is_expected.to contain_class('logrotate::defaults') end @@ -94,10 +58,74 @@ 'ensure' => 'running', 'enable' => true ) + + is_expected.to contain_systemd__unit_file('logrotate-hourly.timer').with( + 'ensure' => 'present', + 'enable' => true, + 'active' => true + ) + + is_expected.to contain_systemd__manage_dropin('hourly-timer.conf').with( + 'ensure' => 'present', + 'unit' => 'logrotate-hourly.timer' + ) + + is_expected.to contain_systemd__unit_file('logrotate-hourly.service').with_ensure('present').without_enable.without_active + + is_expected.to contain_systemd__manage_dropin('hourly-service.conf').with( + 'ensure' => 'present', + 'unit' => 'logrotate-hourly.service', + 'service_entry' => { + 'ExecStart' => [ + '', + '/usr/bin/flock --wait 21600 /run/lock/logrotate.service /usr/sbin/logrotate /etc/logrotate.d/hourly' + ] + } + ) + + is_expected.to contain_systemd__manage_dropin('logrotate-flock.conf').with( + 'ensure' => 'present', + 'unit' => 'logrotate.service', + 'service_entry' => { + 'ExecStart' => [ + '', + '/usr/bin/flock --wait 21600 /run/lock/logrotate.service /usr/sbin/logrotate /etc/logrotate.conf' + ] + } + ) end else + + it do + is_expected.to contain_file('/etc/cron.hourly/logrotate').with( + 'ensure' => 'present', + 'owner' => 'root', + 'group' => 'root', + 'mode' => '0700' + ) + + is_expected.to contain_file('/etc/cron.daily/logrotate').with('ensure' => 'present', + 'owner' => 'root', + 'group' => 'root', + 'mode' => '0700') + end + + it do + is_expected.to contain_file('/etc/logrotate.d/hourly').with( + 'ensure' => 'directory', + 'owner' => 'root', + 'group' => 'root', + 'mode' => '0755' + ) + end + it do is_expected.not_to contain_service('logrotate.timer') + is_expected.not_to contain_systemd__unit_file('logrotate-hourly.timer') + is_expected.not_to contain_systemd__unit_file('logrotate-hourly.service') + is_expected.not_to contain_systemd__unit_file('logrotate-hourly.timer') + is_expected.not_to contain_systemd__unit_file('logrotate-hourly.service') + is_expected.not_to contain_systemd__manage_dropin('logrotate-flock.conf') end end end @@ -169,9 +197,9 @@ case facts[:operatingsystem] when 'FreeBSD' - it { is_expected.to contain_file('/usr/local/etc/logrotate.d/hourly').with_ensure('absent') } + it { is_expected.to contain_file('/usr/local/etc/logrotate.d/hourly').with_ensure('directory') } else - it { is_expected.to contain_file('/etc/logrotate.d/hourly').with_ensure('absent') } + it { is_expected.to contain_file('/etc/logrotate.d/hourly').with_ensure('directory') } it { is_expected.to contain_file('/etc/cron.hourly/logrotate').with_ensure('absent') } end end