module Sensu::Daemon

Attributes

state[R]

Public Class Methods

new(options={}) click to toggle source
# File lib/sensu/daemon.rb, line 35
def initialize(options={})
  @state = :initializing
  @timers = {
    :run => Array.new
  }
  setup_logger(options)
  load_settings(options)
  load_extensions(options)
  setup_process(options)
end

Public Instance Methods

load_extensions(options={}) click to toggle source
# File lib/sensu/daemon.rb, line 70
def load_extensions(options={})
  @extensions = Extensions.get(options)
  log_concerns(@extensions.warnings)
  extension_settings = @settings.to_hash.dup
  @extensions.all.each do |extension|
    extension.logger = @logger
    extension.settings = extension_settings
  end
end
load_settings(options={}) click to toggle source
# File lib/sensu/daemon.rb, line 58
def load_settings(options={})
  @settings = Settings.get(options)
  log_concerns(@settings.warnings)
  failures = @settings.validate
  unless failures.empty?
    @logger.fatal('invalid settings')
    log_concerns(failures, :fatal)
    @logger.fatal('SENSU NOT RUNNING!')
    exit 2
  end
end
log_concerns(concerns=[], level=:warn) click to toggle source
# File lib/sensu/daemon.rb, line 51
def log_concerns(concerns=[], level=:warn)
  concerns.each do |concern|
    message = concern.delete(:message)
    @logger.send(level, message, redact_sensitive(concern))
  end
end
pause() click to toggle source
# File lib/sensu/daemon.rb, line 93
def pause
  @state = :paused
end
resume() click to toggle source
# File lib/sensu/daemon.rb, line 97
def resume
  @state = :running
end
setup_logger(options={}) click to toggle source
# File lib/sensu/daemon.rb, line 46
def setup_logger(options={})
  @logger = Logger.get(options)
  @logger.setup_signal_traps
end
setup_process(options) click to toggle source
# File lib/sensu/daemon.rb, line 80
def setup_process(options)
  if options[:daemonize]
    daemonize
  end
  if options[:pid_file]
    write_pid(options[:pid_file])
  end
end
setup_redis() click to toggle source
# File lib/sensu/daemon.rb, line 152
def setup_redis
  @logger.debug('connecting to redis', {
    :settings => @settings[:redis]
  })
  @redis = Redis.connect(@settings[:redis])
  @redis.on_error do |error|
    @logger.fatal('redis connection error', {
      :error => error.to_s
    })
    stop
  end
  @redis.before_reconnect do
    unless testing?
      @logger.warn('reconnecting to redis')
      pause
    end
  end
  @redis.after_reconnect do
    @logger.info('reconnected to redis')
    resume
  end
end
setup_signal_traps() click to toggle source
# File lib/sensu/daemon.rb, line 107
def setup_signal_traps
  @signals = Array.new
  STOP_SIGNALS.each do |signal|
    Signal.trap(signal) do
      @signals << signal
    end
  end
  EM::PeriodicTimer.new(1) do
    signal = @signals.shift
    if STOP_SIGNALS.include?(signal)
      @logger.warn('received signal', {
        :signal => signal
      })
      stop
    end
  end
end
setup_transport() click to toggle source
# File lib/sensu/daemon.rb, line 125
def setup_transport
  transport_name = @settings[:transport][:name] || 'rabbitmq'
  transport_settings = @settings[transport_name]
  @logger.debug('connecting to transport', {
    :name => transport_name,
    :settings => transport_settings
  })
  Transport.logger = @logger
  @transport = Transport.connect(transport_name, transport_settings)
  @transport.on_error do |error|
    @logger.fatal('transport connection error', {
      :error => error.to_s
    })
    stop
  end
  @transport.before_reconnect do
    unless testing?
      @logger.warn('reconnecting to transport')
      pause
    end
  end
  @transport.after_reconnect do
    @logger.info('reconnected to transport')
    resume
  end
end
start() click to toggle source
# File lib/sensu/daemon.rb, line 89
def start
  @state = :running
end
stop() click to toggle source
# File lib/sensu/daemon.rb, line 101
def stop
  @state = :stopped
  @logger.warn('stopping reactor')
  EM::stop_event_loop
end

Private Instance Methods

daemonize() click to toggle source
# File lib/sensu/daemon.rb, line 191
def daemonize
  Kernel.srand
  if Kernel.fork
    exit
  end
  unless Process.setsid
    @logger.fatal('cannot detach from controlling terminal')
    @logger.fatal('SENSU NOT RUNNING!')
    exit 2
  end
  Signal.trap('SIGHUP', 'IGNORE')
  if Kernel.fork
    exit
  end
  Dir.chdir('/')
  ObjectSpace.each_object(IO) do |io|
    unless [STDIN, STDOUT, STDERR].include?(io)
      begin
        unless io.closed?
          io.close
        end
      rescue
      end
    end
  end
end
write_pid(file) click to toggle source
# File lib/sensu/daemon.rb, line 177
def write_pid(file)
  begin
    File.open(file, 'w') do |pid_file|
      pid_file.puts(Process.pid)
    end
  rescue
    @logger.fatal('could not write to pid file', {
      :pid_file => file
    })
    @logger.fatal('SENSU NOT RUNNING!')
    exit 2
  end
end