From a1368b05da6400aad7d369c483d4701bcf463c4f Mon Sep 17 00:00:00 2001 From: Jack Robison Date: Wed, 17 Oct 2018 10:57:10 -0400 Subject: [PATCH] txupnp --> aioupnp -update INSTALL.md --- INSTALL.md | 73 +++++++++++------------------------- lbrynet/core/log_support.py | 2 +- lbrynet/daemon/Components.py | 31 +++++++++------ setup.py | 2 +- 4 files changed, 43 insertions(+), 65 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index fe2474c6e..4ff7d1c4f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -4,29 +4,37 @@ If only the json-rpc API server is needed the recommended way to install LBRY is These instructions are for installing LBRY from source, which is recommended if you are interested in doing development work or LBRY is not available on your operating system (godspeed, TempleOS users). +Here's a video walkthrough of this setup which is itself hosted by the LBRY network and provided via [spee.ch](https://github.com/lbryio/spee.ch): +[![Setup for development](https://spee.ch/2018-10-04-17-13-54-017046806.png)](https://spee.ch/967f99344308f1e90f0620d91b6c93e4dfb240e0/lbrynet-dev-setup.mp4) + ## Prerequisites -Before starting, you'll need to install some additional libraries depending on your operating system. +Running `lbrynet` from source requires Python 3.6 or higher (3.7 is preferred). Get the installer for your OS [here](https://www.python.org/downloads/release/python-370/) -### Python +After installing python 3 you'll need to install some additional libraries depending on your operating system. -Running `lbrynet` from source requires [Python 3.7](https://www.python.org/downloads/release/python-370/) +### Virtualenv + +Once python 3 is installed run `python3 -m pip install virtualenv` to install virtualenv. + +### Windows + +Windows users will need to install `Visual C++ Build Tools`, which can be installed by [Microsoft Build Tools](Microsoft Build Tools 2015) -### OS X Prerequisites +### OS X -Install [xcode command line tools](https://developer.xamarin.com/guides/testcloud/calabash/configuring/osx/install-xcode-command-line-tools/) and [homebrew](http://brew.sh/). +OS X users will need to install [xcode command line tools](https://developer.xamarin.com/guides/testcloud/calabash/configuring/osx/install-xcode-command-line-tools/) and [homebrew](http://brew.sh/). Remaining dependencies can then be installed by running: ``` brew install python3 protobuf -python3 -m pip install virtualenv ``` -### Linux Prerequisites +### Linux -On Ubuntu (we recommend 16.04), install the following: +On Ubuntu (we recommend 18.04), install the following: ``` sudo apt-get install build-essential python3.7 python3.7-dev git python-virtualenv libssl-dev python-protobuf @@ -36,33 +44,6 @@ On Raspbian, you will also need to install `python-pyparsing`. If you're running another Linux flavor, install the equivalent of the above packages for your system. -### Windows Prerequisites - -Install [mingw32](http://www.mingw.org/) base and c++ compiler. - -Add C:\MinGW\bin to the windows PATH. - -Enable distutils to compile with mingw32 by creating a distutils.cfg file in *PYTHONPATH\Lib\distutils* containing: - -``` -[build] -compiler = mingw32 -``` - -If using virtualenv, which is recommended, copy the *PYTHONPATH\Lib\distutils* directory to the virtualenv. - -It's recommended to use [Unofficial Windows Binaries for Python Extension Packages](http://www.lfd.uci.edu/~gohlke/pythonlibs/) for as many of the required packages as possible. -Currently, available binaries include: -- Twisted -- Zope.interface -- pywin32 - -Install the above binaries with `pip install *.whl` - -Install pywin32 system files by run `python.exe Scripts\pywin32_postinstall.py -install` from an elevated command prompt. - -Finally, you'll need [miniupnpc](https://pypi.python.org/pypi/miniupnpc/1.9). Download the source and compile with MinGW by running `mingw32make.bat`. Then install the module by running `python setupmingw32.py install`. - ## Installation To install: @@ -79,30 +60,18 @@ To install: pip install --editable .[test] # [test] installs extras needed for running the tests ``` +To verify your install, `which lbrynet` should return a path inside of the `lbry-venv` folder created by the `virtualenv` command. + +## Run the tests To run the unit tests from the repo directory: ``` trial --reactor=asyncio tests.unit ``` +## Usage + To start the API server: `lbrynet start` -To verify your install, `which lbrynet` should return a path inside of the `lbry-venv` folder created by the `virtualenv` command. - -## Making a Change - -If you are not already inside the virtual environment, run: - -``` -source lbry-venv/bin/activate -``` - -Then run: - -``` -pip install --editable . -``` - -This will install `lbrynet` in such a way that the changes you make to the code will be used as soon as you restart the API server. Happy hacking! diff --git a/lbrynet/core/log_support.py b/lbrynet/core/log_support.py index 50444d125..129719948 100644 --- a/lbrynet/core/log_support.py +++ b/lbrynet/core/log_support.py @@ -89,7 +89,7 @@ def disable_third_party_loggers(): logging.getLogger('BitcoinRPC').setLevel(logging.INFO) logging.getLogger('lbryum').setLevel(logging.WARNING) logging.getLogger('twisted').setLevel(logging.CRITICAL) - logging.getLogger('txupnp').setLevel(logging.WARNING) + logging.getLogger('aioupnp').setLevel(logging.WARNING) @_log_decorator diff --git a/lbrynet/daemon/Components.py b/lbrynet/daemon/Components.py index 4aa61ee8a..b8ee10e06 100644 --- a/lbrynet/daemon/Components.py +++ b/lbrynet/daemon/Components.py @@ -3,12 +3,13 @@ import asyncio import logging import treq import math +import asyncio import binascii from hashlib import sha256 from types import SimpleNamespace from twisted.internet import defer, threads, reactor, error import lbryschema -from txupnp.upnp import UPnP +from aioupnp.upnp import UPnP from lbrynet import conf from lbrynet.core.utils import DeferredDict from lbrynet.core.PaymentRateManager import OnlyFreePaymentsManager @@ -50,6 +51,10 @@ RATE_LIMITER_COMPONENT = "rate_limiter" PAYMENT_RATE_COMPONENT = "payment_rate_manager" +def from_future(coroutine: asyncio.coroutine) -> defer.Deferred: + return defer.Deferred.fromFuture(asyncio.ensure_future(coroutine)) + + def get_wallet_config(): wallet_type = GCS('wallet') if wallet_type == conf.LBRYCRD_WALLET: @@ -688,8 +693,8 @@ class UPnPComponent(Component): @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") + "UDP": from_future(self.upnp.get_next_mapping(self._int_dht_node_port, "UDP", "LBRY DHT port")), + "TCP": from_future(self.upnp.get_next_mapping(self._int_peer_port, "TCP", "LBRY peer port")) }) self.upnp_redirects.update(upnp_redirects) @@ -698,20 +703,23 @@ class UPnPComponent(Component): 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() + self.upnp = yield from_future(UPnP.discover()) + log.info("found upnp gateway") + found = True 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() + self.external_ip = yield from_future(self.upnp.get_external_ip()) + if self.external_ip == "0.0.0.0": + log.warning("upnp doesn't know the external ip address (returned 0.0.0.0), using fallback") + self.external_ip = CS.get_external_ip() + else: + log.info("got external ip from upnp: %s", self.external_ip) yield self._setup_redirects() + log.info("set up upnp port redirects") except Exception as err: log.warning("error trying to set up upnp: %s", err) self.external_ip = CS.get_external_ip() @@ -720,7 +728,8 @@ class UPnPComponent(Component): def stop(self): return defer.DeferredList( - [self.upnp.delete_port_mapping(port, protocol) for protocol, port in self.upnp_redirects.items()] + [from_future(self.upnp.delete_port_mapping(port, protocol)) + for protocol, port in self.upnp_redirects.items()] ) diff --git a/setup.py b/setup.py index 4823b50b6..d8f01c997 100644 --- a/setup.py +++ b/setup.py @@ -24,6 +24,7 @@ setup( install_requires=[ 'asyncio', 'aiohttp', + 'aioupnp', 'twisted[tls]==18.7.0', 'appdirs', 'distro', @@ -33,7 +34,6 @@ setup( 'cryptography', 'lbryschema', 'torba', - 'txupnp', 'pyyaml', 'requests', 'txJSON-RPC',