def main(): opts = parse_args() try: config = RawConfigParser() config.read(opts.config_file) config.options("master-public-keys") except NoSectionError: print("ERROR: Non-existant configuration file {}".format( opts.config_file)) return logger = logging.getLogger('ELECTRUMPERSONALSERVER') logger, logfilename = logger_config(logger, config) logger.info('Starting Electrum Personal Server') logger.info('Logging to ' + logfilename) try: rpc_u = config.get("bitcoin-rpc", "rpc_user") rpc_p = config.get("bitcoin-rpc", "rpc_password") logger.debug("obtaining auth from rpc_user/pass") except NoOptionError: rpc_u, rpc_p = obtain_rpc_username_password(config.get( "bitcoin-rpc", "datadir")) logger.debug("obtaining auth from .cookie") if rpc_u == None: return rpc = JsonRpc(host = config.get("bitcoin-rpc", "host"), port = int(config.get("bitcoin-rpc", "port")), user = rpc_u, password = rpc_p, wallet_filename=config.get("bitcoin-rpc", "wallet_filename").strip(), logger=logger) #TODO somewhere here loop until rpc works and fully sync'd, to allow # people to run this script without waiting for their node to fully # catch up sync'd when getblockchaininfo blocks == headers, or use # verificationprogress printed_error_msg = False while bestblockhash[0] == None: try: bestblockhash[0] = rpc.call("getbestblockhash", []) except JsonRpcError as e: if not printed_error_msg: logger.error("Error with bitcoin json-rpc: " + repr(e)) printed_error_msg = True time.sleep(5) try: rpc.call("listunspent", []) except JsonRpcError as e: logger.error(repr(e)) logger.error("Wallet related RPC call failed, possibly the " + "bitcoin node was compiled with the disable wallet flag") return if opts.rescan: rescan_script(logger, rpc, opts.rescan_date) return while True: logger.debug("Checking whether rescan is in progress") walletinfo = rpc.call("getwalletinfo", []) if "scanning" in walletinfo and walletinfo["scanning"]: logger.debug("Waiting for Core wallet rescan to finish") time.sleep(300) continue break import_needed, relevant_spks_addrs, deterministic_wallets = \ get_scriptpubkeys_to_monitor(rpc, config) if import_needed: if len(relevant_spks_addrs) == 0: #import = true and no addresses means exit return transactionmonitor.import_addresses(rpc, relevant_spks_addrs) logger.info("Done.\nIf recovering a wallet which already has existing" + " transactions, then\nrun the rescan script. If you're confident" + " that the wallets are new\nand empty then there's no need to" + " rescan, just restart this script") else: txmonitor = transactionmonitor.TransactionMonitor(rpc, deterministic_wallets, logger) if not txmonitor.build_address_history(relevant_spks_addrs): return try: run_electrum_server(rpc, txmonitor, config) except KeyboardInterrupt: logger.info('Received KeyboardInterrupt, quitting')
def main(): opts = parse_args() logger = logging.getLogger('ELECTRUMPERSONALSERVER') logger = logger_config(logger, fmt=opts.logfmt, filename=opts.log, logfilemode='a' if opts.appendlog else 'w') logger.setLevel(opts.loglevel) logger.info('Starting Electrum Personal Server') logger.info('Logging to ' + opts.log) try: config = ConfigParser() config.read(opts.config_file) config.options("master-public-keys") except NoSectionError: logger.error("Non-existant configuration file {}".format( opts.config_file)) return try: rpc_u = config.get("bitcoin-rpc", "rpc_user") rpc_p = config.get("bitcoin-rpc", "rpc_password") logger.debug("obtaining auth from rpc_user/pass") except NoOptionError: rpc_u, rpc_p = obtain_rpc_username_password(config.get( "bitcoin-rpc", "datadir")) logger.debug("obtaining auth from .cookie") if rpc_u == None: return rpc = JsonRpc(host = config.get("bitcoin-rpc", "host"), port = int(config.get("bitcoin-rpc", "port")), user = rpc_u, password = rpc_p, wallet_filename=config.get("bitcoin-rpc", "wallet_filename").strip()) #TODO somewhere here loop until rpc works and fully sync'd, to allow # people to run this script without waiting for their node to fully # catch up sync'd when getblockchaininfo blocks == headers, or use # verificationprogress printed_error_msg = False while bestblockhash[0] == None: try: bestblockhash[0] = rpc.call("getbestblockhash", []) except JsonRpcError as e: if not printed_error_msg: logger.error("Error with bitcoin json-rpc: " + repr(e)) printed_error_msg = True time.sleep(5) try: rpc.call("listunspent", []) except JsonRpcError: logger.error("Wallet related RPC calls not found, looks like the " + "bitcoin node was compiled with the disable wallet flag") return import_needed, relevant_spks_addrs, deterministic_wallets = \ get_scriptpubkeys_to_monitor(rpc, config) if import_needed: transactionmonitor.import_addresses(rpc, relevant_spks_addrs) logger.info("Done.\nIf recovering a wallet which already has existing" + " transactions, then\nrun the rescan script. If you're confident" + " that the wallets are new\nand empty then there's no need to" + " rescan, just restart this script") else: txmonitor = transactionmonitor.TransactionMonitor(rpc, deterministic_wallets) if not txmonitor.build_address_history(relevant_spks_addrs): return hostport = (config.get("electrum-server", "host"), int(config.get("electrum-server", "port"))) ip_whitelist = [] for ip in config.get("electrum-server", "ip_whitelist").split(" "): if ip == "*": #matches everything ip_whitelist.append(ip_network("0.0.0.0/0")) ip_whitelist.append(ip_network("::0/0")) else: ip_whitelist.append(ip_network(ip, strict=False)) poll_interval_listening = int(config.get("bitcoin-rpc", "poll_interval_listening")) poll_interval_connected = int(config.get("bitcoin-rpc", "poll_interval_connected")) certfile, keyfile = get_certs(config) try: run_electrum_server(rpc, txmonitor, hostport, ip_whitelist, poll_interval_listening, poll_interval_connected, certfile, keyfile) except KeyboardInterrupt: logger.info('Received KeyboardInterrupt, quitting')