# class Puppet::Agent

A general class for triggering a run of another class.

### Attributes

client[R]
client_class[R]
should_fork[R]
splayed[R]

### Public Class Methods

new(client_class, should_fork=true) click to toggle source

Just so we can specify that we are “the” instance.

    # File lib/puppet/agent.rb, line 16
    def initialize(client_class, should_fork=true)
      @splayed = false

      @should_fork = should_fork
      @client_class = client_class
    end

### Public Instance Methods

needing_restart?() click to toggle source

    # File lib/puppet/agent.rb, line 23
    def needing_restart?
      Puppet::Application.restart_requested?
    end

run(client_options = {}) click to toggle source

Perform a run with our client.

    # File lib/puppet/agent.rb, line 28
    def run(client_options = {})
      if running?
        Puppet.notice "Run of #{client_class} already in progress; skipping  (#{lockfile_path} exists)"
        return
      end
      if disabled?
        Puppet.notice "Skipping run of #{client_class}; administratively disabled (Reason: '#{disable_message}');\nUse 'puppet agent --enable' to re-enable."
        return
      end

      result = nil
      block_run = Puppet::Application.controlled_run do
        splay
        result = run_in_fork(should_fork) do
          with_client do |client|
            begin
              client_args = client_options.merge(:pluginsync => Puppet[:pluginsync])
              sync.synchronize { lock { client.run(client_args) } }
            rescue SystemExit,NoMemoryError
              raise
            rescue Exception => detail
              Puppet.log_exception(detail, "Could not run #{client_class}: #{detail}")
            end
          end
        end
        true
      end
      Puppet.notice "Shutdown/restart in progress (#{Puppet::Application.run_status.inspect}); skipping run" unless block_run
      result
    end

run_in_fork(forking = true) { || ... } click to toggle source

    # File lib/puppet/agent.rb, line 83
    def run_in_fork(forking = true)
      return yield unless forking or Puppet.features.windows?

      child_pid = Kernel.fork do
        $0 = "puppet agent: applying configuration"
        begin
          exit(yield)
        rescue SystemExit
          exit(-1)
        rescue NoMemoryError
          exit(-2)
        end
      end
      exit_code = Process.waitpid2(child_pid)
      case exit_code[1].exitstatus
      when -1
        raise SystemExit
      when -2
        raise NoMemoryError
      end
      exit_code[1].exitstatus
    end

splay() click to toggle source

Sleep when splay is enabled; else just return.

    # File lib/puppet/agent.rb, line 69
    def splay
      return unless Puppet[:splay]
      return if splayed?

      time = rand(Puppet[:splaylimit] + 1)
      Puppet.info "Sleeping for #{time} seconds (splay is enabled)"
      sleep(time)
      @splayed = true
    end

splayed?() click to toggle source

Have we splayed already?

    # File lib/puppet/agent.rb, line 64
    def splayed?
      splayed
    end

stopping?() click to toggle source

    # File lib/puppet/agent.rb, line 59
    def stopping?
      Puppet::Application.stop_requested?
    end

sync() click to toggle source

    # File lib/puppet/agent.rb, line 79
    def sync
      @sync ||= Sync.new
    end