from twisted.protocols.basic import LineOnlyReceiver from twisted.internet import protocol class GkrellmClient(LineOnlyReceiver): delimiter = '\n' def connectionMade(self): self.cursection = None self.curlines = [] self.started = False self.transport.write("gkrellm 2.2.2\r\n") def lineReceived(self, line): if not self.started: if line == '': self.started = True return if line[0] == '<': if self.cursection: self.gkrellm_data(self.cursection, self.curlines) self.curlines = [] self.cursection = None if line[1] != '.': self.cursection = line.strip()[1:-1] else: self.curlines.append(line) def gkrellm_data(self, dataname, lines): m = getattr(self, 'gkrellm_raw_' + dataname, self.gkrellm_raw_default) m(dataname, lines) def gkrellm_raw_default(self, dataname, lines): pass def gkrellm_raw_proc(self, dataname, lines): processes, running, forks, load, users = lines[0].split() self.factory.gkrellm_proc(int(processes), int(running), int(forks), float(load), int(users)) def gkrellm_raw_cpu(self, dataname, lines): for line in lines: self.factory.gkrellm_cpu(*map(int, line.split())) def gkrellm_raw_disk(self, dataname, lines): pass class GkrellmFactory(protocol.ClientFactory): protocol = GkrellmClient def gkrellm_cpu(self, instance, user, nice, sys, idle): pass def gkrellm_proc(self, processes, running, forks, load, users): pass class NoisyGkrellmFactory(GkrellmFactory): def clientConnectionFailed(self, connector, reason): print 'connect failed', reason def gkrellm_proc(self, processes, running, forks, load, users): print 'load is: ', load def gkrellm_cpu(self, instance, user, nice, sys, idle): print 'cpu', instance, user if __name__ == '__main__': from twisted.internet import reactor reactor.connectTCP("snake.cs.uni-duesseldorf.de", 19150, NoisyGkrellmFactory()) reactor.run()