object exported through manager from multiprocess module

Tomas Pelka tompelka at gmail.com
Thu Jul 8 17:07:18 EDT 2010


Hi all,

have troubles with exporting objects through managers from multiprocess 
module, see example:

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 object (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()


Call object methods remotely:
###################################
# 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()

worker.go(iface="ethx", expr="whatever") # WORKS FINE

but

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'

Which is strange from my point of view, don't you think?
Thanks for advices,
cheers

-- 
Tomas Pelka

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20100708/71649f5c/attachment.html>


More information about the Python-list mailing list