summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Haustein <mario.haustein@hrz.tu-chemnitz.de>2022-04-21 15:34:37 +0200
committerMario Haustein <mario.haustein@hrz.tu-chemnitz.de>2022-05-31 17:57:42 +0200
commit2093f0880b3261ef99634f74e38e8fc44a0e1e41 (patch)
tree46150c5f416c52ff126c4749ec43dc70bb05db2f
parent3ac8ac4dac3b96de58c8ee3d6c5f21ffcde67303 (diff)
downloadchef-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.rb16
-rw-r--r--spec/unit/resource/cron_d_spec.rb42
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