def getLocation( publicKey ) : reactor = SelectReactor() udpSock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) udpSock.bind( ('',0) ) rpcSocket = RPCSocket( udpSock, reactor ) dhtClient = DHTClient( rpcSocket ) nodeAddr = ('210.210.1.102',10001) nodeTable = NodeTable( [nodeAddr] ) locList = [] def onLookup( location ) : locList.append( location ) reactor.stop() lookupUser( publicKey, dhtClient, nodeTable, onLookup ) reactor.run() rpcSocket.close() return locList[0]
class NodeRunner( object ) : def __init__( self, nodeTable, reactor ) : self.nodeTable = nodeTable self.reactor = reactor self.timerOp = None self.firewallOp = None self.rpcSock = None self.tcpListener = None self.router = None self.dhtNode = None self._initTimer() def close( self ) : if self.timerOp : self.timerOp.cancel() self.timerOp = None if self.firewallOp : self.firewallOp.cancel() self.firewallOp = None if self.rpcSock : self.rpcSock.close() self.rpcSock = None if self.tcpListener : self.tcpListener.close() self.tcpListener = None if self.router is not None : self.router.close() self.router = None if self.dhtNode is not None : self.dhtNode.close() self.dhtNode = None def _initTimer( self ) : timeout = NODE_CHECK_TIME_DELAY self.timerOp = self.reactor.callLater( timeout, self._onTimer ) def _onTimer( self ) : self.timerOp = None localIP = getLocalIP() if localIP is None : self._initTimer() return nodeAddrList = self.nodeTable.getLiveNodes() if not nodeAddrList : self._initTimer() return tcpListener = None udpSock = None for port in xrange(10001,20000) : addr = (localIP,port) try : tcpListener = tcpListen( addr, self.reactor, None ) except sock_error : continue udpSock = socket( AF_INET, SOCK_DGRAM ) try : udpSock.bind( addr ) except sock_error : udpSock.close() tcpListener.close() udpSock = tcpListener = None continue break if tcpListener is None : self._initTimer() return self.rpcSock = RPCSocket( udpSock, self.reactor ) self.tcpListener = tcpListener self.firewallOp = _testFirewall( self.tcpListener, self.rpcSock, nodeAddrList, localIP, self.reactor, self._onFirewallCheck ) def _onFirewallCheck( self, result ) : self.firewallOp = None if not result : self.rpcSock.close() self.rpcSock = None self.tcpListener.close() self.tcpListener = None self._initTimer() return self.router = Router( self.tcpListener, self.reactor ) self.dhtNode = DHTNode( self.rpcSock, self.reactor, self.nodeTable.getLiveNodes() ) self.tcpListener = None self.rpcSock = None
class NodeRunner(object): def __init__(self, nodeTable, reactor): self.nodeTable = nodeTable self.reactor = reactor self.timerOp = None self.firewallOp = None self.rpcSock = None self.tcpListener = None self.router = None self.dhtNode = None self._initTimer() def close(self): if self.timerOp: self.timerOp.cancel() self.timerOp = None if self.firewallOp: self.firewallOp.cancel() self.firewallOp = None if self.rpcSock: self.rpcSock.close() self.rpcSock = None if self.tcpListener: self.tcpListener.close() self.tcpListener = None if self.router is not None: self.router.close() self.router = None if self.dhtNode is not None: self.dhtNode.close() self.dhtNode = None def _initTimer(self): timeout = NODE_CHECK_TIME_DELAY self.timerOp = self.reactor.callLater(timeout, self._onTimer) def _onTimer(self): self.timerOp = None localIP = getLocalIP() if localIP is None: self._initTimer() return nodeAddrList = self.nodeTable.getLiveNodes() if not nodeAddrList: self._initTimer() return tcpListener = None udpSock = None for port in xrange(10001, 20000): addr = (localIP, port) try: tcpListener = tcpListen(addr, self.reactor, None) except sock_error: continue udpSock = socket(AF_INET, SOCK_DGRAM) try: udpSock.bind(addr) except sock_error: udpSock.close() tcpListener.close() udpSock = tcpListener = None continue break if tcpListener is None: self._initTimer() return self.rpcSock = RPCSocket(udpSock, self.reactor) self.tcpListener = tcpListener self.firewallOp = _testFirewall(self.tcpListener, self.rpcSock, nodeAddrList, localIP, self.reactor, self._onFirewallCheck) def _onFirewallCheck(self, result): self.firewallOp = None if not result: self.rpcSock.close() self.rpcSock = None self.tcpListener.close() self.tcpListener = None self._initTimer() return self.router = Router(self.tcpListener, self.reactor) self.dhtNode = DHTNode(self.rpcSock, self.reactor, self.nodeTable.getLiveNodes()) self.tcpListener = None self.rpcSock = None