Class: Puppet::Daemon

Inherits:
Object show all
Defined in:
lib/puppet/daemon.rb

Overview

A module that handles operations common to all daemons. This is included into the Server and Client base classes.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#agentObject

Returns the value of attribute agent.



9
10
11
# File 'lib/puppet/daemon.rb', line 9

def agent
  @agent
end

#argvObject

Returns the value of attribute argv.



9
10
11
# File 'lib/puppet/daemon.rb', line 9

def argv
  @argv
end

#serverObject

Returns the value of attribute server.



9
10
11
# File 'lib/puppet/daemon.rb', line 9

def server
  @server
end

Instance Method Details

#create_pidfileObject

Create a pidfile for our daemon, so we can be stopped and others don’t try to start.



45
46
47
48
49
# File 'lib/puppet/daemon.rb', line 45

def create_pidfile
  Puppet::Util.synchronize_on(Puppet[:name],Sync::EX) do
    raise "Could not create PID file: #{pidfile}" unless Puppet::Util::Pidlock.new(pidfile).lock
  end
end

#daemonizeObject

Put the daemon into the background.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/puppet/daemon.rb', line 16

def daemonize
  if pid = fork
    Process.detach(pid)
    exit(0)
  end

  create_pidfile

  # Get rid of console logging
  Puppet::Util::Log.close(:console)

  Process.setsid
  Dir.chdir("/")
  begin
    $stdin.reopen "/dev/null"
    $stdout.reopen "/dev/null", "a"
    $stderr.reopen $stdout
    Puppet::Util::Log.reopen
  rescue => detail
    Puppet.err "Could not start #{Puppet[:name]}: #{detail}"
    Puppet::Util::secure_open("/tmp/daemonout", "w") { |f|
      f.puts "Could not start #{Puppet[:name]}: #{detail}"
    }
    exit(12)
  end
end

#daemonnameObject



11
12
13
# File 'lib/puppet/daemon.rb', line 11

def daemonname
  Puppet[:name]
end

#pidfileObject

Provide the path to our pidfile.



52
53
54
# File 'lib/puppet/daemon.rb', line 52

def pidfile
  Puppet[:pidfile]
end

#reexecObject

Raises:



56
57
58
59
60
61
62
# File 'lib/puppet/daemon.rb', line 56

def reexec
  raise Puppet::DevError, "Cannot reexec unless ARGV arguments are set" unless argv
  command = $0 + " " + argv.join(" ")
  Puppet.notice "Restarting with '#{command}'"
  stop(:exit => false)
  exec(command)
end

#reloadObject



64
65
66
67
68
69
70
71
72
# File 'lib/puppet/daemon.rb', line 64

def reload
  return unless agent
  if agent.running?
    Puppet.notice "Not triggering already-running agent"
    return
  end

  agent.run
end

#remove_pidfileObject

Remove the pid file for our daemon.



75
76
77
78
79
80
# File 'lib/puppet/daemon.rb', line 75

def remove_pidfile
  Puppet::Util.synchronize_on(Puppet[:name],Sync::EX) do
    locker = Puppet::Util::Pidlock.new(pidfile)
    locker.unlock or Puppet.err "Could not remove PID file #{pidfile}" if locker.locked?
  end
end

#reopen_logsObject



87
88
89
# File 'lib/puppet/daemon.rb', line 87

def reopen_logs
  Puppet::Util::Log.reopen
end

#restartObject



82
83
84
85
# File 'lib/puppet/daemon.rb', line 82

def restart
  Puppet::Application.restart!
  reexec unless agent and agent.running?
end

#set_signal_trapsObject

Trap a couple of the main signals. This should probably be handled in a way that anyone else can register callbacks for traps, but, eh.



93
94
95
96
97
98
99
100
101
102
103
# File 'lib/puppet/daemon.rb', line 93

def set_signal_traps
  signals = {:INT => :stop, :TERM => :stop }
  # extended signals not supported under windows
  signals.update({:HUP => :restart, :USR1 => :reload, :USR2 => :reopen_logs }) unless Puppet.features.microsoft_windows?
  signals.each do |signal, method|
    Signal.trap(signal) do
      Puppet.notice "Caught #{signal}; calling #{method}"
      send(method)
    end
  end
end

#startObject

Raises:



118
119
120
121
122
123
124
125
126
127
128
# File 'lib/puppet/daemon.rb', line 118

def start
  set_signal_traps

  create_pidfile

  raise Puppet::DevError, "Daemons must have an agent, server, or both" unless agent or server
  server.start if server
  agent.start if agent

  EventLoop.current.run
end

#stop(args = {:exit => true}) ⇒ Object

Stop everything



106
107
108
109
110
111
112
113
114
115
116
# File 'lib/puppet/daemon.rb', line 106

def stop(args = {:exit => true})
  Puppet::Application.stop!

  server.stop if server

  remove_pidfile

  Puppet::Util::Log.close_all

  exit if args[:exit]
end