periodically check internet connection and for new versions
This commit is contained in:
parent
24eed71959
commit
29f7307f9d
1 changed files with 105 additions and 42 deletions
|
@ -11,9 +11,11 @@ import base64
|
||||||
import base58
|
import base58
|
||||||
import platform
|
import platform
|
||||||
import json
|
import json
|
||||||
|
import socket
|
||||||
|
|
||||||
from twisted.web import server, resource, static
|
from twisted.web import server, resource, static
|
||||||
from twisted.internet import defer, threads, error, reactor
|
from twisted.internet import defer, threads, error, reactor
|
||||||
|
from twisted.internet.task import LoopingCall
|
||||||
from txjsonrpc import jsonrpclib
|
from txjsonrpc import jsonrpclib
|
||||||
from txjsonrpc.web import jsonrpc
|
from txjsonrpc.web import jsonrpc
|
||||||
from txjsonrpc.web.jsonrpc import Handler
|
from txjsonrpc.web.jsonrpc import Handler
|
||||||
|
@ -70,15 +72,29 @@ handler = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=262144, ba
|
||||||
log.addHandler(handler)
|
log.addHandler(handler)
|
||||||
log.setLevel(logging.INFO)
|
log.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
|
||||||
|
INITIALIZING_CODE = 'initializing'
|
||||||
|
LOADING_DB_CODE = 'loading_db'
|
||||||
|
LOADING_WALLET_CODE = 'loading_wallet'
|
||||||
|
LOADING_FILE_MANAGER_CODE = 'loading_file_manager'
|
||||||
|
LOADING_SERVER_CODE = 'loading_server'
|
||||||
|
STARTED_CODE = 'started'
|
||||||
STARTUP_STAGES = [
|
STARTUP_STAGES = [
|
||||||
('initializing', 'Initializing...'),
|
(INITIALIZING_CODE, 'Initializing...'),
|
||||||
('loading_db', 'Loading databases...'),
|
(LOADING_DB_CODE, 'Loading databases...'),
|
||||||
('loading_wallet', 'Catching up with the blockchain... %s'),
|
(LOADING_WALLET_CODE, 'Catching up with the blockchain... %s'),
|
||||||
('loading_file_manager', 'Setting up file manager'),
|
(LOADING_FILE_MANAGER_CODE, 'Setting up file manager'),
|
||||||
('loading_server', 'Starting lbrynet'),
|
(LOADING_SERVER_CODE, 'Starting lbrynet'),
|
||||||
('started', 'Started lbrynet')
|
(STARTED_CODE, 'Started lbrynet')
|
||||||
]
|
]
|
||||||
|
|
||||||
|
CONNECT_CODE_VERSION_CHECK = 'version_check'
|
||||||
|
CONNECT_CODE_NETWORK = 'network_connection'
|
||||||
|
CONNECT_CODE_WALLET = 'wallet_catchup_lag'
|
||||||
|
CONNECTION_PROBLEM_CODES = [(CONNECT_CODE_VERSION_CHECK, "There was a problem checking for updates on github"),
|
||||||
|
(CONNECT_CODE_NETWORK, "Your internet connection appears to have been interrupted"),
|
||||||
|
(CONNECT_CODE_WALLET, "Synchronization with the blockchain is lagging... if this continues try restarting LBRY")]
|
||||||
|
|
||||||
ALLOWED_DURING_STARTUP = ['is_running', 'is_first_run',
|
ALLOWED_DURING_STARTUP = ['is_running', 'is_first_run',
|
||||||
'get_time_behind_blockchain', 'stop',
|
'get_time_behind_blockchain', 'stop',
|
||||||
'daemon_status', 'get_start_notice',
|
'daemon_status', 'get_start_notice',
|
||||||
|
@ -91,6 +107,9 @@ OK_CODE = 200
|
||||||
# TODO alert if your copy of a lbry file is out of date with the name record
|
# TODO alert if your copy of a lbry file is out of date with the name record
|
||||||
|
|
||||||
|
|
||||||
|
REMOTE_SERVER = "www.google.com"
|
||||||
|
|
||||||
|
|
||||||
class LBRYDaemon(jsonrpc.JSONRPC):
|
class LBRYDaemon(jsonrpc.JSONRPC):
|
||||||
"""
|
"""
|
||||||
LBRYnet daemon, a jsonrpc interface to lbry functions
|
LBRYnet daemon, a jsonrpc interface to lbry functions
|
||||||
|
@ -105,6 +124,8 @@ class LBRYDaemon(jsonrpc.JSONRPC):
|
||||||
self.startup_status = STARTUP_STAGES[0]
|
self.startup_status = STARTUP_STAGES[0]
|
||||||
self.startup_message = None
|
self.startup_message = None
|
||||||
self.announced_startup = False
|
self.announced_startup = False
|
||||||
|
self.connected_to_internet = True
|
||||||
|
self.connection_problem = None
|
||||||
self.query_handlers = {}
|
self.query_handlers = {}
|
||||||
self.ui_version = ui_version_info.replace('\n', '')
|
self.ui_version = ui_version_info.replace('\n', '')
|
||||||
self.git_lbrynet_version = None
|
self.git_lbrynet_version = None
|
||||||
|
@ -172,6 +193,10 @@ class LBRYDaemon(jsonrpc.JSONRPC):
|
||||||
self.wallet_user = None
|
self.wallet_user = None
|
||||||
self.wallet_password = None
|
self.wallet_password = None
|
||||||
|
|
||||||
|
self.internet_connection_checker = LoopingCall(self._check_network_connection)
|
||||||
|
self.version_checker = LoopingCall(self._check_remote_versions)
|
||||||
|
self.connection_problem_checker = LoopingCall(self._check_connection_problems)
|
||||||
|
|
||||||
self.sd_identifier = StreamDescriptorIdentifier()
|
self.sd_identifier = StreamDescriptorIdentifier()
|
||||||
self.stream_info_manager = TempLBRYFileMetadataManager()
|
self.stream_info_manager = TempLBRYFileMetadataManager()
|
||||||
self.settings = LBRYSettings(self.db_dir)
|
self.settings = LBRYSettings(self.db_dir)
|
||||||
|
@ -267,32 +292,9 @@ class LBRYDaemon(jsonrpc.JSONRPC):
|
||||||
|
|
||||||
def setup(self):
|
def setup(self):
|
||||||
def _log_starting_vals():
|
def _log_starting_vals():
|
||||||
def _get_lbry_files_json():
|
r = json.dumps(self._get_lbry_files())
|
||||||
r = self._get_lbry_files()
|
|
||||||
return json.dumps(r)
|
|
||||||
|
|
||||||
def _get_lbryum_version():
|
log.info("LBRY Files: " + r)
|
||||||
r = urlopen("https://raw.githubusercontent.com/lbryio/lbryum/master/lib/version.py").read().split('\n')
|
|
||||||
version = next(line.split("=")[1].split("#")[0].replace(" ", "")
|
|
||||||
for line in r if "ELECTRUM_VERSION" in line)
|
|
||||||
version = version.replace("'", "")
|
|
||||||
log.info("remote lbryum " + str(version) + " > local lbryum " + str(lbryum_version) + " = " + str(
|
|
||||||
version > lbryum_version))
|
|
||||||
return version
|
|
||||||
|
|
||||||
def _get_lbrynet_version():
|
|
||||||
r = urlopen("https://raw.githubusercontent.com/lbryio/lbry/master/lbrynet/__init__.py").read().split('\n')
|
|
||||||
vs = next(i for i in r if 'version =' in i).split("=")[1].replace(" ", "")
|
|
||||||
vt = tuple(int(x) for x in vs[1:-1].split(','))
|
|
||||||
vr = ".".join([str(x) for x in vt])
|
|
||||||
log.info("remote lbrynet " + str(vr) + " > local lbrynet " + str(lbrynet_version) + " = " + str(
|
|
||||||
vr > lbrynet_version))
|
|
||||||
return vr
|
|
||||||
|
|
||||||
self.git_lbrynet_version = _get_lbrynet_version()
|
|
||||||
self.git_lbryum_version = _get_lbryum_version()
|
|
||||||
|
|
||||||
log.info("LBRY Files: " + _get_lbry_files_json())
|
|
||||||
log.info("Starting balance: " + str(self.session.wallet.wallet_balance))
|
log.info("Starting balance: " + str(self.session.wallet.wallet_balance))
|
||||||
|
|
||||||
return defer.succeed(None)
|
return defer.succeed(None)
|
||||||
|
@ -317,6 +319,10 @@ class LBRYDaemon(jsonrpc.JSONRPC):
|
||||||
|
|
||||||
log.info("[" + str(datetime.now()) + "] Starting lbrynet-daemon")
|
log.info("[" + str(datetime.now()) + "] Starting lbrynet-daemon")
|
||||||
|
|
||||||
|
self.internet_connection_checker.start(60)
|
||||||
|
self.version_checker.start(3600)
|
||||||
|
self.connection_problem_checker.start(1)
|
||||||
|
|
||||||
d = defer.Deferred()
|
d = defer.Deferred()
|
||||||
d.addCallback(lambda _: self._initial_setup())
|
d.addCallback(lambda _: self._initial_setup())
|
||||||
d.addCallback(self._set_daemon_settings)
|
d.addCallback(self._set_daemon_settings)
|
||||||
|
@ -379,8 +385,63 @@ class LBRYDaemon(jsonrpc.JSONRPC):
|
||||||
self.session_settings = settings
|
self.session_settings = settings
|
||||||
return defer.succeed(None)
|
return defer.succeed(None)
|
||||||
|
|
||||||
def _start_server(self):
|
def _check_network_connection(self):
|
||||||
|
try:
|
||||||
|
host = socket.gethostbyname(REMOTE_SERVER)
|
||||||
|
s = socket.create_connection((host, 80), 2)
|
||||||
|
self.connected_to_internet = True
|
||||||
|
except:
|
||||||
|
log.info("[" + str(datetime.now()) + "] Internet connection not working")
|
||||||
|
self.connected_to_internet = False
|
||||||
|
|
||||||
|
def _check_remote_versions(self):
|
||||||
|
def _get_lbryum_version():
|
||||||
|
try:
|
||||||
|
r = urlopen("https://raw.githubusercontent.com/lbryio/lbryum/master/lib/version.py").read().split('\n')
|
||||||
|
version = next(line.split("=")[1].split("#")[0].replace(" ", "")
|
||||||
|
for line in r if "ELECTRUM_VERSION" in line)
|
||||||
|
version = version.replace("'", "")
|
||||||
|
log.info("remote lbryum " + str(version) + " > local lbryum " + str(lbryum_version) + " = " + str(
|
||||||
|
version > lbryum_version))
|
||||||
|
self.git_lbryum_version = version
|
||||||
|
return defer.succeed(None)
|
||||||
|
except:
|
||||||
|
log.info("[" + str(datetime.now()) + "] Failed to get lbryum version from git")
|
||||||
|
self.git_lbryum_version = None
|
||||||
|
return defer.fail(None)
|
||||||
|
|
||||||
|
def _get_lbrynet_version():
|
||||||
|
try:
|
||||||
|
r = urlopen("https://raw.githubusercontent.com/lbryio/lbry/master/lbrynet/__init__.py").read().split('\n')
|
||||||
|
vs = next(i for i in r if 'version =' in i).split("=")[1].replace(" ", "")
|
||||||
|
vt = tuple(int(x) for x in vs[1:-1].split(','))
|
||||||
|
vr = ".".join([str(x) for x in vt])
|
||||||
|
log.info("remote lbrynet " + str(vr) + " > local lbrynet " + str(lbrynet_version) + " = " + str(
|
||||||
|
vr > lbrynet_version))
|
||||||
|
self.git_lbrynet_version = vr
|
||||||
|
return defer.succeed(None)
|
||||||
|
except:
|
||||||
|
log.info("[" + str(datetime.now()) + "] Failed to get lbrynet version from git")
|
||||||
|
self.git_lbrynet_version = None
|
||||||
|
return defer.fail(None)
|
||||||
|
|
||||||
|
d = _get_lbrynet_version()
|
||||||
|
d.addCallback(lambda _: _get_lbryum_version())
|
||||||
|
|
||||||
|
def _check_connection_problems(self):
|
||||||
|
if not self.git_lbrynet_version or not self.git_lbryum_version:
|
||||||
|
self.connection_problem = CONNECTION_PROBLEM_CODES[0]
|
||||||
|
|
||||||
|
elif self.startup_status[0] == 'loading_wallet':
|
||||||
|
if self.session.wallet.is_lagging:
|
||||||
|
self.connection_problem = CONNECTION_PROBLEM_CODES[2]
|
||||||
|
else:
|
||||||
|
self.connection_problem = None
|
||||||
|
|
||||||
|
if not self.connected_to_internet:
|
||||||
|
self.connection_problem = CONNECTION_PROBLEM_CODES[1]
|
||||||
|
|
||||||
|
def _start_server(self):
|
||||||
if self.peer_port is not None:
|
if self.peer_port is not None:
|
||||||
|
|
||||||
server_factory = ServerProtocolFactory(self.session.rate_limiter,
|
server_factory = ServerProtocolFactory(self.session.rate_limiter,
|
||||||
|
@ -402,7 +463,6 @@ class LBRYDaemon(jsonrpc.JSONRPC):
|
||||||
return defer.succeed(True)
|
return defer.succeed(True)
|
||||||
|
|
||||||
def _setup_server(self):
|
def _setup_server(self):
|
||||||
|
|
||||||
def restore_running_status(running):
|
def restore_running_status(running):
|
||||||
if running is True:
|
if running is True:
|
||||||
return self._start_server()
|
return self._start_server()
|
||||||
|
@ -439,7 +499,6 @@ class LBRYDaemon(jsonrpc.JSONRPC):
|
||||||
return dl
|
return dl
|
||||||
|
|
||||||
def _add_query_handlers(self, query_handlers):
|
def _add_query_handlers(self, query_handlers):
|
||||||
|
|
||||||
def _set_query_handlers(statuses):
|
def _set_query_handlers(statuses):
|
||||||
from future_builtins import zip
|
from future_builtins import zip
|
||||||
for handler, (success, status) in zip(query_handlers, statuses):
|
for handler, (success, status) in zip(query_handlers, statuses):
|
||||||
|
@ -482,6 +541,10 @@ class LBRYDaemon(jsonrpc.JSONRPC):
|
||||||
log.info("Closing lbrynet session")
|
log.info("Closing lbrynet session")
|
||||||
log.info("Status at time of shutdown: " + self.startup_status[0])
|
log.info("Status at time of shutdown: " + self.startup_status[0])
|
||||||
|
|
||||||
|
self.internet_connection_checker.stop()
|
||||||
|
self.version_checker.stop()
|
||||||
|
self.connection_problem_checker.stop()
|
||||||
|
|
||||||
d = self._upload_log(name_prefix="close", exclude_previous=False if self.first_run else True)
|
d = self._upload_log(name_prefix="close", exclude_previous=False if self.first_run else True)
|
||||||
d.addCallback(lambda _: self._stop_server())
|
d.addCallback(lambda _: self._stop_server())
|
||||||
d.addErrback(lambda err: log.info("Bad server shutdown: " + err.getTraceback()))
|
d.addErrback(lambda err: log.info("Bad server shutdown: " + err.getTraceback()))
|
||||||
|
@ -965,11 +1028,11 @@ class LBRYDaemon(jsonrpc.JSONRPC):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
r = {'code': self.startup_status[0], 'message': self.startup_status[1], 'progress': None, 'is_lagging': None}
|
r = {'code': self.startup_status[0], 'message': self.startup_status[1], 'progress': None, 'is_lagging': None}
|
||||||
if self.startup_status[0] == 'loading_wallet':
|
|
||||||
r['is_lagging'] = self.session.wallet.is_lagging
|
if self.connection_problem:
|
||||||
if r['is_lagging'] == True:
|
r['message'] = self.connection_problem[1]
|
||||||
r['message'] = "Synchronization with the blockchain is lagging... if this continues try restarting LBRY"
|
r['is_lagging'] = True
|
||||||
else:
|
elif self.startup_status[0] == LOADING_WALLET_CODE:
|
||||||
r['message'] = r['message'] % (str(self.session.wallet.blocks_behind_alert) + " blocks behind")
|
r['message'] = r['message'] % (str(self.session.wallet.blocks_behind_alert) + " blocks behind")
|
||||||
r['progress'] = self.session.wallet.catchup_progress
|
r['progress'] = self.session.wallet.catchup_progress
|
||||||
|
|
||||||
|
@ -1647,7 +1710,7 @@ class LBRYDaemon(jsonrpc.JSONRPC):
|
||||||
Upload log
|
Upload log
|
||||||
|
|
||||||
Args, optional:
|
Args, optional:
|
||||||
'name_prefix': prefix to denote what is requesting the log upload
|
'name_prefix': prefix to indicate what is requesting the log upload
|
||||||
'exclude_previous': true/false, whether or not to exclude previous sessions from upload, defaults on true
|
'exclude_previous': true/false, whether or not to exclude previous sessions from upload, defaults on true
|
||||||
Returns
|
Returns
|
||||||
True
|
True
|
||||||
|
|
Loading…
Reference in a new issue