Class: Puppet::Agent

Inherits:
Object show all
Includes:
Disabler, Locker
Defined in:
lib/puppet/agent.rb

Overview

A general class for triggering a run of another class.

API:

  • public

Defined Under Namespace

Modules: Disabler, Locker

Constant Summary

Constants included from Disabler

Disabler::DISABLED_MESSAGE_JSON_KEY

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Disabler

#disable, #disable_message, #disabled?, #enable

Methods included from Locker

#lock, #lockfile_path, #running?

Constructor Details

#initialize(client_class, should_fork = true) ⇒ Agent

Returns a new instance of Agent.

API:

  • public



14
15
16
17
18
19
# File 'lib/puppet/agent.rb', line 14

def initialize(client_class, should_fork=true)
  @splayed = false

  @should_fork = can_fork? && should_fork
  @client_class = client_class
end

Instance Attribute Details

#clientObject (readonly)

API:

  • public



12
13
14
# File 'lib/puppet/agent.rb', line 12

def client
  @client
end

#client_classObject (readonly)

API:

  • public



12
13
14
# File 'lib/puppet/agent.rb', line 12

def client_class
  @client_class
end

#should_forkObject (readonly)

API:

  • public



12
13
14
# File 'lib/puppet/agent.rb', line 12

def should_fork
  @should_fork
end

#splayedObject (readonly)

API:

  • public



12
13
14
# File 'lib/puppet/agent.rb', line 12

def splayed
  @splayed
end

Instance Method Details

#can_fork?Boolean

Returns:

API:

  • public



21
22
23
# File 'lib/puppet/agent.rb', line 21

def can_fork?
  Puppet.features.posix? && RUBY_PLATFORM != 'java'
end

#needing_restart?Boolean

Returns:

API:

  • public



25
26
27
# File 'lib/puppet/agent.rb', line 25

def needing_restart?
  Puppet::Application.restart_requested?
end

#run(client_options = {}) ⇒ Object

Perform a run with our client.

API:

  • public



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/puppet/agent.rb', line 30

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 client_options.fetch :splay, Puppet[:splay]
    result = run_in_fork(should_fork) do
      with_client do |client|
        begin
          client_args = client_options.merge(:pluginsync => Puppet[:pluginsync])
          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) ⇒ Object

API:

  • public



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/puppet/agent.rb', line 81

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(do_splay = Puppet[:splay]) ⇒ Object

Sleep when splay is enabled; else just return.

API:

  • public



71
72
73
74
75
76
77
78
79
# File 'lib/puppet/agent.rb', line 71

def splay(do_splay = Puppet[:splay])
  return unless do_splay
  return if splayed?

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

#splayed?Boolean

Have we splayed already?

Returns:

API:

  • public



66
67
68
# File 'lib/puppet/agent.rb', line 66

def splayed?
  splayed
end

#stopping?Boolean

Returns:

API:

  • public



61
62
63
# File 'lib/puppet/agent.rb', line 61

def stopping?
  Puppet::Application.stop_requested?
end