Sha256: ae942756d0cd19c2b98c6fe25ffb681764690915b51640d52d7d61178ae8ea48
Contents?: true
Size: 1.86 KB
Versions: 1
Compression:
Stored size: 1.86 KB
Contents
require "multi_json" require "zabbix_protocol/version" module ZabbixProtocol class Error < StandardError; end # http://www.zabbix.org/wiki/Docs/protocols/zabbix_agent/1.4 ZABBIX_HEADER = "ZBXD" ZABBIX_VERSION = "\x01" PAYLOAD_LEN_BYTES = 8 MIN_DATA_LEN = ZABBIX_HEADER.bytesize + ZABBIX_VERSION.bytesize + PAYLOAD_LEN_BYTES def self.dump(payload) if payload.is_a?(Hash) payload = MultiJson.dump(payload) else payload = payload.to_s end payload.force_encoding('ASCII-8BIT') [ ZABBIX_HEADER, ZABBIX_VERSION, [payload.bytesize].pack('Q<'), payload ].join end def self.load(data) unless data.is_a?(String) raise TypeError, "wrong argument type #{data.class} (expected String)" end original_encoding = data.encoding data = data.dup data.force_encoding('ASCII-8BIT') if data.bytesize < MIN_DATA_LEN raise Error, "data length is too short (data: #{data.inspect})" end sliced = data.dup header = sliced.slice!(0, ZABBIX_HEADER.bytesize) if header != ZABBIX_HEADER raise Error, "invalid header: #{header.inspect} (data: #{data.inspect})" end version = sliced.slice!(0, ZABBIX_VERSION.bytesize) if version != ZABBIX_VERSION raise Error, "unsupported version: #{version.inspect} (data: #{data.inspect})" end payload_len = sliced.slice!(0, PAYLOAD_LEN_BYTES) payload_len = payload_len.unpack('Q<').first if payload_len != sliced.bytesize raise Error, "invalid payload length: expected=#{payload_len}, actual=#{sliced.bytesize} (data: #{data.inspect})" end duplicated = sliced.dup begin duplicated.force_encoding(original_encoding) sliced = duplicated rescue # XXX: nothing to do end begin MultiJson.load(sliced) rescue MultiJson::ParseError sliced end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
zabbix_protocol-0.1.5 | lib/zabbix_protocol.rb |