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
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
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
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