#-*- coding: ISO-8859-1 -*- # collect.py: the python collectd-unixsock module. # # Requires collectd to be configured with the unixsock plugin, like so: # # LoadPlugin unixsock # # SocketFile "/var/run/collectd-unixsock" # SocketPerms "0775" # # # Copyright (C) 2008 Clay Loveless # # This software is provided 'as-is', without any express or implied # warranty. In no event will the author be held liable for any damages # arising from the use of this software. # # Permission is granted to anyone to use this software for any purpose, # including commercial applications, and to alter it and redistribute it # freely, subject to the following restrictions: # # 1. The origin of this software must not be misrepresented; you must not # claim that you wrote the original software. If you use this software # in a product, an acknowledgment in the product documentation would be # appreciated but is not required. # 2. Altered source versions must be plainly marked as such, and must not be # misrepresented as being the original software. # 3. This notice may not be removed or altered from any source distribution. import socket, string class Collect(object): def __init__(self, path='/var/run/collectd-unixsock'): self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self._path = path self._sock.connect(self._path) def list(self): numvalues = self._cmd('LISTVAL') lines = [] if numvalues: lines = self._readlines(numvalues) return lines def get(self, val, flush=True): numvalues = self._cmd('GETVAL "' + val + '"') lines = [] if numvalues: lines = self._readlines(numvalues) if flush: self._cmd('FLUSH identifier="' + val + '"') return lines def _cmd(self, c): self._sock.send(c + "\n") stat = string.split(self._readline()) status = int(stat[0]) if status: return status return False ''' _readline and _readlines methods borrowed from the _fileobject class in sockets.py, tweaked a little bit for use in the collectd context. ''' def _readline(self): data = '' buf = [] recv = self._sock.recv while data != "\n": data = recv(1) if not data: break if data != "\n": buf.append(data) return ''.join(buf) def _readlines(self, sizehint=0): total = 0 list = [] while True: line = self._readline() if not line: break list.append(line) total = len(list) if sizehint and total >= sizehint: break return list def __del__(self): self._sock.close() if __name__ == '__main__': ''' Example usage: Collect values from socket and dump to STDOUT. ''' c = Collect('/var/run/collectd-unixsock') list = c.list() for val in list: stamp, key = string.split(val) glines = c.get(key) print stamp + ' ' + key + ' ' + ', '.join(glines)