# class Chef::Provider::Cron

### Constants

CRON_ATTRIBUTES
CRON_PATTERN
ENV_PATTERN
SPECIAL_PATTERN
SPECIAL_TIME_VALUES
Solaris

  Just to create an alias so ‘Chef::Provider::Cron::Solaris’ is exposed and accessible to existing consumers of class.

WEEKDAY_SYMBOLS

### Attributes

cron_empty[RW]
cron_exists[RW]

### Public Class Methods

new(new_resource, run_context) click to toggle source
Calls superclass method Chef::Provider.new

    # File lib/chef/provider/cron.rb, line 36
    def initialize(new_resource, run_context)
      super(new_resource, run_context)
      @cron_exists = false
      @cron_empty = false
    end

### Public Instance Methods

action_create() click to toggle source

    # File lib/chef/provider/cron.rb, line 101
    def action_create
      crontab = String.new
      newcron = String.new
      cron_found = false

      newcron = get_crontab_entry

      if @cron_exists
        unless cron_different?
          Chef::Log.debug("Skipping existing cron entry '#{@new_resource.name}'")
          return
        end
        read_crontab.each_line do |line|
          case line.chomp
          when "# Chef Name: #{@new_resource.name}"
            cron_found = true
            next
          when ENV_PATTERN
            crontab << line unless cron_found
            next
          when CRON_PATTERN
            if cron_found
              cron_found = false
              crontab << newcron
              next
            end
          else
            if cron_found # We've got a Chef comment with no following crontab line
              crontab << newcron
              cron_found = false
            end
          end
          crontab << line
        end

        # Handle edge case where the Chef comment is the last line in the current crontab
        crontab << newcron if cron_found

        converge_by("update crontab entry for #{@new_resource}") do
          write_crontab crontab
          Chef::Log.info("#{@new_resource} updated crontab entry")
        end

      else
        crontab = read_crontab unless @cron_empty
        crontab << newcron

        converge_by("add crontab entry for #{@new_resource}") do
          write_crontab crontab
          Chef::Log.info("#{@new_resource} added crontab entry")
        end
      end
    end

action_delete() click to toggle source

    # File lib/chef/provider/cron.rb, line 155
    def action_delete
      if @cron_exists
        crontab = String.new
        cron_found = false
        read_crontab.each_line do |line|
          case line.chomp
          when "# Chef Name: #{@new_resource.name}"
            cron_found = true
            next
          when ENV_PATTERN
            next if cron_found
          when CRON_PATTERN
            if cron_found
              cron_found = false
              next
            end
          else
            # We've got a Chef comment with no following crontab line
            cron_found = false
          end
          crontab << line
        end
        description = cron_found ? "remove #{@new_resource.name} from crontab" :
          "save unmodified crontab"
        converge_by(description) do
          write_crontab crontab
          Chef::Log.info("#{@new_resource} deleted crontab entry")
        end
      end
    end

cron_different?() click to toggle source

    # File lib/chef/provider/cron.rb, line 95
    def cron_different?
      CRON_ATTRIBUTES.any? do |cron_var|
        @new_resource.send(cron_var) != @current_resource.send(cron_var)
      end
    end

load_current_resource() click to toggle source

    # File lib/chef/provider/cron.rb, line 47
    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}"
            Chef::Log.debug("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
        Chef::Log.debug("Cron '#{@new_resource.name}' not found") unless @cron_exists
      else
        Chef::Log.debug("Cron empty for '#{@new_resource.user}'")
        @cron_empty = true
      end

      @current_resource
    end

whyrun_supported?() click to toggle source

    # File lib/chef/provider/cron.rb, line 43
    def whyrun_supported?
      true
    end