Class: Puppet::Agent

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

Overview

A general class for triggering a run of another class.

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 Util::Splayer

#splay, #splayed?

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.



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

def initialize(client_class, should_fork=true)
  @should_fork = can_fork? && should_fork
  @client_class = client_class
end

Instance Attribute Details

#clientObject (readonly)

Returns the value of attribute client.



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

def client
  @client
end

#client_classObject (readonly)

Returns the value of attribute client_class.



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

def client_class
  @client_class
end

#should_forkObject (readonly)

Returns the value of attribute should_fork.



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

def should_fork
  @should_fork
end

Instance Method Details

#can_fork?Boolean

Returns:

  • (Boolean)


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

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

#needing_restart?Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/puppet/agent.rb', line 28

def needing_restart?
  Puppet::Application.restart_requested?
end

#run(client_options = {}) ⇒ Object

Perform a run with our client.



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
60
# File 'lib/puppet/agent.rb', line 33

def run(client_options = {})
  if disabled?
    Puppet.notice _("Skipping run of %{client_class}; administratively disabled (Reason: '%{disable_message}');\nUse 'puppet agent --enable' to re-enable.") % { client_class: client_class, disable_message: disable_message }
    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(client_options[:transaction_uuid], client_options[:job_id]) do |client|
        begin
          client_args = client_options.merge(:pluginsync => Puppet::Configurer.should_pluginsync?)
          lock { client.run(client_args) }
        rescue Puppet::LockError
          Puppet.notice _("Run of %{client_class} already in progress; skipping  (%{lockfile_path} exists)") % { client_class: client_class, lockfile_path: lockfile_path }
          return
        rescue StandardError => detail
          Puppet.log_exception(detail, _("Could not run %{client_class}: %{detail}") % { client_class: client_class, detail: detail })
          1
        end
      end
    end
    true
  end
  Puppet.notice _("Shutdown/restart in progress (%{status}); skipping run") % { status: Puppet::Application.run_status.inspect } unless block_run
  result
end

#run_in_fork(forking = true) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/puppet/agent.rb', line 66

def run_in_fork(forking = true)
  return yield unless forking or Puppet.features.windows?

  atForkHandler = Puppet::Util::AtFork.get_handler

  atForkHandler.prepare

  begin
    child_pid = Kernel.fork do
      atForkHandler.child
      $0 = _("puppet agent: applying configuration")
      begin
        exit(yield)
      rescue SystemExit
        exit(-1)
      rescue NoMemoryError
        exit(-2)
      end
    end
  ensure
    atForkHandler.parent
  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

#stopping?Boolean

Returns:

  • (Boolean)


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

def stopping?
  Puppet::Application.stop_requested?
end