Exemplo n.º 1
0
class Node(object):
    def __init__(self, syncObj, nodeAddr):
        self.__syncObj = weakref.ref(syncObj)
        self.__nodeAddr = nodeAddr
        self.__ip = globalDnsResolver().resolve(nodeAddr.split(':')[0])
        self.__port = int(nodeAddr.split(':')[1])
        self.__shouldConnect = syncObj._getSelfNodeAddr() > nodeAddr
        self.__encryptor = syncObj._getEncryptor()
        self.__conn = None
        if self.__shouldConnect:
            self.__conn = TcpConnection(
                poller=syncObj._poller,
                onConnected=self.__onConnected,
                onMessageReceived=self.__onMessageReceived,
                onDisconnected=self.__onDisconnected,
                timeout=syncObj._getConf().connectionTimeout,
                sendBufferSize=syncObj._getConf().sendBufferSize,
                recvBufferSize=syncObj._getConf().recvBufferSize)
            self.__conn.encryptor = self.__encryptor

        self.__lastConnectAttemptTime = 0
        self.__lastPingTime = 0
        self.__status = NODE_STATUS.DISCONNECTED
        self.__terminating = False

    def _destroy(self):
        self.__shouldConnect = False
        self.__syncObj = None
        if self.__conn is not None:
            self.__conn.disconnect()
        self.__onDisconnected()
        self.__terminating = True

    def __onConnected(self):
        self.__status = NODE_STATUS.CONNECTED
        if self.__encryptor:
            self.__conn.recvRandKey = os.urandom(32)
            self.__conn.send(self.__conn.recvRandKey)
            return
        self.__conn.send(self.__syncObj()._getSelfNodeAddr())

    def __onDisconnected(self):
        self.__status = NODE_STATUS.DISCONNECTED

    def __onMessageReceived(self, message):
        if self.__encryptor and not self.__conn.sendRandKey:
            self.__conn.sendRandKey = message
            self.__conn.send(self.__syncObj()._getSelfNodeAddr())
            return

        self.__syncObj()._onMessageReceived(self.__nodeAddr, message)

    def onPartnerConnected(self, conn):
        if self.__terminating:
            return
        self.__conn = conn
        conn.setOnMessageReceivedCallback(self.__onMessageReceived)
        conn.setOnDisconnectedCallback(self.__onDisconnected)
        self.__status = NODE_STATUS.CONNECTED

    def getStatus(self):
        return self.__status

    def isConnected(self):
        return self.__status == NODE_STATUS.CONNECTED

    def getAddress(self):
        return self.__nodeAddr

    def getSendBufferSize(self):
        return self.__conn.getSendBufferSize()

    def send(self, message):
        if self.__status != NODE_STATUS.CONNECTED:
            return False
        self.__conn.send(message)
        if self.__status != NODE_STATUS.CONNECTED:
            return False
        return True

    def connectIfRequired(self):
        if not self.__shouldConnect:
            return
        if self.__status != NODE_STATUS.DISCONNECTED:
            return
        if time.time() - self.__lastConnectAttemptTime < self.__syncObj(
        )._getConf().connectionRetryTime:
            return
        self.__status = NODE_STATUS.CONNECTING
        self.__lastConnectAttemptTime = time.time()
        if not self.__conn.connect(self.__ip, self.__port):
            self.__status = NODE_STATUS.DISCONNECTED
            return
Exemplo n.º 2
0
class Utility(object):
    def __init__(self, args):

        self.__result = None

        if self.__getData(args):
            self.__poller = createPoller('auto')
            self.__connection = TcpConnection(
                self.__poller,
                onDisconnected=self.__onDisconnected,
                onMessageReceived=self.__onMessageReceived,
                onConnected=self.__onConnected)
            if self.__password is not None:
                self.__connection.encryptor = getEncryptor(self.__password)
            self.__isConnected = self.__connection.connect(
                self.__host, self.__port)
            if not self.__isConnected:
                self.__result = 'can\'t connected'
            while self.__isConnected:
                self.__poller.poll(0.5)

    def __onMessageReceived(self, message):

        if self.__connection.encryptor and not self.__connection.sendRandKey:
            self.__connection.sendRandKey = message
            self.__connection.send(self.__data)
            return
        self.__result = message
        self.__connection.disconnect()

    def __onDisconnected(self):
        self.__isConnected = False

    def __onConnected(self):

        if self.__connection.encryptor:
            self.__connection.recvRandKey = os.urandom(32)
            self.__connection.send(self.__connection.recvRandKey)
            return
        self.__connection.send(self.__data)

    def getResult(self):
        return self.__result

    def __getData(self, args):

        parser = Parser()
        data = parser.parse(args)
        if not self.__checkCorrectAdress(data.connection):
            self.__result = 'invalid adress to connect'
            return False
        self.__host, self.__port = data.connection.split(':')
        self.__port = int(self.__port)

        self.__password = data.password
        if data.status and data.add is None and data.remove is None:
            self.__data = ['status']
            return True
        elif data.add is not None and data.remove is None and not data.status:
            if not self.__checkCorrectAdress(data.add):
                self.__result = 'invalid adress to command add'
                return False
            self.__data = ['add', data.add]
            return True
        elif data.remove is not None and data.add is None and not data.status:
            if not self.__checkCorrectAdress(data.remove):
                self.__result = 'invalid adress to command remove'
                return False
            self.__data = ['remove', data.remove]
            return True
        else:
            self.__result = 'invalid command'
            return False

    def __checkCorrectAdress(self, adress):

        try:
            host, port = adress.split(':')
            port = int(port)
            assert (port > 0 and port < 65536)
            return True
        except:
            return False
Exemplo n.º 3
0
class Node(object):

    def __init__(self, syncObj, nodeAddr, shouldConnect = None):
        self.__syncObj = weakref.ref(syncObj)
        self.__nodeAddr = nodeAddr

        if shouldConnect is not None:
            self.__shouldConnect = shouldConnect
        else:
            self.__shouldConnect = syncObj._getSelfNodeAddr() > nodeAddr

        self.__encryptor = syncObj._getEncryptor()
        self.__conn = None

        if self.__shouldConnect:
            self.__ip = globalDnsResolver().resolve(nodeAddr.split(':')[0])
            self.__port = int(nodeAddr.split(':')[1])
            self.__conn = TcpConnection(poller=syncObj._poller,
                                        onConnected=self.__onConnected,
                                        onMessageReceived=self.__onMessageReceived,
                                        onDisconnected=self.__onDisconnected,
                                        timeout=syncObj._getConf().connectionTimeout,
                                        sendBufferSize=syncObj._getConf().sendBufferSize,
                                        recvBufferSize=syncObj._getConf().recvBufferSize)
            self.__conn.encryptor = self.__encryptor

        self.__lastConnectAttemptTime = 0
        self.__lastPingTime = 0
        self.__status = NODE_STATUS.DISCONNECTED
        self.__terminating = False

    def _destroy(self):
        self.__shouldConnect = False
        self.__syncObj = None
        if self.__conn is not None:
            self.__conn.disconnect()
        self.__onDisconnected()
        self.__terminating = True

    def __onConnected(self):
        self.__status = NODE_STATUS.CONNECTED
        if self.__encryptor:
            self.__conn.recvRandKey = os.urandom(32)
            self.__conn.send(self.__conn.recvRandKey)
            return
        selfAddr = self.__syncObj()._getSelfNodeAddr()
        if selfAddr is not None:
            self.__conn.send(selfAddr)
        else:
            self.__conn.send('readonly')

    def __onDisconnected(self):
        self.__status = NODE_STATUS.DISCONNECTED

    def __onMessageReceived(self, message):
        if self.__encryptor and not self.__conn.sendRandKey:
            self.__conn.sendRandKey = message
            self.__conn.send(self.__syncObj()._getSelfNodeAddr())
            return

        self.__syncObj()._onMessageReceived(self.__nodeAddr, message)

    def onPartnerConnected(self, conn):
        if self.__terminating:
            return
        self.__conn = conn
        conn.setOnMessageReceivedCallback(self.__onMessageReceived)
        conn.setOnDisconnectedCallback(self.__onDisconnected)
        self.__status = NODE_STATUS.CONNECTED

    def getStatus(self):
        return self.__status

    def isConnected(self):
        return self.__status == NODE_STATUS.CONNECTED

    def getAddress(self):
        return self.__nodeAddr

    def getSendBufferSize(self):
        return self.__conn.getSendBufferSize()

    def send(self, message):
        if self.__status != NODE_STATUS.CONNECTED:
            return False
        self.__conn.send(message)
        if self.__status != NODE_STATUS.CONNECTED:
            return False
        return True

    def connectIfRequired(self):
        if not self.__shouldConnect:
            return
        if self.__status != NODE_STATUS.DISCONNECTED:
            return
        if time.time() - self.__lastConnectAttemptTime < self.__syncObj()._getConf().connectionRetryTime:
            return
        self.__status = NODE_STATUS.CONNECTING
        self.__lastConnectAttemptTime = time.time()
        if not self.__conn.connect(self.__ip, self.__port):
            self.__status = NODE_STATUS.DISCONNECTED
            return
Exemplo n.º 4
0
class Utility(object):

    def __init__(self, args):

        self.__result = None

        if self.__getData(args):
            self.__poller = createPoller('auto')
            self.__connection = TcpConnection(self.__poller, onDisconnected=self.__onDisconnected, onMessageReceived=self.__onMessageReceived, onConnected=self.__onConnected)
            if self.__password is not None:
                self.__connection.encryptor = getEncryptor(self.__password)
            self.__isConnected = self.__connection.connect(self.__host, self.__port)
            if not self.__isConnected:
                self.__result = 'can\'t connected'
            while self.__isConnected:
                self.__poller.poll(0.5)


    def __onMessageReceived(self, message):

        if self.__connection.encryptor and not self.__connection.sendRandKey:
            self.__connection.sendRandKey = message
            self.__connection.send(self.__data)
            return
        self.__result = message
        self.__connection.disconnect()

    def __onDisconnected(self):
        self.__isConnected = False

    def __onConnected(self):

        if self.__connection.encryptor:
            self.__connection.recvRandKey = os.urandom(32)
            self.__connection.send(self.__connection.recvRandKey)
            return
        self.__connection.send(self.__data)

    def getResult(self):
        return self.__result

    def __getData(self, args):

        parser = Parser()
        data = parser.parse(args)
        if not self.__checkCorrectAdress(data.connection):
            self.__result = 'invalid adress to connect'
            return False
        self.__host, self.__port = data.connection.split(':')
        self.__port = int(self.__port)

        self.__password = data.password
        if data.status and data.add is None and data.remove is None:
            self.__data = ['status']
            return True
        elif data.add is not None and data.remove is None and not data.status:
            if not self.__checkCorrectAdress(data.add):
                self.__result = 'invalid adress to command add'
                return False
            self.__data = ['add', data.add]
            return True
        elif data.remove is not None and data.add is None and not data.status:
            if not self.__checkCorrectAdress(data.remove):
                self.__result = 'invalid adress to command remove'
                return False
            self.__data = ['remove', data.remove]
            return True
        else:
            self.__result = 'invalid command'
            return False


    def __checkCorrectAdress(self, adress):

        try:
            host, port = adress.split(':')
            port = int(port)
            assert (port > 0 and port < 65536)
            return True
        except:
            return False