def main(): """ For test. """ try: from twisted.internet import reactor except: sys.exit('Error initializing twisted.internet.reactor in central_service.py') transport_control.init() SendIdentity() reactor.run()
def UpdateTransports(arg): dhnio.Dprint(4, 'p2p_connector.UpdateTransports') changes = set() if arg and arg not in [ 'CONNECTED', 'ONLY_ID' ]: changes = set(arg) # let's stop transport not needed anymore pass def _stop_transports(): stoplist = [] for proto in transport_control.ListSupportedProtocols(): contact = misc.getLocalIdentity().getProtoContact(proto) if contact is None: dhnio.Dprint(4, 'p2p_connector.UpdateTransports want to stop transport %s because not present in local identity' % proto) stoplist.append(transport_control.StopProtocol(proto)) continue proto_, host, port, filename = nameurl.UrlParse(contact) if host.strip() == '': continue opts = transport_control.ProtocolOptions(proto) if opts[0].strip() == '': continue if proto != proto_: dhnio.Dprint(8, 'p2p_connector.UpdateTransports WARNING identity contact is %s, but proto is %s' % (contact, proto)) continue #---tcp--- if proto == 'tcp': if opts[0] != host: dhnio.Dprint(4, 'p2p_connector.UpdateTransports want to stop transport [tcp] because IP changed') stoplist.append(transport_control.StopProtocol(proto)) continue if opts[1] != port: dhnio.Dprint(4, 'p2p_connector.UpdateTransports want to stop transport [tcp] because port changed') stoplist.append(transport_control.StopProtocol(proto)) continue #---cspace--- if proto == 'cspace': if opts[0] != host: dhnio.Dprint(4, 'p2p_connector.UpdateTransports want to stop transport [cspace] because keyID changed: %s to %s' % ( host, opts[0])) stoplist.append(transport_control.StopProtocol(proto)) continue #---udp--- if proto == 'udp': if opts[0] != host: dhnio.Dprint(4, 'p2p_connector.UpdateTransports want to stop transport [udp] because IP were changed') stoplist.append(transport_control.StopProtocol(proto)) continue if opts[1] != port: dhnio.Dprint(4, 'p2p_connector.UpdateTransports want to stop transport [udp] because port were changed') stoplist.append(transport_control.StopProtocol(proto)) continue if 'transport.transport-udp.transport-udp-port' in changes and settings.enableUDP(): dhnio.Dprint(4, 'p2p_connector.UpdateTransports want to stop transport [udp] because port were changed by user') stoplist.append(transport_control.StopProtocol(proto)) continue #need to wait before all listeners will be stopped return DeferredList(stoplist) # let's start transport that isn't started yet def _start_transports(): startlist = [] for contact in misc.getLocalIdentity().getContacts(): proto, host, port, filename = nameurl.UrlParse(contact) opts = transport_control.ProtocolOptions(proto) if not transport_control.ProtocolIsSupported(proto): if settings.transportIsEnabled(proto) and settings.transportIsInstalled(proto) and settings.transportReceivingIsEnabled(proto): #---tcp--- if proto == 'tcp': def _tcp_started(l, opts): dhnio.Dprint(4, 'p2p_connector.UpdateTransports._tcp_started') if l is not None: transport_control.StartProtocol('tcp', l, opts[0], opts[1], opts[2]) return l def _tcp_failed(x): dhnio.Dprint(4, 'p2p_connector.UpdateTransports._tcp_failed WARNING: '+str(x)) return x def _start_tcp(options): dhnio.Dprint(4, 'p2p_connector.UpdateTransports._start_tcp on port %d' % int(options[1])) d = transport_tcp.receive(int(options[1])) d.addCallback(_tcp_started, options) d.addErrback(_tcp_failed) startlist.append(d) def _upnp_result(result, options): dhnio.Dprint(4, 'p2p_connector.UpdateTransports._upnp_result %s' % str(result)) if result is not None: options[1] = str(result[1]) _start_tcp(options) def _run_upnpc(port): shutdowner.A('block') run_upnpc.update(port) shutdowner.A('unblock') externalIP = misc.readExternalIP() if opts is None: opts = (externalIP, '', '') opts = list(opts) opts[0] = externalIP opts[1] = settings.getTCPPort() if settings.enableUPNP(): d = maybeDeferred(_run_upnpc, int(opts[1])) d.addCallback(_upnp_result, opts) else: _start_tcp(opts) #---cspace--- elif proto == 'cspace' and transport_control._TransportCSpaceEnable: def _cspace_started(x, opts): if not transport_cspace.registered(): dhnio.Dprint(4, 'p2p_connector.UpdateTransports._cspace_started WARNING not registered: ' + str(x)) return x dhnio.Dprint(4, 'p2p_connector.UpdateTransports._cspace_started') keyID = transport_cspace.keyID() settings.setCSpaceKeyID(keyID) opts[0] = keyID l = transport_cspace.getListener() transport_control.StartProtocol('cspace', l, opts[0], opts[1], opts[2]) return x if opts is None: opts = (settings.getCSpaceKeyID(), '', '') opts = list(opts) d = transport_cspace.init().addBoth(_cspace_started, opts) startlist.append(d) #---udp--- elif proto == 'udp' and transport_control._TransportUDPEnable: def _udp_start(x, opts): dhnio.Dprint(4, 'p2p_connector.UpdateTransports._udp_start') if opts is None: opts = (stun.getUDPClient().externalAddress[0], str(stun.getUDPClient().externalAddress[1]), '') opts = list(opts) opts[0] = stun.getUDPClient().externalAddress[0] opts[1] = str(stun.getUDPClient().externalAddress[1]) transport_udp.init(stun.getUDPClient()) l = transport_udp.getListener() if l is not None: transport_control.StartProtocol('udp', l, opts[0], opts[1], opts[2]) return x def _udp_failed(x): dhnio.Dprint(4, 'p2p_connector.UpdateTransports._udp_failed') return x if stun.getUDPClient() is None or stun.getUDPClient().externalAddress is None: d = stun.stunExternalIP( close_listener=False, internal_port=settings.getUDPPort(), block_marker=shutdowner.A) else: d = succeed('') d.addCallback(_udp_start, opts) d.addErrback(_udp_failed) startlist.append(d) #need to wait before all listeners will be started return DeferredList(startlist) transport_control.init( lambda: _stop_transports().addBoth( lambda x: _start_transports().addBoth( lambda x: A('transports-updated'))))