mirror of
https://github.com/yzernik/squeaknode.git
synced 2026-08-18 13:09:08 +02:00
262 lines
6.8 KiB
Python
262 lines
6.8 KiB
Python
import argparse
|
|
import logging
|
|
import sys
|
|
import threading
|
|
from configparser import ConfigParser
|
|
from pathlib import Path
|
|
from os import environ
|
|
|
|
from squeak.params import SelectParams
|
|
|
|
from squeaknode.admin.squeak_admin_server_handler import SqueakAdminServerHandler
|
|
from squeaknode.admin.squeak_admin_server_servicer import SqueakAdminServerServicer
|
|
from squeaknode.admin.webapp.app import SqueakAdminWebServer
|
|
from squeaknode.blockchain.bitcoin_blockchain_client import BitcoinBlockchainClient
|
|
from squeaknode.common.lnd_lightning_client import LNDLightningClient
|
|
from squeaknode.db.db_engine import get_postgres_engine, get_sqlite_engine
|
|
from squeaknode.db.squeak_db import SqueakDb
|
|
from squeaknode.node.squeak_node import SqueakNode
|
|
from squeaknode.server.lightning_address import LightningAddressHostPort
|
|
from squeaknode.server.squeak_server_handler import SqueakServerHandler
|
|
from squeaknode.server.squeak_server_servicer import SqueakServerServicer
|
|
|
|
from squeaknode.config.config import Config
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def load_lightning_client(config) -> LNDLightningClient:
|
|
return LNDLightningClient(
|
|
config.lnd_host,
|
|
config.lnd_rpc_port,
|
|
config.lnd_tls_cert_path,
|
|
config.lnd_macaroon_path,
|
|
)
|
|
|
|
|
|
def load_lightning_host_port(config) -> LNDLightningClient:
|
|
return LightningAddressHostPort(
|
|
config.lnd_external_host,
|
|
config.lnd_port,
|
|
)
|
|
|
|
|
|
def load_rpc_server(config, handler) -> SqueakServerServicer:
|
|
return SqueakServerServicer(
|
|
config.server_rpc_host,
|
|
config.server_rpc_port,
|
|
handler,
|
|
)
|
|
|
|
|
|
def load_admin_rpc_server(config, handler) -> SqueakAdminServerServicer:
|
|
return SqueakAdminServerServicer(
|
|
config.admin_rpc_host,
|
|
config.admin_rpc_port,
|
|
handler,
|
|
)
|
|
|
|
|
|
def load_admin_web_server(config, handler) -> SqueakAdminWebServer:
|
|
return SqueakAdminWebServer(
|
|
config.webadmin_host,
|
|
config.webadmin_port,
|
|
config.webadmin_username,
|
|
config.webadmin_password,
|
|
config.webadmin_use_ssl,
|
|
config.webadmin_login_disabled,
|
|
config.webadmin_allow_cors,
|
|
handler,
|
|
)
|
|
|
|
|
|
def load_network(config):
|
|
return config.squeaknode_network
|
|
|
|
|
|
def load_price(config):
|
|
return config.squeaknode_price
|
|
|
|
|
|
def load_database(config):
|
|
return config.squeaknode_database
|
|
|
|
|
|
def load_max_squeaks_per_address_per_hour(config):
|
|
return config.squeaknode_max_squeaks_per_address_per_hour
|
|
|
|
|
|
def load_enable_sync(config):
|
|
return config.squeaknode_enable_sync
|
|
|
|
|
|
def load_handler(squeak_node):
|
|
return SqueakServerHandler(squeak_node)
|
|
|
|
|
|
def load_admin_handler(lightning_client, squeak_node):
|
|
return SqueakAdminServerHandler(
|
|
lightning_client,
|
|
squeak_node,
|
|
)
|
|
|
|
|
|
def load_sqk_dir_path(config):
|
|
sqk_dir = config.squeaknode_sqk_dir
|
|
return Path(sqk_dir)
|
|
|
|
|
|
def load_db(config, network):
|
|
database = load_database(config)
|
|
if database == "postgresql":
|
|
engine = get_postgres_engine(
|
|
config.postgresql_user,
|
|
config.postgresql_password,
|
|
config.postgresql_host,
|
|
config.postgresql_database,
|
|
)
|
|
return SqueakDb(engine, schema=network)
|
|
elif database == "sqlite":
|
|
sqk_dir = load_sqk_dir_path(config)
|
|
data_dir = sqk_dir.joinpath("data").joinpath(network)
|
|
data_dir.mkdir(parents=True, exist_ok=True)
|
|
engine = get_sqlite_engine(data_dir)
|
|
return SqueakDb(engine)
|
|
|
|
|
|
def load_blockchain_client(config):
|
|
return BitcoinBlockchainClient(
|
|
config.bitcoin_rpc_host,
|
|
config.bitcoin_rpc_port,
|
|
config.bitcoin_rpc_user,
|
|
config.bitcoin_rpc_pass,
|
|
)
|
|
|
|
|
|
def sigterm_handler(_signo, _stack_frame):
|
|
# Raises SystemExit(0):
|
|
sys.exit(0)
|
|
|
|
|
|
def start_admin_rpc_server(rpc_server):
|
|
logger.info("Starting admin RPC server...")
|
|
thread = threading.Thread(
|
|
target=rpc_server.serve,
|
|
args=(),
|
|
)
|
|
thread.daemon = True
|
|
thread.start()
|
|
|
|
|
|
def load_admin_web_server_enabled(config):
|
|
return config.webadmin_enabled
|
|
|
|
|
|
def start_admin_web_server(admin_web_server):
|
|
logger.info("Starting admin web server...")
|
|
thread = threading.Thread(
|
|
target=admin_web_server.serve,
|
|
args=(),
|
|
)
|
|
thread.daemon = True
|
|
thread.start()
|
|
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(
|
|
description="squeaknode runs a node using squeak protocol. ",
|
|
)
|
|
parser.add_argument(
|
|
"--config",
|
|
dest="config",
|
|
type=str,
|
|
help="Path to the config file.",
|
|
)
|
|
parser.add_argument(
|
|
"--log-level",
|
|
dest="log_level",
|
|
type=str,
|
|
default="info",
|
|
help="Logging level",
|
|
)
|
|
subparsers = parser.add_subparsers(help="sub-command help")
|
|
|
|
# create the parser for the "run-server" command
|
|
parser_run_server = subparsers.add_parser("run-server", help="run-server help")
|
|
parser_run_server.set_defaults(func=run_server)
|
|
|
|
return parser.parse_args()
|
|
|
|
|
|
def main():
|
|
logging.basicConfig(level=logging.ERROR)
|
|
args = parse_args()
|
|
|
|
# Set the log level
|
|
level = args.log_level.upper()
|
|
logging.getLogger().setLevel(level)
|
|
|
|
logger.info("Starting squeaknode...")
|
|
config = Config(args.config)
|
|
logger.info("config: {}".format(config))
|
|
|
|
args.func(config)
|
|
|
|
|
|
def run_server(config):
|
|
# load the network
|
|
network = load_network(config)
|
|
SelectParams(network)
|
|
|
|
# load postgres db
|
|
squeak_db = load_db(config, network)
|
|
squeak_db.init()
|
|
|
|
# load the price
|
|
price = load_price(config)
|
|
|
|
# load the max squeaks per block per address
|
|
max_squeaks_per_address_per_hour = load_max_squeaks_per_address_per_hour(config)
|
|
|
|
# load the lightning client
|
|
lightning_client = load_lightning_client(config)
|
|
lightning_host_port = load_lightning_host_port(config)
|
|
|
|
# load the blockchain client
|
|
blockchain_client = load_blockchain_client(config)
|
|
|
|
# load enable sync config
|
|
enable_sync = load_enable_sync(config)
|
|
|
|
# Create and start the squeak node
|
|
squeak_node = SqueakNode(
|
|
squeak_db,
|
|
blockchain_client,
|
|
lightning_client,
|
|
lightning_host_port,
|
|
price,
|
|
max_squeaks_per_address_per_hour,
|
|
enable_sync,
|
|
)
|
|
squeak_node.start_running()
|
|
|
|
# start admin rpc server
|
|
admin_handler = load_admin_handler(lightning_client, squeak_node)
|
|
admin_rpc_server = load_admin_rpc_server(config, admin_handler)
|
|
start_admin_rpc_server(admin_rpc_server)
|
|
|
|
# start admin web server
|
|
admin_web_server_enabled = load_admin_web_server_enabled(config)
|
|
if admin_web_server_enabled:
|
|
admin_web_server = load_admin_web_server(config, admin_handler)
|
|
start_admin_web_server(admin_web_server)
|
|
|
|
# start rpc server
|
|
handler = load_handler(squeak_node)
|
|
server = load_rpc_server(config, handler)
|
|
server.serve()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|