Created
January 22, 2014 07:04
-
-
Save savonarola/8554613 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
require 'socket' | |
require 'rubygems' | |
require 'json' | |
require 'pp' | |
module Zabbix | |
class Sender | |
def self.send(host, serv='localhost', port=10051, conf='/etc/zabbix/zabbix_agentd.conf', &blk) | |
s = new serv, port, conf | |
s.to host, &blk | |
end | |
def initialize(serv='localhost', port=10051, conf='/etc/zabbix/zabbix_agentd.conf') | |
@serv, @port = serv, port | |
load_conf conf | |
end | |
def to(host, &blk) | |
raise ArgumentError, "need block" unless block_given? | |
begin | |
@keep = true | |
@data = {} | |
instance_eval &blk | |
unless @data.empty? | |
connect @data.map { |(key, value)| | |
{ :host => host.to_s, :key => key.to_s, :value => value.to_s } | |
} | |
end | |
ensure | |
@keep = @data = nil | |
end | |
end | |
def send(*args) | |
return register args if @keep | |
host = args.shift | |
key = args.shift | |
value = args.shift | |
connect :host => host.to_s, :key => key.to_s, :value => value.to_s | |
end | |
def register(args) | |
key = args.shift | |
value = args.shift | |
@data[key] = value | |
end | |
def connect(data) | |
sock = nil | |
begin | |
sock = TCPSocket.new @serv, @port | |
sock.write rawdata(data) | |
parse sock.read | |
ensure | |
sock.close if sock | |
end | |
end | |
def parse(response) | |
JSON.parse response[13 .. -1] | |
end | |
def rawdata(data) | |
data = [data] unless data.instance_of? Array | |
baggage = { | |
:request => 'sender data', | |
:data => data, | |
}.to_json | |
'ZBXD' + [1, u64le(baggage.bytesize)].flatten.pack("C*") + baggage | |
end | |
def u64le(integer) | |
ary = [] | |
8.times do |n| | |
ary << ((integer >> (n * 8)) & 0xFF) | |
end | |
ary | |
end | |
def load_conf(path) | |
return unless FileTest.exist? path | |
File.open(path, 'rb') do |f| | |
f.readlines.each do |line| | |
line.gsub!(/#.*$/, '') | |
if line =~ /(Server(?:Port)?)\s*=\s*([0-9a-zA-Z\-\_\.]+)\s*/ | |
key, value = $1, $2 | |
@serv = value if key == 'Server' | |
@port = value if key == 'ServerPort' | |
end | |
end | |
end | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment