def tcp_server(self, addrinfo, task=None): task.set_daemon() sock = AsyncSocket(socket.socket(addrinfo.family, socket.SOCK_STREAM), keyfile=self.keyfile, certfile=self.certfile) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.bind((addrinfo.ip, self.info_port)) except Exception: logger.warning('Could not bind TCP server to %s:%s', addrinfo.ip, self.info_port) raise StopIteration logger.info('dispyadmin TCP server at %s:%s', addrinfo.ip, self.info_port) sock.listen(16) while 1: try: conn, addr = yield sock.accept() except ssl.SSLError as err: logger.debug('SSL connection failed: %s', str(err)) continue except GeneratorExit: break except Exception: logger.debug(traceback.format_exc()) continue Task(self.tcp_req, conn, addr) sock.close()
def relay_tcp_proc(self, addrinfo, task=None): task.set_daemon() auth_len = len(dispy.auth_code('', '')) tcp_sock = AsyncSocket(socket.socket(addrinfo.family, socket.SOCK_STREAM), keyfile=self.keyfile, certfile=self.certfile) tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) tcp_sock.bind((addrinfo.ip, self.relay_port)) tcp_sock.listen(8) def tcp_req(conn, addr, task=None): conn.settimeout(dispy.MsgTimeout) try: msg = yield conn.recvall(auth_len) msg = yield conn.recv_msg() except Exception: logger.debug(traceback.format_exc()) logger.debug('Ignoring invalid TCP message from %s:%s', addr[0], addr[1]) raise StopIteration finally: conn.close() try: msg = deserialize(msg[len('PING:'.encode()):]) if msg['version'] != __version__: logger.warning('Ignoring %s due to version mismatch: %s / %s', msg['ip_addrs'], msg['version'], __version__) raise StopIteration except Exception: logger.debug('Ignoring ping message from %s (%s)', addr[0], addr[1]) logger.debug(traceback.format_exc()) raise StopIteration Task(self.verify_broadcast, addrinfo, msg) while 1: conn, addr = yield tcp_sock.accept() Task(tcp_req, conn, addr)
def relay_tcp_proc(self, addrinfo, task=None): task.set_daemon() auth_len = len(dispy.auth_code('', '')) tcp_sock = AsyncSocket(socket.socket(addrinfo.family, socket.SOCK_STREAM), keyfile=self.keyfile, certfile=self.certfile) tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) tcp_sock.bind((addrinfo.ip, self.relay_port)) tcp_sock.listen(8) def tcp_req(conn, addr, task=None): conn.settimeout(dispy.MsgTimeout) try: msg = yield conn.recvall(auth_len) msg = yield conn.recv_msg() except: logger.debug(traceback.format_exc()) logger.debug('Ignoring invalid TCP message from %s:%s', addr[0], addr[1]) raise StopIteration finally: conn.close() try: msg = deserialize(msg[len('PING:'.encode()):]) if msg['version'] != __version__: logger.warning('Ignoring %s due to version mismatch: %s / %s', msg['ip_addrs'], msg['version'], __version__) raise StopIteration except: logger.debug('Ignoring ping message from %s (%s)', addr[0], addr[1]) logger.debug(traceback.format_exc()) raise StopIteration Task(self.verify_broadcast, addrinfo, msg) while 1: conn, addr = yield tcp_sock.accept() Task(tcp_req, conn, addr)
def tcp_server(self, addrinfo, task=None): task.set_daemon() sock = AsyncSocket(socket.socket(addrinfo.family, socket.SOCK_STREAM), keyfile=self.keyfile, certfile=self.certfile) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.bind((addrinfo.ip, self.info_port)) except Exception: logger.warning('Could not bind TCP server to %s:%s', addrinfo.ip, self.info_port) raise StopIteration logger.debug('dispyadmin TCP server at %s:%s', addrinfo.ip, self.info_port) sock.listen(16) while 1: try: conn, addr = yield sock.accept() except ssl.SSLError as err: logger.debug('SSL connection failed: %s', str(err)) continue except GeneratorExit: break except Exception: logger.debug(traceback.format_exc()) continue Task(self.tcp_req, conn, addr) sock.close()
def listen_tcp_proc(self, addrinfo, task=None): task.set_daemon() tcp_sock = AsyncSocket(socket.socket(addrinfo.family, socket.SOCK_STREAM)) tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) tcp_sock.bind((addrinfo.ip, self.listen_port)) tcp_sock.listen(8) bc_sock = AsyncSocket(socket.socket(addrinfo.family, socket.SOCK_DGRAM)) if addrinfo.family == socket.AF_INET: bc_sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) else: # addrinfo.sock_family == socket.AF_INET6 bc_sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, struct.pack('@i', 1)) bc_sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addrinfo.ifn) bc_sock.bind((addrinfo.ip, 0)) auth_len = len(dispy.auth_code('', '')) def tcp_req(conn, addr, task=None): conn.settimeout(5) try: msg = yield conn.recvall(auth_len) msg = yield conn.recv_msg() except: logger.debug(traceback.format_exc()) logger.debug('Ignoring invalid TCP message from %s:%s', addr[0], addr[1]) raise StopIteration finally: conn.close() logger.debug('Ping message from %s (%s)', addr[0], addr[1]) try: info = deserialize(msg[len('PING:'.encode()):]) if info['version'] != __version__: logger.warning('Ignoring %s due to version mismatch: %s / %s', info['ip_addrs'], info['version'], __version__) raise StopIteration # TODO: since dispynetrelay is not aware of computations # closing, if more than one client sends ping, nodes will # respond to different clients self.scheduler_ip_addrs = info['ip_addrs'] + [addr[0]] self.scheduler_port = info['port'] except: logger.debug('Ignoring ping message from %s (%s)', addr[0], addr[1]) logger.debug(traceback.format_exc()) raise StopIteration if info.get('relay', None): logger.debug('Ignoring ping back (from %s)', addr[0]) raise StopIteration logger.debug('relaying ping from %s / %s', info['ip_addrs'], addr[0]) if self.node_port == self.listen_port: info['relay'] = 'y' # 'check if this message loops back to self yield bc_sock.sendto('PING:'.encode() + serialize(info), (self._broadcast, self.node_port)) while 1: conn, addr = yield tcp_sock.accept() Task(tcp_req, conn, addr)