def start(self): if not self.use_upnp: self.external_ip = CS.get_external_ip() return self.upnp = UPnP(self.component_manager.reactor, try_miniupnpc_fallback=True) try: found = yield self.upnp.discover() except Exception as err: log.warning("upnp discovery failed: %s", err) found = False if found and not self.upnp.miniupnpc_runner: log.info("set up redirects using txupnp") elif found and self.upnp.miniupnpc_runner: log.warning( "failed to set up redirect with txupnp, miniupnpc fallback was successful" ) if found: try: self.external_ip = yield self.upnp.get_external_ip() yield self._setup_redirects() except Exception as err: log.warning("error trying to set up upnp: %s", err) self.external_ip = CS.get_external_ip() else: self.external_ip = CS.get_external_ip()
class UPnPComponent(Component): component_name = UPNP_COMPONENT def __init__(self, component_manager): Component.__init__(self, component_manager) self._int_peer_port = GCS('peer_port') self._int_dht_node_port = GCS('dht_node_port') self.use_upnp = GCS('use_upnp') self.upnp = None self.upnp_redirects = {} self.external_ip = None @property def component(self): return self @defer.inlineCallbacks def _setup_redirects(self): upnp_redirects = yield DeferredDict({ "UDP": self.upnp.get_next_mapping(self._int_dht_node_port, "UDP", "LBRY DHT port"), "TCP": self.upnp.get_next_mapping(self._int_peer_port, "TCP", "LBRY peer port") }) self.upnp_redirects.update(upnp_redirects) @defer.inlineCallbacks def start(self): if not self.use_upnp: self.external_ip = CS.get_external_ip() return self.upnp = UPnP(self.component_manager.reactor, try_miniupnpc_fallback=True) try: found = yield self.upnp.discover() except Exception as err: log.warning("upnp discovery failed: %s", err) found = False if found and not self.upnp.miniupnpc_runner: log.info("set up redirects using txupnp") elif found and self.upnp.miniupnpc_runner: log.warning( "failed to set up redirect with txupnp, miniupnpc fallback was successful" ) if found: try: self.external_ip = yield self.upnp.get_external_ip() yield self._setup_redirects() except Exception as err: log.warning("error trying to set up upnp: %s", err) self.external_ip = CS.get_external_ip() else: self.external_ip = CS.get_external_ip() def stop(self): return defer.DeferredList([ self.upnp.delete_port_mapping(port, protocol) for protocol, port in self.upnp_redirects.items() ])
def test(ext_port=4446, int_port=4446, proto='UDP'): u = UPnP(reactor) found = yield u.discover() assert found, "M-SEARCH failed to find gateway" external_ip = yield u.get_external_ip() assert external_ip, "Failed to get the external IP" log.info(external_ip) try: yield u.get_specific_port_mapping(ext_port, proto) except UPnPError as err: if 'NoSuchEntryInArray' in str(err): pass else: log.error("there is already a redirect") raise AssertionError() yield u.add_port_mapping(ext_port, proto, int_port, u.lan_address, 'woah', 0) redirects = yield u.get_redirects() if (ext_port, u.lan_address, proto) in map(lambda x: (x[1], x[4], x[2]), redirects): log.info("made redirect") else: log.error("failed to make redirect") raise AssertionError() yield u.delete_port_mapping(ext_port, proto) redirects = yield u.get_redirects() if (ext_port, u.lan_address, proto) not in map(lambda x: (x[1], x[4], x[2]), redirects): log.info("tore down redirect") else: log.error("failed to tear down redirect") raise AssertionError() r = yield u.get_rsip_nat_status() log.info(r) r = yield u.get_status_info() log.info(r) r = yield u.get_connection_type_info() log.info(r)