class RuboCop::Cop::Chef::Modernize::CronDFileOrTemplate

Use the cron_d resource that ships with Chef Infra Client 14.4+ instead of manually creating the file with template, file, or cookbook_file resources.

@example

#### incorrect
template '/etc/cron.d/backup' do
  source 'cron_backup_job.erb'
  owner 'root'
  group 'root'
  mode '644'
end

cookbook_file '/etc/cron.d/backup' do
  owner 'root'
  group 'root'
  mode '644'
end

file '/etc/cron.d/backup' do
  content '*/30 * * * * backup /usr/local/bin/backup_script.sh'
  owner 'root'
  group 'root'
  mode '644'
end

file '/etc/cron.d/blogs' do
  action :delete
end

file "/etc/cron.d/#{job_name}" do
  action :delete
end

file File.join('/etc/cron.d', job) do
  action :delete
end

file 'delete old cron job' do
  path '/etc/cron.d/backup'
  action :delete
end

file 'delete old cron job' do
  path "/etc/cron.d/#{job}"
  action :delete
end

file 'delete old cron job' do
  path ::File.join('/etc/cron.d', job)
  action :delete
end

#### correct
cron_d 'backup' do
  minute '1'
  hour '1'
  mailto 'sysadmins@example.com'
  command '/usr/local/bin/backup_script.sh'
end

cron_d 'blogs' do
  action :delete
end

Constants

MSG

Public Instance Methods

on_block(node) click to toggle source
# File lib/rubocop/cop/chef/modernize/cron_d_file_or_template.rb, line 102
def on_block(node)
  file_or_template?(node) do |file_name|
    break unless file_name.start_with?(%r{/etc/cron\.d\b}i)
    add_offense(node, severity: :refactor)
  end

  match_property_in_resource?(%i(template file cookbook_file), 'path', node) do |code_property|
    # instead of using CookbookHelpers#method_arg_ast_to_string, walk the property's descendants
    # and check if their value contains '/etc/cron.d'
    # covers the case where the argument to the path property is provided via a method like File.join
    code_property.each_descendant do |d|
      add_offense(node, severity: :refactor) if d.respond_to?(:value) && d.value.match?(%r{/etc/cron\.d\b}i)
    end
  end
end