lbry-sdk/lbrynet/daemon/DaemonServer.py

80 lines
2.6 KiB
Python
Raw Normal View History

import logging
import os
from twisted.web import server, guard, resource
2016-12-06 22:08:15 +01:00
from twisted.internet import defer, reactor, error
from twisted.cred import portal
2016-10-23 07:17:24 +02:00
from lbrynet import conf
from lbrynet.daemon.Daemon import Daemon
from lbrynet.daemon.auth.auth import PasswordChecker, HttpPasswordRealm
from lbrynet.daemon.auth.util import initialize_api_key_file
from lbrynet.daemon.DaemonRequest import DaemonRequest
log = logging.getLogger(__name__)
class IndexResource(resource.Resource):
def getChild(self, name, request):
request.setHeader('cache-control', 'no-cache, no-store, must-revalidate')
request.setHeader('expires', '0')
return self if name == '' else resource.Resource.getChild(self, name, request)
class DaemonServer(object):
def __init__(self, analytics_manager=None):
self._daemon = None
self.root = None
2017-03-22 16:16:13 +01:00
self.server_port = None
self.analytics_manager = analytics_manager
2016-12-06 22:08:15 +01:00
def _setup_server(self, use_auth):
self.root = IndexResource()
self._daemon = Daemon(self.analytics_manager)
self.root.putChild("", self._daemon)
# TODO: DEPRECATED, remove this and just serve the API at the root
self.root.putChild(conf.settings['API_ADDRESS'], self._daemon)
lbrynet_server = get_site_base(use_auth, self.root)
2016-12-06 22:08:15 +01:00
lbrynet_server.requestFactory = DaemonRequest
try:
2017-03-22 16:16:13 +01:00
self.server_port = reactor.listenTCP(
2017-01-17 04:23:20 +01:00
conf.settings['api_port'], lbrynet_server, interface=conf.settings['api_host'])
2016-12-06 22:08:15 +01:00
except error.CannotListenError:
log.info('Daemon already running, exiting app')
2017-03-22 16:16:13 +01:00
raise
2016-12-06 22:08:15 +01:00
return defer.succeed(True)
@defer.inlineCallbacks
def start(self, use_auth):
yield self._setup_server(use_auth)
yield self._daemon.setup()
2016-12-06 22:08:15 +01:00
2017-03-22 16:16:13 +01:00
@defer.inlineCallbacks
def stop(self):
2017-08-02 23:21:24 +02:00
if reactor.running:
log.info("Stopping the reactor")
reactor.fireSystemEvent("shutdown")
2016-12-06 22:08:15 +01:00
2016-12-06 22:08:15 +01:00
def get_site_base(use_auth, root):
if use_auth:
log.info("Using authenticated API")
root = create_auth_session(root)
2016-12-06 22:08:15 +01:00
else:
log.info("Using non-authenticated API")
return server.Site(root)
2016-12-06 22:08:15 +01:00
def create_auth_session(root):
2017-01-17 04:23:20 +01:00
pw_path = os.path.join(conf.settings['data_dir'], ".api_keys")
2016-12-06 22:08:15 +01:00
initialize_api_key_file(pw_path)
checker = PasswordChecker.load_file(pw_path)
realm = HttpPasswordRealm(root)
portal_to_realm = portal.Portal(realm, [checker, ])
factory = guard.BasicCredentialFactory('Login to lbrynet api')
_lbrynet_server = guard.HTTPAuthSessionWrapper(portal_to_realm, [factory, ])
return _lbrynet_server