Browse Source

use aiohttp + jsonrpcserver in watchtower

master
ThomasV 6 years ago
parent
commit
b2f61bdc06
  1. 56
      electrum/daemon.py

56
electrum/daemon.py

@ -31,9 +31,13 @@ import sys
import threading import threading
from typing import Dict, Optional, Tuple from typing import Dict, Optional, Tuple
from aiohttp import web
from jsonrpcserver import async_dispatch as dispatch
from jsonrpcserver.methods import Methods
import jsonrpclib import jsonrpclib
from .jsonrpc import SimpleJSONRPCServer, PasswordProtectedJSONRPCServer from .jsonrpc import PasswordProtectedJSONRPCServer
from .version import ELECTRUM_VERSION from .version import ELECTRUM_VERSION
from .network import Network from .network import Network
from .util import (json_decode, DaemonThread, to_string, from .util import (json_decode, DaemonThread, to_string,
@ -44,7 +48,7 @@ from .commands import known_commands, Commands
from .simple_config import SimpleConfig from .simple_config import SimpleConfig
from .exchange_rate import FxThread from .exchange_rate import FxThread
from .plugin import run_hook from .plugin import run_hook
from .logging import get_logger from .logging import get_logger, Logger
_logger = get_logger(__name__) _logger = get_logger(__name__)
@ -122,25 +126,42 @@ def get_rpc_credentials(config: SimpleConfig) -> Tuple[str, str]:
return rpc_user, rpc_password return rpc_user, rpc_password
class WatchTowerServer(DaemonThread): class WatchTowerServer(Logger):
def __init__(self, network): def __init__(self, network):
DaemonThread.__init__(self) Logger.__init__(self)
self.config = network.config self.config = network.config
self.network = network
self.lnwatcher = network.local_watchtower self.lnwatcher = network.local_watchtower
self.start() self.app = web.Application()
self.app.router.add_post("/", self.handle)
self.methods = Methods()
self.methods.add(self.get_ctn)
self.methods.add(self.add_sweep_tx)
async def handle(self, request):
request = await request.text()
self.logger.info(f'{request}')
response = await dispatch(request, methods=self.methods)
if response.wanted:
return web.json_response(response.deserialized(), status=response.http_status)
else:
return web.Response()
def run(self): async def run(self):
host = self.config.get('watchtower_host') host = self.config.get('watchtower_host')
port = self.config.get('watchtower_port', 12345) port = self.config.get('watchtower_port', 12345)
server = SimpleJSONRPCServer((host, port), logRequests=True) self.runner = web.AppRunner(self.app)
server.register_function(self.lnwatcher.add_sweep_tx, 'add_sweep_tx') await self.runner.setup()
server.register_function(self.lnwatcher.add_channel, 'add_channel') site = web.TCPSite(self.runner, host, port)
server.register_function(self.lnwatcher.get_ctn, 'get_ctn') await site.start()
server.register_function(self.lnwatcher.get_num_tx, 'get_num_tx')
server.timeout = 0.1 async def get_ctn(self, *args):
while self.is_running(): return await self.lnwatcher.sweepstore.get_ctn(*args)
server.handle_request()
async def add_sweep_tx(self, *args):
return await self.lnwatcher.sweepstore.add_sweep_tx(*args)
class Daemon(DaemonThread): class Daemon(DaemonThread):
@ -167,10 +188,11 @@ class Daemon(DaemonThread):
self.init_server(config, fd) self.init_server(config, fd)
# server-side watchtower # server-side watchtower
self.watchtower = WatchTowerServer(self.network) if self.config.get('watchtower_host') else None self.watchtower = WatchTowerServer(self.network) if self.config.get('watchtower_host') else None
jobs = [self.fx.run]
if self.watchtower:
jobs.append(self.watchtower.run)
if self.network: if self.network:
self.network.start([ self.network.start(jobs)
self.fx.run,
])
self.start() self.start()
def init_server(self, config: SimpleConfig, fd): def init_server(self, config: SimpleConfig, fd):

Loading…
Cancel
Save