class Genesis::Snmp::Server

Implement an SNMP trap handling server

Attributes

community[RW]
mib[RW]

Public Class Methods

load_modules(module_list, mib_dir) click to toggle source
# File lib/genesis/protocol/snmp/server.rb, line 28
def self.load_modules(module_list, mib_dir)
  mib = SNMP::MIB.new
  module_list.each { |m| mib.load_module(m, mib_dir) }
  mib
end
start_server() click to toggle source
# File lib/genesis/protocol/snmp/server.rb, line 15
def self.start_server
  commstr = @args[:community] || ''
  mib_dir = @args[:mib_dir] || SNMP::MIB::DEFAULT_MIB_PATH
  mib_mods = @args[:mib_mods] || SNMP::Options.default_modules
  mib = load_modules(mib_mods, mib_dir)
  EM.open_datagram_socket('0.0.0.0', @port, self) do |conn|
    conn.mib = mib
    conn.community = commstr
    conn.channel = @channel
    conn.handle_routes = @handle_routes
  end
end

Public Instance Methods

receive_data(data) click to toggle source
# File lib/genesis/protocol/snmp/server.rb, line 34
def receive_data(data)
  snmp_trap = handle_trap(data)
  @channel << snmp_trap
  route_trap(snmp_trap)
end

Private Instance Methods

handle_inform(snmp_trap, message, source_ip, source_port) click to toggle source
# File lib/genesis/protocol/snmp/server.rb, line 59
def handle_inform(snmp_trap, message, source_ip, source_port)
  return unless snmp_trap.is_a?(SNMP::InformRequest)
  UDPSocket.new.send(message.response.encode, 0, source_ip, source_port)
end
handle_trap(data) click to toggle source
# File lib/genesis/protocol/snmp/server.rb, line 42
def handle_trap(data)
  source_port, source_ip = Socket.unpack_sockaddr_in(get_peername)

  message = SNMP::Message.decode(data, @mib)
  snmp_trap = message.pdu

  # If we configured a community and the message wasn't from our community, bail
  close_connection if @community != '' && @community != message.community

  # Handle inform requests, which want a response
  handle_inform(snmp_trap, message, source_ip, source_port)

  # Append source ip and return
  snmp_trap.source_ip = source_ip
  snmp_trap
end
route_trap(snmp_trap) click to toggle source
# File lib/genesis/protocol/snmp/server.rb, line 64
def route_trap(snmp_trap)
  @handle_routes.each do |verb, matchdata|
    case verb
    when 'trap'
      route_trap_handler(snmp_trap, matchdata)
    end
  end
end
route_trap_handler(snmp_trap, matchdata) click to toggle source
# File lib/genesis/protocol/snmp/server.rb, line 73
def route_trap_handler(snmp_trap, matchdata)
  trap_oid = snmp_trap.trap_oid.join('.')
  matchdata.each do |oid, blockdata|
    blockdata[:block].call(snmp_trap) if  oid =~ /#{trap_oid}/
  end
end