Пример #1
0
def _testFirewall( tcpListener, rpcSock, nodeAddrList, localIP,
        reactor, callback=None ) :
    def doCancel() :
        for checkOp in checkOps :
            checkOp.cancel()
        checkOps.clear()
        testServer.close()
    def onCheck( checkOp, err, payload ) :
        checkOps.remove( checkOp )
        if err >= 0 :
            fwResult,fwToken = payload
            if (fwResult >= 0) and (fwToken == token) :
                successList.append( 1 )
        if not checkOps :
            testServer.close()
            # n(success)/n(nodes) >= 1/2
            op.notify( 2*len(successList) >= len(nodeAddrList) )
    def doCheck( nodeAddr ) :
        checkOp = dhtClient.callFirewallCheck( localIP, nodeAddr,
                lambda e,p : onCheck(checkOp,e,p) )
        checkOps.add( checkOp )
    assert nodeAddrList
    successList = []
    checkOps = set()
    token = rand_bytes( 20 )
    dhtClient = DHTClient( rpcSock )
    testServer = FirewallTestServer( tcpListener, token, reactor )
    for nodeAddr in nodeAddrList :
        doCheck( nodeAddr )
    op = AsyncOp( callback, doCancel )
    return op
Пример #2
0
 def addIncoming( self, sslConn, peerKey ) :
     while True :
         connectionId = hexEncode( rand_bytes(8) )
         if connectionId not in self.connections : break
     def onTimeout() : self._onTimeout( connectionId )
     timerOp = self.reactor.callLater( 30, onTimeout )
     self.connections[connectionId] = (sslConn,peerKey,timerOp)
     return connectionId
Пример #3
0
 def request( self, data, destaddr, callback=None ) :
     while 1 :
         id = rand_bytes( 20 )
         if not self.pending.has_key(id) : break
     msg = (0, id, data)
     s = encode( msg )
     def cancelRequest() :
         del self.pending[id]
     op = RPCOp( id, callback, cancelRequest )
     self.pending[id] = op
     self._sendData( s, destaddr )
     return op
Пример #4
0
    def request(self, data, destaddr, callback=None):
        while 1:
            id = rand_bytes(20)
            if not self.pending.has_key(id): break
        msg = (0, id, data)
        s = encode(msg)

        def cancelRequest():
            del self.pending[id]

        op = RPCOp(id, callback, cancelRequest)
        self.pending[id] = op
        self._sendData(s, destaddr)
        return op
Пример #5
0
 def _doRegister( self, args, ctx ) :
     try :
         assert self.state == self.INITIAL
         assert len(args) == 0
     except :
         ctx.response( (-1,'') )
         return
     while True :
         routerId = rand_bytes( 20 )
         if routerId not in self.routerState.registered : break
     self.routerId = routerId
     self.state = self.REGISTERED
     self.routerState.registered[routerId] = self
     ctx.response( (0,self.routerId) )
Пример #6
0
 def _doConnect( self, args, ctx ) :
     try :
         assert self.state == self.INITIAL
         assert len(args) == 1
         routerId = args[0]
         assert type(routerId) is str
         handler = self.routerState.registered.get( routerId )
         assert handler is not None
     except :
         ctx.response( [-1] )
         return
     while True :
         connectionId = rand_bytes( 20 )
         if connectionId not in self.routerState.connecting : break
     self.connectionId = connectionId
     self.connectCtx = ctx
     self.state = self.CONNECTING
     self.routerState.connecting[connectionId] = self
     handler.sendIncoming( connectionId )
Пример #7
0
def _testFirewall(tcpListener,
                  rpcSock,
                  nodeAddrList,
                  localIP,
                  reactor,
                  callback=None):
    def doCancel():
        for checkOp in checkOps:
            checkOp.cancel()
        checkOps.clear()
        testServer.close()

    def onCheck(checkOp, err, payload):
        checkOps.remove(checkOp)
        if err >= 0:
            fwResult, fwToken = payload
            if (fwResult >= 0) and (fwToken == token):
                successList.append(1)
        if not checkOps:
            testServer.close()
            # n(success)/n(nodes) >= 1/2
            op.notify(2 * len(successList) >= len(nodeAddrList))

    def doCheck(nodeAddr):
        checkOp = dhtClient.callFirewallCheck(
            localIP, nodeAddr, lambda e, p: onCheck(checkOp, e, p))
        checkOps.add(checkOp)

    assert nodeAddrList
    successList = []
    checkOps = set()
    token = rand_bytes(20)
    dhtClient = DHTClient(rpcSock)
    testServer = FirewallTestServer(tcpListener, token, reactor)
    for nodeAddr in nodeAddrList:
        doCheck(nodeAddr)
    op = AsyncOp(callback, doCancel)
    return op