class Senedsa::SendNsca

Constants

STATUS

Attributes

defaults[RW]

Public Class Methods

configure(cfg_file) click to toggle source
# File lib/senedsa/send_nsca.rb, line 32
def self.configure(cfg_file)
  cfg_options = {}
  unless cfg_file.nil?
    raise ConfigurationError, "unable to read configuration file #{cfg_file}" unless File.readable? cfg_file
    begin
      cfg_options = Psych.load File.open(cfg_file)
      raise ConfigurationError, "senedsa_config not allowed in configuration file (#{cfg_file})" unless cfg_options[:senedsa_config].nil?
    rescue Psych::SyntaxError => e
      raise ConfigurationError, "syntax error in configuration file #{cfg_file}: #{e.message}"
    rescue Errno::ENOENT, Errno::EACCES => e
     raise ConfigurationError, e.message
    end
  end
  cfg_options
end
new(*args) click to toggle source
# File lib/senedsa/send_nsca.rb, line 53
def initialize(*args)

  @options = {}

  case args.size

    when 1
      if args[0].is_a? String
        cfg_file = args[0].nil? ? nil : args[0]
        cfg_options = cfg_file.nil? ? {} : SendNsca.configure(cfg_file)
        hsh_options = {}
      elsif args[0].is_a? Hash
        cfg_file = args[0][:senedsa_config].nil? ? nil : args[0][:senedsa_config]
        cfg_options = cfg_file.nil? ? {} : SendNsca.configure(cfg_file)
        hsh_options = args[0]
      else
        raise InitializationError, "invalid argument types"
      end

    when 2
      raise InitializationError, "invalid argument types" unless args[0].is_a? String and args[1].is_a? String
      cfg_options = SendNsca.configure(@options[:senedsa_config])
      hsh_options = { :svc_hostname => args[0], :svc_descr => args[1] }

    when 3
      raise InitializationError, "invalid argument types" unless args[0].is_a? String and args[1].is_a? String and args[2].is_a? Hash
      cfg_options = SendNsca.configure(args[0][:senedsa_config])
      hsh_options = args[2].merge({ :svc_hostname => args[0], :svc_descr => args[1] })

    else
      raise ArgumentError, "wrong number of arguments"
  end
  @options = SendNsca.defaults.merge(cfg_options).merge(hsh_options)
  @options[:svc_hostname] = Socket.gethostname if @options[:svc_hostname].nil?
end

Public Instance Methods

inspect() click to toggle source
# File lib/senedsa/send_nsca.rb, line 122
def inspect
  @options
end
send(*args) click to toggle source
# File lib/senedsa/send_nsca.rb, line 89
def send(*args)

  svc_status = nil
  svc_output = nil

  case args.size
    when 0
      # svc_status and svc_output should be set on @options
      raise ArgumentError, "svc_status or svc_output not set" if @options[:svc_status].nil? or @options[:svc_output].nil?
      svc_status = @options[:status]
      svc_output = @options[:svc_output]
    when 2
      raise ArgumentError, "invalid svc_status" unless args[0].is_a? Symbol and STATUS.keys.include?(args[0])
      raise ArgumentError, "invalid svc_output" unless args[1].is_a? String
      svc_status = args[0]
      svc_output = args[1]
    else
      raise ArgumentError, "wrong number of arguments"
  end
  SendNsca.defaults.each_key do |option|
    next if [:send_nsca_config, :svc_status, :svc_output].include? option
    raise ArgumentError, "missing send_nsca option #{option}" if @options[option].nil?
  end
  raise ArgumentError, "missing send_nsca svc_status" if @options[:svc_status].nil?
  raise ArgumentError, "missing send_nsca svc_output" if @options[:svc_output].nil?
  run @options[:svc_status], @options[:svc_output]
end

Private Instance Methods

command() click to toggle source
# File lib/senedsa/send_nsca.rb, line 128
def command
  c = "#{send_nsca_binary} -H #{nsca_hostname} -p #{nsca_port} -to #{send_nsca_timeout} -d '#{send_nsca_delim}'"
  c << " -c #{send_nsca_config}" unless send_nsca_config.nil?
  c
end
run(svc_status,svc_output) click to toggle source
# File lib/senedsa/send_nsca.rb, line 134
def run(svc_status,svc_output)
  begin
    Open3.popen3(command) do |stdin, stdout, stderr, wait_thr|
      payload = "%s\n" % [svc_hostname,svc_descr,STATUS[svc_status],svc_output].join(send_nsca_delim)
      stdin.write(payload)
      stdin.close
      $stdout.write stdout.gets if STDIN.tty?
      raise SendNscaError, stderr.gets.chomp unless wait_thr.value.exitstatus == 0
    end
  rescue Errno::ENOENT, Errno::EACCES => e
    raise SendNscaError, e.message
  end
end