fix typo and formatting errors, stop console's shutdown from running twice on exit, give more informative message if ports can't be bound, only set upnp if there isn't already a redirect on that port/protocol, and only unset upnp if the redirect was set by the program

This commit is contained in:
Jimmy Kiselak 2015-10-19 15:05:17 -04:00
parent 76a5f2f516
commit 7df6e99e28
4 changed files with 57 additions and 32 deletions

View file

@ -95,8 +95,8 @@ class LBRYSession(object):
self.rate_limiter = rate_limiter self.rate_limiter = rate_limiter
self.external_ip = '127.0.0.1' self.external_ip = '127.0.0.1'
self.upnp_handler = None
self.upnp_redirects_set = False self.upnp_redirects = []
self.wallet = wallet self.wallet = wallet
@ -148,8 +148,7 @@ class LBRYSession(object):
ds.append(defer.maybeDeferred(self.wallet.stop)) ds.append(defer.maybeDeferred(self.wallet.stop))
if self.blob_manager is not None: if self.blob_manager is not None:
ds.append(defer.maybeDeferred(self.blob_manager.stop)) ds.append(defer.maybeDeferred(self.blob_manager.stop))
if self.upnp_redirects_set is True: ds.append(defer.maybeDeferred(self._unset_upnp))
ds.append(defer.maybeDeferred(self._unset_upnp))
return defer.DeferredList(ds) return defer.DeferredList(ds)
def _try_upnp(self): def _try_upnp(self):
@ -163,16 +162,24 @@ class LBRYSession(object):
u = miniupnpc.UPnP() u = miniupnpc.UPnP()
num_devices_found = u.discover() num_devices_found = u.discover()
if num_devices_found > 0: if num_devices_found > 0:
self.upnp_handler = u
u.selectigd() u.selectigd()
external_ip = u.externalipaddress() external_ip = u.externalipaddress()
if external_ip != '0.0.0.0': if external_ip != '0.0.0.0':
self.external_ip = external_ip self.external_ip = external_ip
if self.peer_port is not None: if self.peer_port is not None:
u.addportmapping(self.peer_port, 'TCP', u.lanaddr, self.peer_port, 'LBRY peer port', '') if u.getspecificportmapping(self.peer_port, 'TCP') is None:
u.addportmapping(self.peer_port, 'TCP', u.lanaddr, self.peer_port, 'LBRY peer port', '')
self.upnp_redirects.append((self.peer_port, 'TCP'))
log.info("Set UPnP redirect for TCP port %d", self.peer_port)
else:
log.warning("UPnP redirect already set for TCP port %d", self.peer_port)
if self.dht_node_port is not None: if self.dht_node_port is not None:
u.addportmapping(self.dht_node_port, 'UDP', u.lanaddr, self.dht_node_port, 'LBRY DHT port', '') if u.getspecificportmapping(self.dht_node_port, 'UDP') is None:
self.upnp_redirects_set = True u.addportmapping(self.dht_node_port, 'UDP', u.lanaddr, self.dht_node_port, 'LBRY DHT port', '')
self.upnp_redirects.append((self.dht_node_port, 'UDP'))
log.info("Set UPnP redirect for UPD port %d", self.dht_node_port)
else:
log.warning("UPnP redirect already set for UDP port %d", self.dht_node_port)
return True return True
return False return False
@ -247,11 +254,16 @@ class LBRYSession(object):
def _unset_upnp(self): def _unset_upnp(self):
def threaded_unset_upnp(): def threaded_unset_upnp():
u = self.upnp_handler u = miniupnpc.UPnP()
if self.peer_port is not None: num_devices_found = u.discover()
u.deleteportmapping(self.peer_port, 'TCP') if num_devices_found > 0:
if self.dht_node_port is not None: u.selectigd()
u.deleteportmapping(self.dht_node_port, 'UDP') for port, protocol in self.upnp_redirects:
self.upnp_redirects_set = False if u.getspecificportmapping(port, protocol) is None:
log.warning("UPnP redirect for %s %d was removed by something else.", protocol, port)
else:
u.deleteportmapping(port, protocol)
log.info("Removed UPnP redirect for %s %d.", protocol, port)
self.upnp_redirects = []
return threads.deferToThread(threaded_unset_upnp) return threads.deferToThread(threaded_unset_upnp)

View file

@ -9,7 +9,7 @@
import hashlib, random, struct, time, math, binascii import hashlib, random, struct, time, math, binascii
import argparse import argparse
from twisted.internet import defer from twisted.internet import defer, error
import constants import constants
import routingtable import routingtable
import datastore import datastore
@ -142,7 +142,13 @@ class Node(object):
""" """
# Prepare the underlying Kademlia protocol # Prepare the underlying Kademlia protocol
if self.port is not None: if self.port is not None:
self._listeningPort = twisted.internet.reactor.listenUDP(self.port, self._protocol) #IGNORE:E1101 try:
self._listeningPort = twisted.internet.reactor.listenUDP(self.port, self._protocol)
except error.CannotListenError as e:
import traceback
log.error("Couldn't bind to port %d. %s", self.port, traceback.format_exc())
raise ValueError("%s lbrynet may already be running." % str(e))
#IGNORE:E1101
# Create temporary contact information for the list of addresses of known nodes # Create temporary contact information for the list of addresses of known nodes
if knownNodeAddresses != None: if knownNodeAddresses != None:
bootstrapContacts = [] bootstrapContacts = []

View file

@ -326,15 +326,15 @@ class ShutDown(CommandHandler):
# return True, self._shut_down() # return True, self._shut_down()
def _shut_down(self): def _shut_down(self):
d = self.lbry_service.shut_down() #d = self.lbry_service.shut_down()
def stop_reactor(): #def stop_reactor():
from twisted.internet import reactor from twisted.internet import reactor
self.console.sendLine("Shutting down.") self.console.sendLine("Shutting down.")
reactor.stop() reactor.stop()
d.addBoth(lambda _: stop_reactor()) #d.addBoth(lambda _: stop_reactor())
return d return defer.succeed(True)
class ShutDownFactory(CommandHandlerFactory): class ShutDownFactory(CommandHandlerFactory):
@ -538,7 +538,7 @@ class AddStream(CommandHandler):
self.loading_failed = True self.loading_failed = True
log.error("An exception occurred attempting to load the stream descriptor: %s", err.getTraceback()) log.error("An exception occurred attempting to load the stream descriptor: %s", err.getTraceback())
self.console.sendLine("An unexpected error occurred attempting to load the stream's metadata.\n" self.console.sendLine("An unexpected error occurred attempting to load the stream's metadata.\n"
"See console.log for further details.\n\n") "See console.log for further details.\n\n")
self.finished_deferred.callback(None) self.finished_deferred.callback(None)
def _handle_metadata(self, metadata): def _handle_metadata(self, metadata):
@ -609,17 +609,17 @@ class AddStream(CommandHandler):
NotImplementedError() NotImplementedError()
return choice_string return choice_string
def _get_value_for_choice(self, input): def _get_value_for_choice(self, choice_input):
choice = self.current_option.option_types[self.current_choice] choice = self.current_option.option_types[self.current_choice]
if choice.value == float: if choice.value == float:
try: try:
return float(input) return float(choice_input)
except ValueError: except ValueError:
raise InvalidValueError() raise InvalidValueError()
elif choice.value == bool: elif choice.value == bool:
if input == "0": if choice_input == "0":
return True return True
elif input == "1": elif choice_input == "1":
return False return False
raise InvalidValueError() raise InvalidValueError()
raise NotImplementedError() raise NotImplementedError()
@ -727,7 +727,9 @@ class AddStreamFromLBRYcrdName(AddStreamFromHash):
def start(self, name): def start(self, name):
self.loading_metadata_deferred = self._resolve_name(name) self.loading_metadata_deferred = self._resolve_name(name)
self.loading_metadata_deferred.addCallback(lambda stream_hash: download_sd_blob(self.session, stream_hash, self.payment_rate_manager)) self.loading_metadata_deferred.addCallback(lambda stream_hash: download_sd_blob(self.session,
stream_hash,
self.payment_rate_manager))
self.loading_metadata_deferred.addCallback(self.sd_identifier.get_metadata_for_sd_blob) self.loading_metadata_deferred.addCallback(self.sd_identifier.get_metadata_for_sd_blob)
AddStream.start(self) AddStream.start(self)

View file

@ -3,7 +3,7 @@ from lbrynet.core.Session import LBRYSession
import os.path import os.path
import argparse import argparse
from yapsy.PluginManager import PluginManager from yapsy.PluginManager import PluginManager
from twisted.internet import defer, threads, stdio, task from twisted.internet import defer, threads, stdio, task, error
from lbrynet.lbrynet_console.ConsoleControl import ConsoleControl from lbrynet.lbrynet_console.ConsoleControl import ConsoleControl
from lbrynet.lbrynet_console.LBRYSettings import LBRYSettings from lbrynet.lbrynet_console.LBRYSettings import LBRYSettings
from lbrynet.lbryfilemanager.LBRYFileManager import LBRYFileManager from lbrynet.lbryfilemanager.LBRYFileManager import LBRYFileManager
@ -194,7 +194,7 @@ class LBRYConsole():
if not os.path.exists(lbrycrdd_path_conf_path): if not os.path.exists(lbrycrdd_path_conf_path):
return "" return ""
lbrycrdd_path_conf = open(lbrycrdd_path_conf_path) lbrycrdd_path_conf = open(lbrycrdd_path_conf_path)
lines = lbrycrdd_path_conf.readline() lines = lbrycrdd_path_conf.readlines()
return lines return lines
d = threads.deferToThread(get_lbrycrdd_path_conf_file) d = threads.deferToThread(get_lbrycrdd_path_conf_file)
@ -407,7 +407,12 @@ class LBRYConsole():
self.query_handlers, self.query_handlers,
self.session.peer_manager) self.session.peer_manager)
from twisted.internet import reactor from twisted.internet import reactor
self.lbry_server_port = reactor.listenTCP(self.peer_port, server_factory) try:
self.lbry_server_port = reactor.listenTCP(self.peer_port, server_factory)
except error.CannotListenError as e:
import traceback
log.error("Couldn't bind to port %d. %s", self.peer_port, traceback.format_exc())
raise ValueError("%s lbrynet may already be running on your computer.", str(e))
return defer.succeed(True) return defer.succeed(True)
def stop_server(self): def stop_server(self):