def doStunExternalIP(self, arg):
     dhnio.Dprint(4, 'identity_registrator.doStunExternalIP')
     def save(ip):
         dhnio.Dprint(4, 'identity_registrator.doStunExternalIP.save [%s]' % ip)
         dhnio.WriteFile(settings.ExternalIPFilename(), ip)
         self.automat('stun-success', ip)
     stun.stunExternalIP(
         close_listener=False, 
         internal_port=settings.getUDPPort(), 
         block_marker=shutdowner.A).addCallbacks(
             save, lambda x: self.automat('stun-failed'))
 def doStunExternalIP(self, arg):
     dhnio.Dprint(4, 'network_connector.doStunExternalIP last result %s was %d seconds ago' % (stun.last_stun_result(), time.time()-stun.last_stun_time()))
     
     def stun_success(externalip):
         if externalip == '0.0.0.0':
             ConnectionFailedCallback(str(externalip), 'stun', '')
             self.automat('stun-failed')
             return
         localip = dhnnet.getLocalIp()
         dhnio.WriteFile(settings.ExternalIPFilename(), str(externalip))
         dhnio.WriteFile(settings.LocalIPFilename(), str(localip))
         ConnectionDoneCallback(str(externalip), 'stun', '')
         self.automat('stun-success')
         
     def stun_failed(x):
         ConnectionFailedCallback(str(x), 'stun', '')
         self.automat('stun-failed')
         
     if time.time() - stun.last_stun_time() < 60:
         if stun.last_stun_result():
             if stun.last_stun_result() != '0.0.0.0':
                 self.automat('stun-success')
             else:
                 self.automat('stun-failed')
         else:
             if self.last_internet_state == 'connected':
                 self.automat('stun-success')
             else:
                 self.automat('stun-failed')
         return
     
     stun.stunExternalIP(
         close_listener=False, 
         internal_port=settings.getUDPPort(),
         block_marker=shutdowner.A,
         verbose=True if dhnio.Debug(10) else False).addCallbacks(
             stun_success, stun_failed)
Beispiel #3
0
 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)