def _list_active_connections(params): result = [] if not driver.is_on('service_gateway'): return {'result': result, } from transport import gateway result = [] wanted_protos = params.get('protos', []) if not wanted_protos: wanted_protos = gateway.list_active_transports() for proto in wanted_protos: for connection in gateway.list_active_sessions(proto): item = { 'status': 'unknown', 'state': 'unknown', 'proto': proto, 'host': 'unknown', 'idurl': 'unknown', 'bytes_sent': 0, 'bytes_received': 0, } if proto == 'tcp': if hasattr(connection, 'stream'): try: host = '%s:%s' % (connection.peer_address[0], connection.peer_address[1]) except: host = 'unknown' item.update({ 'status': 'active', 'state': connection.state, 'host': host, 'idurl': connection.peer_idurl or '', 'bytes_sent': connection.total_bytes_sent, 'bytes_received': connection.total_bytes_received, }) else: try: host = '%s:%s' % (connection.connection_address[0], connection.connection_address[1]) except: host = 'unknown' item.update({ 'status': 'connecting', 'host': host, }) elif proto == 'udp': try: host = '%s:%s' % (connection.peer_address[0], connection.peer_address[1]) except: host = 'unknown' item.update({ 'status': 'active', 'state': connection.state, 'host': host, 'idurl': connection.peer_idurl or '', 'bytes_sent': connection.bytes_sent, 'bytes_received': connection.bytes_received, }) result.append(item) return {'result': result, }
def _list_active_connections(params): result = [] if not driver.is_started('service_gateway'): return {'result': result, } from transport import gateway result = [] wanted_protos = params.get('protos', []) if not wanted_protos: wanted_protos = gateway.list_active_transports() for proto in wanted_protos: for connection in gateway.list_active_sessions(proto): item = { 'status': 'unknown', 'state': 'unknown', 'proto': proto, 'host': 'unknown', 'idurl': 'unknown', 'bytes_sent': 0, 'bytes_received': 0, } if proto == 'tcp': if hasattr(connection, 'stream'): try: host = '%s:%s' % (connection.peer_address[0], connection.peer_address[1]) except: host = 'unknown' item.update({ 'status': 'active', 'state': connection.state, 'host': host, 'idurl': connection.peer_idurl or '', 'bytes_sent': connection.total_bytes_sent, 'bytes_received': connection.total_bytes_received, }) else: try: host = '%s:%s' % (connection.connection_address[0], connection.connection_address[1]) except: host = 'unknown' item.update({ 'status': 'connecting', 'host': host, }) elif proto == 'udp': try: host = '%s:%s' % (connection.peer_address[0], connection.peer_address[1]) except: host = 'unknown' item.update({ 'status': 'active', 'state': connection.state, 'host': host, 'idurl': connection.peer_idurl or '', 'bytes_sent': connection.bytes_sent, 'bytes_received': connection.bytes_received, }) result.append(item) return {'result': result, }
def _do_process_request(self, *args, **kwargs): global _MaxRoutesNumber json_payload, request, info = args[0] user_id = request.CreatorID #--- commands.RequestService() if request.Command == commands.RequestService(): if len(self.routes) >= _MaxRoutesNumber: if _Debug: lg.out( _DebugLevel, 'proxy_server.doProcessRequest RequestService rejected: too many routes' ) lg.out(_DebugLevel, ' %r' % self.routes) p2p_service.SendAck(request, 'rejected', wide=True) else: try: # idsrc = strng.to_bin(json_payload['identity']) idsrc = json_payload['identity'] cached_id = identity.identity(xmlsrc=idsrc) except: lg.out(_DebugLevel, 'payload: [%s]' % request.Payload) lg.exc() return if not cached_id.Valid(): lg.warn('incoming identity is not valid') return if not cached_id.isCorrect(): lg.warn('incoming identity is not correct') return if user_id != cached_id.getIDURL(): lg.warn( 'incoming identity is not belong to request packet creator' ) return if contactsdb.is_supplier(user_id): if _Debug: lg.out( _DebugLevel, 'proxy_server.doProcessRequest RequestService rejected: this user is my supplier' ) p2p_service.SendAck(request, 'rejected', wide=True) return oldnew = '' if user_id not in list(self.routes.keys()): # accept new route oldnew = 'NEW' self.routes[user_id] = {} else: # accept existing routed user oldnew = 'OLD' if not self._is_my_contacts_present_in_identity(cached_id): if _Debug: lg.out(_DebugLevel, ' DO OVERRIDE identity for %s' % user_id) identitycache.OverrideIdentity(user_id, cached_id.serialize()) else: if _Debug: lg.out( _DebugLevel, ' SKIP OVERRIDE identity for %s' % user_id) self.routes[user_id]['time'] = time.time() self.routes[user_id]['identity'] = cached_id.serialize( as_text=True) self.routes[user_id]['publickey'] = strng.to_text( cached_id.publickey) self.routes[user_id][ 'contacts'] = cached_id.getContactsAsTuples(as_text=True) self.routes[user_id]['address'] = [] self._write_route(user_id) active_user_sessions = gateway.find_active_session( info.proto, info.host) if active_user_sessions: user_connection_info = { 'id': active_user_sessions[0].id, 'index': active_user_sessions[0].index, 'proto': info.proto, 'host': info.host, 'idurl': user_id, } active_user_session_machine = automat.objects().get( user_connection_info['index'], None) if active_user_session_machine: active_user_session_machine.addStateChangedCallback( lambda o, n, e, a: self. _on_user_session_disconnected(user_id, o, n, e, a), oldstate='CONNECTED', ) if _Debug: lg.out( _DebugLevel, 'proxy_server.doProcessRequest connected %s routed user, set active session: %s' % (oldnew.capitalize(), user_connection_info)) else: lg.err('not found session state machine: %s' % user_connection_info['index']) else: if _Debug: lg.out( _DebugLevel, 'proxy_server.doProcessRequest active connection with user %s at %s:%s not yet exist' % ( user_id, info.proto, info.host, )) lg.out( _DebugLevel, ' current active sessions: %d' % len(gateway.list_active_sessions(info.proto))) self.acks.append( p2p_service.SendAck(request, 'accepted', wide=True)) if _Debug: lg.out( _DebugLevel, 'proxy_server.doProcessRequest !!!!!!! ACCEPTED %s ROUTE for %s contacts=%s' % ( oldnew.capitalize(), user_id, self.routes[user_id]['contacts'], )) #--- commands.CancelService() elif request.Command == commands.CancelService(): if user_id in self.routes: # cancel existing route self._remove_route(user_id) self.routes.pop(user_id) identitycache.StopOverridingIdentity(user_id) p2p_service.SendAck(request, 'accepted', wide=True) if _Debug: lg.out( _DebugLevel, 'proxy_server.doProcessRequest !!!!!!! CANCELLED ROUTE for %s' % user_id) else: p2p_service.SendAck(request, 'rejected', wide=True) if _Debug: lg.out( _DebugLevel, 'proxy_server.doProcessRequest CancelService rejected : %s is not found in routes' % user_id) lg.out(_DebugLevel, ' %r' % self.routes) else: p2p_service.SendFail(request, 'rejected', wide=True)
def _on_request_service_ack(self, response, info): self.router_connection_info = None if response.PacketID not in self.request_service_packet_id: lg.warn('wrong PacketID in response: %s, but outgoing was : %s' % ( response.PacketID, str(self.request_service_packet_id))) self.automat('service-refused', (response, info)) return if response.PacketID in self.request_service_packet_id: self.request_service_packet_id.remove(response.PacketID) else: lg.warn('%s was not found in pending requests: %s' % (response.PacketID, self.request_service_packet_id)) if _Debug: lg.out(_DebugLevel, 'proxy_receiver._on_request_service_ack : %s' % str(response.Payload)) if self.router_idurl != response.CreatorID: lg.err('received unexpected response from another node: %r ~ %r' % (self.router_idurl, response.CreatorID, )) self.automat('service-refused', (response, info)) return service_ack_info = strng.to_text(response.Payload) if service_ack_info.startswith('rejected'): self.automat('service-refused', (response, info)) return active_router_sessions = gateway.find_active_session(info.proto, host=info.host) if not active_router_sessions: active_router_sessions = gateway.find_active_session(info.proto, idurl=id_url.to_bin(response.CreatorID)) if not active_router_sessions: lg.err('active connection with proxy router at %s:%s was not found' % (info.proto, info.host, )) if _Debug: lg.args(_DebugLevel, router_idurl=self.router_idurl, ack_packet=info, active_sessions=gateway.list_active_sessions(info.proto)) self.automat('service-refused', (response, info)) return self.router_connection_info = { 'id': active_router_sessions[0].id, 'index': active_router_sessions[0].index, 'repr': repr(active_router_sessions[0]), 'proto': info.proto, 'host': info.host, 'idurl': self.router_idurl, 'global_id': global_id.UrlToGlobalID(self.router_idurl), } active_router_session_machine = automat.by_index(self.router_connection_info['index']) if active_router_session_machine is None: lg.err('did not found proxy router session state machine instance: %s' % self.router_connection_info) self.router_connection_info = None if _Debug: lg.args(_DebugLevel, automats=automat.objects()) self.automat('service-refused', (response, info)) return lg.info('found active session for proxy router: %s' % active_router_session_machine) self.automat('service-accepted', (response, info, active_router_session_machine))