diff options
-rw-r--r-- | lib/puppet/provider/cron/crontab.rb | 16 | ||||
-rw-r--r-- | spec/unit/provider/cron/crontab_spec.rb | 39 |
2 files changed, 52 insertions, 3 deletions
diff --git a/lib/puppet/provider/cron/crontab.rb b/lib/puppet/provider/cron/crontab.rb index bfbdc30..9144725 100644 --- a/lib/puppet/provider/cron/crontab.rb +++ b/lib/puppet/provider/cron/crontab.rb @@ -273,17 +273,27 @@ Puppet::Type.type(:cron).provide(:crontab, parent: Puppet::Provider::ParsedFile, '/var/spool/cron' end + # Return the directory holding crontab files stored on the local system. + # + # @api private + def self.crontab_dir + CRONTAB_DIR + end + # Yield the names of all crontab files stored on the local system. # - # @note Ignores files that are not writable for the puppet process. + # @note Ignores files that are not writable for the puppet process and hidden + # files that start with .keep # # @api private def self.enumerate_crontabs Puppet.debug "looking for crontabs in #{CRONTAB_DIR}" return unless File.readable?(CRONTAB_DIR) Dir.foreach(CRONTAB_DIR) do |file| - path = "#{CRONTAB_DIR}/#{file}" - yield(file) if File.file?(path) && File.writable?(path) + path = File.join(CRONTAB_DIR, file) + # Gentoo creates .keep_PACKAGE-SLOT files to make sure the directory is not + # removed + yield(file) if File.file?(path) && File.writable?(path) && !file.start_with?('.keep_') end end diff --git a/spec/unit/provider/cron/crontab_spec.rb b/spec/unit/provider/cron/crontab_spec.rb index 031b3ae..796a4c2 100644 --- a/spec/unit/provider/cron/crontab_spec.rb +++ b/spec/unit/provider/cron/crontab_spec.rb @@ -202,4 +202,43 @@ describe Puppet::Type.type(:cron).provider(:crontab) do end end end + + context '#enumerate_crontabs' do + before(:each) do + File.expects(:readable?).with(subject.crontab_dir).returns(true) + Dir.expects(:foreach).with(subject.crontab_dir).multiple_yields(*files) + end + + context 'only a hidden file' do + let(:files) { ['.keep_cronbase-0'] } + + before(:each) do + files.each do |filename| + path = File.join(subject.crontab_dir, filename) + File.expects(:file?).with(path).returns(true) + File.expects(:writable?).with(path).returns(true) + end + end + + it 'ignores .keep_* files' do + expect { |b| described_class.enumerate_crontabs(&b) }.not_to yield_control + end + end + + context 'multiple files' do + let(:files) { ['myuser', '.keep_cronbase-0'] } + + before(:each) do + files.each do |filename| + path = File.join(subject.crontab_dir, filename) + File.expects(:file?).with(path).returns(true) + File.expects(:writable?).with(path).returns(true) + end + end + + it 'ignores .keep_* files' do + expect { |b| described_class.enumerate_crontabs(&b) }.to yield_control.once + end + end + end end |