diff options
author | antima-gupta <agupta@msystechnologies.com> | 2020-05-13 13:46:08 +0530 |
---|---|---|
committer | antima-gupta <agupta@msystechnologies.com> | 2020-06-10 10:51:40 +0530 |
commit | d119c901aa3aa79d91f9ade440066e85b0d8867d (patch) | |
tree | 8a2fc0439c97c0b67314547961b4465e3980d51d /lib/chef/resource/cron | |
parent | 33d608179372fed46c1c5a88f214677748b8de8c (diff) | |
download | chef-d119c901aa3aa79d91f9ade440066e85b0d8867d.tar.gz |
Added cron_shared partial.
Fixed provider cron spec failure.
Moved cron and cron resource into the lib/chef/resource/cron directory.
Signed-off-by: antima-gupta <agupta@msystechnologies.com>
Diffstat (limited to 'lib/chef/resource/cron')
-rw-r--r-- | lib/chef/resource/cron/_cron_shared.rb | 102 | ||||
-rw-r--r-- | lib/chef/resource/cron/cron.rb | 50 | ||||
-rw-r--r-- | lib/chef/resource/cron/cron_d.rb | 186 |
3 files changed, 338 insertions, 0 deletions
diff --git a/lib/chef/resource/cron/_cron_shared.rb b/lib/chef/resource/cron/_cron_shared.rb new file mode 100644 index 0000000000..06fc072528 --- /dev/null +++ b/lib/chef/resource/cron/_cron_shared.rb @@ -0,0 +1,102 @@ +unified_mode true + +WEEKDAYS = { + sunday: "0", monday: "1", tuesday: "2", wednesday: "3", thursday: "4", friday: "5", saturday: "6", + sun: "0", mon: "1", tue: "2", wed: "3", thu: "4", fri: "5", sat: "6" +}.freeze + +property :minute, [Integer, String], + description: "The minute at which the cron entry should run (`0 - 59`).", + default: "*", callbacks: { + "should be a valid minute spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 59) }, + } + +property :hour, [Integer, String], + description: "The hour at which the cron entry is to run (`0 - 23`).", + default: "*", callbacks: { + "should be a valid hour spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 23) }, + } + +property :day, [Integer, String], + description: "The day of month at which the cron entry should run (`1 - 31`).", + default: "*", callbacks: { + "should be a valid day spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 1, 31) }, + } + +property :month, [Integer, String], + description: "The month in the year on which a cron entry is to run (`1 - 12`, `jan-dec`, or `*`).", + default: "*", callbacks: { + "should be a valid month spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_month(spec) }, + } + +property :weekday, [Integer, String, Symbol], + description: "The day of the week on which this entry is to run (`0-7`, `mon-sun`, `monday-sunday`, or `*`), where Sunday is both `0` and `7`.", + default: "*", coerce: proc { |wday| weekday_in_crontab(wday) }, + callbacks: { + "should be a valid weekday spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_dow(spec) }, + } + +property :shell, String, + description: "Set the `SHELL` environment variable." + +property :path, String, + description: "Set the `PATH` environment variable." + +property :home, String, + description: "Set the `HOME` environment variable." + +property :mailto, String, + description: "Set the `MAILTO` environment variable." + +property :command, String, + description: "The command to be run, or the path to a file that contains the command to be run.", + identity: true, + required: [:create] + +property :user, String, + description: "The name of the user that runs the command.", + default: "root" + +property :environment, Hash, + description: "A Hash containing additional arbitrary environment variables under which the cron job will be run in the form of `({'ENV_VARIABLE' => 'VALUE'})`.", + default: lazy { {} } + + +TIMEOUT_OPTS = %w{duration preserve-status foreground kill-after signal}.freeze +TIMEOUT_REGEX = /\A\S+/.freeze + +property :time_out, Hash, + description: "A Hash of timeouts in the form of `({'OPTION' => 'VALUE'})`. + Accepted valid options are: + `preserve-status` (BOOL, default: 'false'), + `foreground` (BOOL, default: 'false'), + `kill-after` (in seconds), + `signal` (a name like 'HUP' or a number)", + default: lazy { {} }, + introduced: "15.7", + coerce: proc { |h| + if h.is_a?(Hash) + invalid_keys = h.keys - TIMEOUT_OPTS + unless invalid_keys.empty? + error_msg = "Key of option time_out must be equal to one of: \"#{TIMEOUT_OPTS.join('", "')}\"! You passed \"#{invalid_keys.join(", ")}\"." + raise Chef::Exceptions::ValidationFailed, error_msg + end + unless h.values.all? { |x| x =~ TIMEOUT_REGEX } + error_msg = "Values of option time_out should be non-empty string without any leading whitespaces." + raise Chef::Exceptions::ValidationFailed, error_msg + end + h + elsif h.is_a?(Integer) || h.is_a?(String) + { "duration" => h } + end + } + + +private +# Convert weekday input value into crontab format that +# could be written in the crontab +# @return [Integer, String] A weekday formed as per the user inputs. +def weekday_in_crontab(wday) + weekday = wday.to_s.downcase.to_sym + weekday_in_crontab = WEEKDAYS[weekday] || wday +end
\ No newline at end of file diff --git a/lib/chef/resource/cron/cron.rb b/lib/chef/resource/cron/cron.rb new file mode 100644 index 0000000000..aeeef5624d --- /dev/null +++ b/lib/chef/resource/cron/cron.rb @@ -0,0 +1,50 @@ +# +# Author:: Bryan McLellan (btm@loftninjas.org) +# Author:: Tyler Cloke (<tyler@chef.io>) +# Copyright:: Copyright 2009-2016, Bryan McLellan +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require_relative "../../resource" +require_relative "../helpers/cron_validations" +require_relative "../../provider/cron" # do not remove. we actually need this below + +class Chef + class Resource + class Cron < Chef::Resource + use "cron_shared" + + provides :cron + + description "Use the **cron** resource to manage cron entries for time-based job scheduling. Properties for a schedule will default to * if not provided. The cron resource requires access to a crontab program, typically cron." + + state_attrs :minute, :hour, :day, :month, :weekday, :user + + default_action :create + allowed_actions :create, :delete + + def initialize(name, run_context = nil) + super + @month = "*" + @weekday = "*" + end + + property :time, Symbol, + description: "A time interval.", + equal_to: Chef::Provider::Cron::SPECIAL_TIME_VALUES + + end + end +end diff --git a/lib/chef/resource/cron/cron_d.rb b/lib/chef/resource/cron/cron_d.rb new file mode 100644 index 0000000000..39a811fdf8 --- /dev/null +++ b/lib/chef/resource/cron/cron_d.rb @@ -0,0 +1,186 @@ +# +# Copyright:: Copyright (c) Chef Software Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require_relative "../../resource" +require_relative "../helpers/cron_validations" +require "shellwords" unless defined?(Shellwords) +require_relative "../../dist" + +class Chef + class Resource + class CronD < Chef::Resource + use "cron_shared" + + provides :cron_d + + introduced "14.4" + description "Use the **cron_d** resource to manage cron job files in the /etc/cron.d directory. This is similar to the 'cron' resource, but it does not use the monolithic /etc/crontab file." + examples <<~DOC + **Run a program on the fifth hour of the day** + + ```ruby + cron_d 'noop' do + hour '5' + minute '0' + command '/bin/true' + end + ``` + + **Run an entry if a folder exists** + + ```ruby + cron_d 'ganglia_tomcat_thread_max' do + command "/usr/bin/gmetric + -n 'tomcat threads max' + -t uint32 + -v '/usr/local/bin/tomcat-stat + --thread-max'" + only_if { ::File.exist?('/home/jboss') } + end + ``` + + **Run an entry every Saturday, 8:00 AM** + + ```ruby + cron_d 'name_of_cron_entry' do + minute '0' + hour '8' + weekday '6' + mailto 'admin@example.com' + command "/bin/true" + action :create + end + ``` + + **Run an entry at 8:00 PM, every weekday (Monday through Friday), but only in November** + + ```ruby + cron_d 'name_of_cron_entry' do + minute '0' + hour '20' + day '*' + month '11' + weekday '1-5' + command "/bin/true" + action :create + end + ``` + + **Remove a cron job by name**: + + ```ruby + cron_d 'job_to_remove' do + action :delete + end + ``` + DOC + + property :cron_name, String, + description: "An optional property to set the cron name if it differs from the resource block's name.", + name_property: true + + property :cookbook, String, desired_state: false, skip_docs: true + + property :predefined_value, String, + description: "Schedule your cron job with one of the special predefined value instead of ** * pattern.", + equal_to: %w{ @reboot @yearly @annually @monthly @weekly @daily @midnight @hourly } + + property :comment, String, + description: "A comment to place in the cron.d file." + + property :mode, [String, Integer], + description: "The octal mode of the generated crontab file.", + default: "0600" + + property :random_delay, Integer, + description: "Set the `RANDOM_DELAY` environment variable in the cron.d file." + + # warn if someone passes the deprecated cookbook property + def after_created + raise ArgumentError, "The 'cookbook' property for the cron_d resource is no longer supported now that it ships as a core resource." if cookbook + end + + action :create do + description "Add a cron definition file to /etc/cron.d." + + create_template(:create) + end + + action :create_if_missing do + description "Add a cron definition file to /etc/cron.d, but do not update an existing file." + + create_template(:create_if_missing) + end + + action :delete do + description "Remove a cron definition file from /etc/cron.d if it exists." + + # cleanup the legacy named job if it exists + file "legacy named cron.d file" do + path "/etc/cron.d/#{new_resource.cron_name}" + action :delete + end + + file "/etc/cron.d/#{sanitized_name}" do + action :delete + end + end + + action_class do + # @return [String] cron_name property with . replaced with - + def sanitized_name + new_resource.cron_name.tr(".", "-") + 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 + path "/etc/cron.d/#{new_resource.cron_name}" + action :delete + only_if { new_resource.cron_name != sanitized_name } + end + + # @todo this is Chef 12 era cleanup. Someday we should remove it all + template "/etc/cron.d/#{sanitized_name}" do + source ::File.expand_path("../../support/cron.d.erb", __FILE__) + local true + mode new_resource.mode + variables( + name: sanitized_name, + predefined_value: new_resource.predefined_value, + minute: new_resource.minute, + hour: new_resource.hour, + day: new_resource.day, + month: new_resource.month, + weekday: new_resource.weekday, + command: new_resource.command, + user: new_resource.user, + mailto: new_resource.mailto, + path: new_resource.path, + home: new_resource.home, + shell: new_resource.shell, + comment: new_resource.comment, + random_delay: new_resource.random_delay, + environment: new_resource.environment + ) + action create_action + end + end + end + end + end +end |