diff options
author | Mario Haustein <mario.haustein@hrz.tu-chemnitz.de> | 2022-04-21 15:34:37 +0200 |
---|---|---|
committer | Mario Haustein <mario.haustein@hrz.tu-chemnitz.de> | 2022-05-31 17:57:42 +0200 |
commit | 2093f0880b3261ef99634f74e38e8fc44a0e1e41 (patch) | |
tree | 46150c5f416c52ff126c4749ec43dc70bb05db2f | |
parent | 3ac8ac4dac3b96de58c8ee3d6c5f21ffcde67303 (diff) | |
download | chef-2093f0880b3261ef99634f74e38e8fc44a0e1e41.tar.gz |
Limit cron_d job name validation to linux platform
Signed-off-by: Mario Haustein <mario.haustein@hrz.tu-chemnitz.de>
-rw-r--r-- | lib/chef/resource/cron/cron_d.rb | 16 | ||||
-rw-r--r-- | spec/unit/resource/cron_d_spec.rb | 42 |
2 files changed, 50 insertions, 8 deletions
diff --git a/lib/chef/resource/cron/cron_d.rb b/lib/chef/resource/cron/cron_d.rb index d7e8d7f5e3..5aaf6fe954 100644 --- a/lib/chef/resource/cron/cron_d.rb +++ b/lib/chef/resource/cron/cron_d.rb @@ -92,7 +92,6 @@ class Chef property :cron_name, String, description: "An optional property to set the cron name if it differs from the resource block's name.", - regex: /^[a-zA-Z0-9_-]+$/, name_property: true property :cookbook, String, desired_state: false, skip_docs: true @@ -146,6 +145,21 @@ class Chef new_resource.cron_name.tr(".", "-") end + def define_resource_requirements + requirements.assert(:create, :create_if_missing) do |a| + a.assertion do + # ensure valid cron job names for linux, otherwise the jobs won't be executed + if linux? + new_resource.cron_name =~ /^[a-zA-Z0-9_-]+$/ + else + true + end + end + a.failure_message("The cron job name should contain letters, numbers, hyphens and underscores only.") + a.block_action! + end + end + def create_template(create_action) # cleanup the legacy named job if it exists file "#{new_resource.cron_name} legacy named cron.d file" do diff --git a/spec/unit/resource/cron_d_spec.rb b/spec/unit/resource/cron_d_spec.rb index d1f70f84d6..355f3ebb28 100644 --- a/spec/unit/resource/cron_d_spec.rb +++ b/spec/unit/resource/cron_d_spec.rb @@ -18,7 +18,11 @@ require "spec_helper" describe Chef::Resource::CronD do - let(:resource) { Chef::Resource::CronD.new("cronify") } + let(:node) { Chef::Node.new } + let(:events) { Chef::EventDispatch::Dispatcher.new } + let(:run_context) { Chef::RunContext.new(node, {}, events) } + let(:resource) { Chef::Resource::CronD.new("cronify", run_context) } + let(:provider) { resource.provider_for_action(:create) } it "has a default action of [:create]" do expect(resource.action).to eql([:create]) @@ -34,12 +38,36 @@ describe Chef::Resource::CronD do expect(resource.cron_name).to eql("cronify") end - it "the cron_name property is valid" do - expect { resource.cron_name "cron-job" }.not_to raise_error - expect { resource.cron_name "cron_job_0" }.not_to raise_error - expect { resource.cron_name "CronJob" }.not_to raise_error - expect { resource.cron_name "cron!" }.to raise_error(ArgumentError) - expect { resource.cron_name "cron job" }.to raise_error(ArgumentError) + context "on linux" do + before(:each) do + node.automatic_attrs[:os] = "linux" + end + + it "the cron_name property is valid" do + provider.define_resource_requirements + + expect { resource.cron_name "cron-job"; provider.process_resource_requirements }.not_to raise_error + expect { resource.cron_name "cron_job_0"; provider.process_resource_requirements }.not_to raise_error + expect { resource.cron_name "CronJob"; provider.process_resource_requirements }.not_to raise_error + expect { resource.cron_name "cron!"; provider.process_resource_requirements }.to raise_error "The cron job name should contain letters, numbers, hyphens and underscores only." + expect { resource.cron_name "cron job"; provider.process_resource_requirements }.to raise_error "The cron job name should contain letters, numbers, hyphens and underscores only." + end + end + + context "not on linux" do + before(:each) do + node.automatic_attrs[:os] = "aix" + end + + it "all cron names are valid" do + provider.define_resource_requirements + + expect { resource.cron_name "cron-job"; provider.process_resource_requirements }.not_to raise_error + expect { resource.cron_name "cron_job_0"; provider.process_resource_requirements }.not_to raise_error + expect { resource.cron_name "CronJob"; provider.process_resource_requirements }.not_to raise_error + expect { resource.cron_name "cron!"; provider.process_resource_requirements }.not_to raise_error + expect { resource.cron_name "cron job"; provider.process_resource_requirements }.not_to raise_error + end end it "the mode property defaults to '0600'" do |