Fire up the ruby server with:
ruby server.rb 49644
Then call check_nrpe with:
check_nrpe -H localhost -p 49644 -c check_awesome
Or with parameters, like:
check_nrpe -H localhost -p 49644 -c check_awesome -a param1 param2
require 'zlib' | |
module Nagios | |
class NrpePacket | |
NRPE_PACKET_VERSION_3 = 3 | |
NRPE_PACKET_VERSION_2 = 2 | |
NRPE_PACKET_VERSION_1 = 1 | |
QUERY_PACKET = 1 | |
RESPONSE_PACKET = 2 | |
MAX_PACKETBUFFER_LENGTH = 1024 | |
MAX_PACKET_SIZE = 12 + 1024 | |
attr_accessor :packet_version, :crc32, :result_code, :buffer | |
def initialize(unpacked=nil) | |
@packet_version = NRPE_PACKET_VERSION_2 | |
@random = 1 | |
if unpacked | |
@packet_version = unpacked[0] | |
@packet_type = unpacked[1] | |
@crc32 = unpacked[2] | |
@result_code = unpacked[3] | |
@buffer = unpacked[4] | |
@random = unpacked[5] | |
end | |
end | |
def packet_type | |
case @packet_type | |
when QUERY_PACKET then :query | |
when RESPONSE_PACKET then :response | |
end | |
end | |
def packet_type=(type) | |
case type | |
when :query then @packet_type = QUERY_PACKET | |
when :response then @packet_type = RESPONSE_PACKET | |
else | |
raise "Invalid packet type" | |
end | |
end | |
def calculate_crc32 | |
Zlib::crc32(self.to_bytes(0)) | |
end | |
def validate_crc32 | |
raise 'Invalid CRC32' unless @crc32 == self.calculate_crc32 | |
end | |
def to_bytes(use_crc32=self.calculate_crc32) | |
[ @packet_version, @packet_type, use_crc32, @result_code, @buffer, @random].pack("nnNna#{MAX_PACKETBUFFER_LENGTH}n") | |
end | |
def self.read(io) | |
bytes = io.read(MAX_PACKET_SIZE) | |
values = bytes.unpack("nnNnA#{MAX_PACKETBUFFER_LENGTH}n") | |
packet = self.new(values) | |
packet.validate_crc32 | |
packet | |
end | |
end | |
end |
require 'socket' | |
require 'openssl' | |
require 'packet' | |
class ClientQuitError < RuntimeError; end | |
port = ARGV.shift || 0 # default is to use the next available port | |
server = TCPServer.new(port) | |
context = OpenSSL::SSL::SSLContext.new "SSLv23_server" | |
context.ciphers = 'ADH' | |
ssl_server = OpenSSL::SSL::SSLServer.new server, context | |
port = server.addr[1] | |
addrs = server.addr[2..-1].uniq | |
puts "*** listening on #{addrs.collect{|a|"#{a}:#{port}"}.join(' ')}" | |
loop do | |
socket = ssl_server.accept | |
Thread.start do # one thread per client | |
s = socket | |
port = s.peeraddr[1] | |
name = s.peeraddr[2] | |
addr = s.peeraddr[3] | |
puts "\n*** recieving from #{name}:#{port}" | |
begin | |
packet = Nagios::NrpePacket.read s | |
puts "#{addr} [#{Time.now}]: #{packet.buffer}" | |
response_packet = Nagios::NrpePacket.new | |
response_packet.packet_type = :response | |
response_packet.result_code = 0 | |
response_packet.buffer = "OK - looks good" | |
s.write response_packet.to_bytes | |
rescue ClientQuitError | |
puts "*** #{name}:#{port} disconnected" | |
rescue Exception => e | |
puts "ERROR (#{e.class}): #{e.message}\n#{e.backtrace.join("\n")}" | |
ensure | |
s.close # close socket on error | |
end | |
puts "*** done with #{name}:#{port}" | |
end | |
end |