[python] multiprocess manager
Tomas Pelka
tompelka na gmail.com
Čtvrtek Červenec 29 19:45:11 CEST 2010
On 07/26/2010 09:52 PM, Tomas Pelka wrote:
> Zdravim vsechny,
>
> mam potize s exportovanim objektu pres manager z modulu multiprocess,
> priklad:
>
> Worker.py:
> ###################################
> from multiprocessing import Process
> from multiprocessing.managers import BaseManager
> import pcapy
> from impacket.ImpactDecoder import EthDecoder
>
> __all__ = ['Worker']
>
> class Worker(Process):
> '''
> Class for sniffing packets, runnig as root
> '''
>
> public = ['go', 'terminate']
>
> def __init__(self):
> super(Worker, self).__init__()
> self.iface = ''
> self.expr = ''
> self.pcap = ''
> # define packet decoder
> self.decoder = EthDecoder()
> # key for queue daemon, remotely on localhost:5000
> self._keyQ = '10b222970537b97919db36ec757370d2'
> class QueueManager(BaseManager): pass
> QueueManager.register('get_dataQueue')
> self._m = QueueManager(address=('127.0.0.1', 5000),
> authkey=self._keyQ)
> self._m.connect()
> self.dataQueue = self._m.get_dataQueue()
> def go(self, iface, expr):
> '''
> start sniffer
> '''
> print "Starting sniffer"
> self.iface = iface
> self.expr = expr
> super(Worker, self).start()
> def terminate(self):
> '''
> terminate sniffer
> '''
> super(Worker, self).terminate()
> def run(self):
> print "sniffing ..."
> print self.iface
> print self.expr
> self.pcap = pcapy.open_live(self.iface, 1500, 1, 0)
> self.pcap.setfilter(self.expr)
> self.pcap.loop(0, self.__packetHandler)
> print "... done"
> def __packetHandler(self, hdr, data):
> '''
> handles packets and put them in to the queue
> '''
> print "Handling packets"
> #print data
> print "Queue size: %i" % self.dataQueue.qsize()
> print self.decoder.decode(data)
> self.dataQueue.put(data)
>
> Export objektu (Worker):
> ###################################
> from Worker import Worker
>
> class SniffManager(BaseManager): pass
> SniffManager.register('Worker', callable=Worker)
> Sm = SniffManager(address=('127.0.0.1', 5001),
> authkey='f1f16683f3e0208131b46d37a79c8921')
> Ss = Sm.get_server()
> Ss.serve_forever()
>
>
> Volani metod objektu, vzdalene:
> ###################################
> # get remote object
> class WorkerManager(BaseManager): pass
> WorkerManager.register('Worker')
> w = WorkerManager(address=('127.0.0.1', 5001),
> authkey='f1f16683f3e0208131b46d37a79c8921')
> w.connect()
> worker = w.Worker() #TOHLE FUNGUJE JAK MA
>
> ale
>
> worker.terminate()
>
> File "/home/tom/web2py/applications/init/controllers/sniffer.py", line
> 143, in index
> worker.terminate()
> File "<string>", line 2, in terminate
> File "/usr/lib/python2.6/multiprocessing/managers.py", line 740, in
> _callmethod
> raise convert_to_error(kind, result)
> AttributeError: 'NoneType' object has no attribute 'terminate'
>
> Zarazi me ze go() funguje a terminate() nikoliv. Lokalne funfuje vse
> tak jak ma.
>
> Diky za rady.
Nejzvlastnejsi mi prijde to ze super(Worker, self).terminate(), tedy
super(Worker, self) je podle pythonu NoneType.
--
Tomas Pelka
------------- dal?í ?ást ---------------
HTML p?íloha byla odstran?na...
URL: <http://www.py.cz/pipermail/python/attachments/20100729/070d874d/attachment.html>
Další informace o konferenci Python