class Chef::Provider::Cron
def cmd_str
-
(String)
- The command to be executed. The new line at the end has been added purposefully.
def cmd_str " #{new_resource.command}\n" end
def cron_different?
def cron_different? CRON_ATTRIBUTES.any? do |cron_var| if new_resource.send(cron_var).class == current_resource.send(cron_var).class new_resource.send(cron_var) != current_resource.send(cron_var) else new_resource.send(cron_var).to_s != current_resource.send(cron_var).to_s end end end
def duration_str
-
(String)
- The Cron time string consisting five fields that Cron converts into a time interval.
def duration_str if new_resource.time "@#{new_resource.time}" else "#{new_resource.minute} #{new_resource.hour} #{new_resource.day} #{new_resource.month} #{new_resource.weekday}" end end
def env_var_str
-
(String)
- The string of Env Variables containing line breaks.
def env_var_str str = [] %i{mailto path shell home}.each do |v| str << "#{v.to_s.upcase}=\"#{new_resource.send(v)}\"" if new_resource.send(v) end new_resource.environment.each do |name, value| if ENVIRONMENT_PROPERTIES.include?(name) unless new_resource.property_is_set?(name.downcase) logger.warn("#{new_resource.name}: the environment property contains the '#{name}' variable, which should be set separately as a property.") new_resource.send(name.downcase.to_sym, value.gsub(/^"|"$/, "")) new_resource.environment.delete(name) str << "#{name.to_s.upcase}=\"#{value}\"" else raise Chef::Exceptions::Cron, "#{new_resource.name}: the '#{name}' property is set and environment property also contains the '#{name}' variable. Remove the variable from the environment property." end else str << "#{name}=#{value}" end end str.join("\n") end
def get_crontab_entry
-
(String)
- A crontab string formed as per the user inputs.
def get_crontab_entry # Initialize newcron = [] newcron << "# Chef Name: #{new_resource.name}" newcron << env_var_str unless env_var_str.empty? newcron << duration_str + time_out_str + cmd_str newcron.join("\n") end
def initialize(new_resource, run_context)
def initialize(new_resource, run_context) super(new_resource, run_context) @cron_exists = false @cron_empty = false end
def load_current_resource
def load_current_resource crontab_lines = [] @current_resource = Chef::Resource::Cron.new(new_resource.name) current_resource.user(new_resource.user) @cron_exists = false if crontab = read_crontab cron_found = false crontab.each_line do |line| case line.chomp when "# Chef Name: #{new_resource.name}" logger.trace("Found cron '#{new_resource.name}'") cron_found = true @cron_exists = true next when ENV_PATTERN set_environment_var($1, $2) if cron_found next when SPECIAL_PATTERN if cron_found current_resource.time($2.to_sym) current_resource.command($3) cron_found = false end when CRON_PATTERN if cron_found current_resource.minute($1) current_resource.hour($2) current_resource.day($3) current_resource.month($4) current_resource.weekday($5) current_resource.command($6) cron_found = false end next else cron_found = false # We've got a Chef comment with no following crontab line next end end logger.trace("Cron '#{new_resource.name}' not found") unless @cron_exists else logger.trace("Cron empty for '#{new_resource.user}'") @cron_empty = true end current_resource end
def read_crontab
def read_crontab so = shell_out!("crontab -l -u #{new_resource.user}", returns: [0, 1]) return nil if so.exitstatus == 1 so.stdout rescue => e raise Chef::Exceptions::Cron, "Error determining state of #{new_resource.name}, error: #{e}" end
def set_environment_var(attr_name, attr_value)
def set_environment_var(attr_name, attr_value) if ENVIRONMENT_PROPERTIES.include?(attr_name) current_resource.send(attr_name.downcase.to_sym, attr_value.gsub(/^"|"$/, "")) else current_resource.environment(current_resource.environment.merge(attr_name => attr_value)) end end
def time_out_str
-
(String)
- The timeout command string formed as per time_out property.
def time_out_str return "" if new_resource.time_out.empty? str = " timeout" str << " --preserve-status" if new_resource.time_out["preserve-status"].to_s.casecmp("true") == 0 str << " --foreground" if new_resource.time_out["foreground"].to_s.casecmp("true") == 0 str << " --kill-after #{new_resource.time_out["kill-after"]}" if new_resource.time_out["kill-after"] str << " --signal #{new_resource.time_out["signal"]}" if new_resource.time_out["signal"] str << " #{new_resource.time_out["duration"]};" str end
def write_crontab(crontab)
def write_crontab(crontab) write_exception = false so = shell_out!("crontab -u #{new_resource.user} -", input: crontab) rescue => e raise Chef::Exceptions::Cron, "Error updating state of #{new_resource.name}, error: #{e}" end