import SocketServer from struct import unpack import md5 import socket import time import log import passwords import rrdutils # Protocol: # Max 65535 byte payload # 2 bytes: L - length after md5sum (unsigned short) # 1 byte: K - Key number (unsigned char) # 16 bytes: M - MD5Sum of the data + key # Rest may be repeated for multiple sensors # 1 byte: N - Length of name (unsigned char) # N bytes: Name of sensor # 1 byte: Q - Length of quantity (unsigned char) # Q bytes: Quantity in rrd database # 8 bytes: 64 bit timestamp, LSB first (unsigned long long) # 4 bytes: 32 bit interval in seconds, LSB first (signed integer) # 1 byte: S - Number of samples (unsigned char) # S * 4 bytes: Float value (single) class RequestHandler(SocketServer.BaseRequestHandler): def recvwto(self, count): '''Receive exactly count bytes or raise exception on timeout''' t = time.time() + self.request.gettimeout() data = "" while len(data) < count: data += self.request.recv(count - len(data)) if t < time.time(): raise socket.timeout return data def _handle(self): '''Handle request but do not handle exceptions''' header = self.recvwto(19) length, keynum, md5sum = unpack("