mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-08-23 17:47:31 +00:00
add option to leave daemon running after GUI is closed
This commit is contained in:
parent
67d3d6b5b5
commit
3ec0ceba3e
4 changed files with 33 additions and 25 deletions
|
@ -853,6 +853,7 @@ def get_parser():
|
||||||
parser_gui.add_argument("-o", "--offline", action="store_true", dest="offline", default=False, help="Run offline")
|
parser_gui.add_argument("-o", "--offline", action="store_true", dest="offline", default=False, help="Run offline")
|
||||||
parser_gui.add_argument("-m", action="store_true", dest="hide_gui", default=False, help="hide GUI on startup")
|
parser_gui.add_argument("-m", action="store_true", dest="hide_gui", default=False, help="hide GUI on startup")
|
||||||
parser_gui.add_argument("-L", "--lang", dest="language", default=None, help="default language used in GUI")
|
parser_gui.add_argument("-L", "--lang", dest="language", default=None, help="default language used in GUI")
|
||||||
|
parser_gui.add_argument("--daemon", action="store_true", dest="daemon", default=False, help="keep daemon running after GUI is closed")
|
||||||
add_network_options(parser_gui)
|
add_network_options(parser_gui)
|
||||||
add_global_options(parser_gui)
|
add_global_options(parser_gui)
|
||||||
# daemon
|
# daemon
|
||||||
|
|
|
@ -120,7 +120,7 @@ def get_rpc_credentials(config):
|
||||||
|
|
||||||
class Daemon(DaemonThread):
|
class Daemon(DaemonThread):
|
||||||
|
|
||||||
def __init__(self, config, fd, is_gui):
|
def __init__(self, config, fd):
|
||||||
DaemonThread.__init__(self)
|
DaemonThread.__init__(self)
|
||||||
self.config = config
|
self.config = config
|
||||||
if config.get('offline'):
|
if config.get('offline'):
|
||||||
|
@ -133,12 +133,11 @@ class Daemon(DaemonThread):
|
||||||
self.gui = None
|
self.gui = None
|
||||||
self.wallets = {}
|
self.wallets = {}
|
||||||
# Setup JSONRPC server
|
# Setup JSONRPC server
|
||||||
self.init_server(config, fd, is_gui)
|
self.init_server(config, fd)
|
||||||
|
|
||||||
def init_server(self, config, fd, is_gui):
|
def init_server(self, config, fd):
|
||||||
host = config.get('rpchost', '127.0.0.1')
|
host = config.get('rpchost', '127.0.0.1')
|
||||||
port = config.get('rpcport', 0)
|
port = config.get('rpcport', 0)
|
||||||
|
|
||||||
rpc_user, rpc_password = get_rpc_credentials(config)
|
rpc_user, rpc_password = get_rpc_credentials(config)
|
||||||
try:
|
try:
|
||||||
server = VerifyingJSONRPCServer((host, port), logRequests=False,
|
server = VerifyingJSONRPCServer((host, port), logRequests=False,
|
||||||
|
@ -153,14 +152,12 @@ class Daemon(DaemonThread):
|
||||||
self.server = server
|
self.server = server
|
||||||
server.timeout = 0.1
|
server.timeout = 0.1
|
||||||
server.register_function(self.ping, 'ping')
|
server.register_function(self.ping, 'ping')
|
||||||
if is_gui:
|
server.register_function(self.run_gui, 'gui')
|
||||||
server.register_function(self.run_gui, 'gui')
|
server.register_function(self.run_daemon, 'daemon')
|
||||||
else:
|
self.cmd_runner = Commands(self.config, None, self.network)
|
||||||
server.register_function(self.run_daemon, 'daemon')
|
for cmdname in known_commands:
|
||||||
self.cmd_runner = Commands(self.config, None, self.network)
|
server.register_function(getattr(self.cmd_runner, cmdname), cmdname)
|
||||||
for cmdname in known_commands:
|
server.register_function(self.run_cmdline, 'run_cmdline')
|
||||||
server.register_function(getattr(self.cmd_runner, cmdname), cmdname)
|
|
||||||
server.register_function(self.run_cmdline, 'run_cmdline')
|
|
||||||
|
|
||||||
def ping(self):
|
def ping(self):
|
||||||
return True
|
return True
|
||||||
|
@ -215,13 +212,12 @@ class Daemon(DaemonThread):
|
||||||
def run_gui(self, config_options):
|
def run_gui(self, config_options):
|
||||||
config = SimpleConfig(config_options)
|
config = SimpleConfig(config_options)
|
||||||
if self.gui:
|
if self.gui:
|
||||||
#if hasattr(self.gui, 'new_window'):
|
if hasattr(self.gui, 'new_window'):
|
||||||
# path = config.get_wallet_path()
|
path = config.get_wallet_path()
|
||||||
# self.gui.new_window(path, config.get('url'))
|
self.gui.new_window(path, config.get('url'))
|
||||||
# response = "ok"
|
response = "ok"
|
||||||
#else:
|
else:
|
||||||
# response = "error: current GUI does not support multiple windows"
|
response = "error: current GUI does not support multiple windows"
|
||||||
response = "error: Electrum GUI already running"
|
|
||||||
else:
|
else:
|
||||||
response = "Error: Electrum is running in daemon mode. Please stop the daemon first."
|
response = "Error: Electrum is running in daemon mode. Please stop the daemon first."
|
||||||
return response
|
return response
|
||||||
|
@ -299,6 +295,8 @@ class Daemon(DaemonThread):
|
||||||
self.on_stop()
|
self.on_stop()
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
|
if self.gui:
|
||||||
|
self.gui.stop()
|
||||||
self.print_error("stopping, removing lockfile")
|
self.print_error("stopping, removing lockfile")
|
||||||
remove_lockfile(get_lockfile(self.config))
|
remove_lockfile(get_lockfile(self.config))
|
||||||
DaemonThread.stop(self)
|
DaemonThread.stop(self)
|
||||||
|
|
|
@ -45,7 +45,7 @@ from electrum.base_wizard import GoBack
|
||||||
# from electrum.synchronizer import Synchronizer
|
# from electrum.synchronizer import Synchronizer
|
||||||
# from electrum.verifier import SPV
|
# from electrum.verifier import SPV
|
||||||
# from electrum.util import DebugMem
|
# from electrum.util import DebugMem
|
||||||
from electrum.util import (UserCancelled, print_error,
|
from electrum.util import (UserCancelled, PrintError,
|
||||||
WalletFileException, BitcoinException)
|
WalletFileException, BitcoinException)
|
||||||
# from electrum.wallet import Abstract_Wallet
|
# from electrum.wallet import Abstract_Wallet
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ class QNetworkUpdatedSignalObject(QObject):
|
||||||
network_updated_signal = pyqtSignal(str, object)
|
network_updated_signal = pyqtSignal(str, object)
|
||||||
|
|
||||||
|
|
||||||
class ElectrumGui:
|
class ElectrumGui(PrintError):
|
||||||
|
|
||||||
def __init__(self, config, daemon, plugins):
|
def __init__(self, config, daemon, plugins):
|
||||||
set_language(config.get('language'))
|
set_language(config.get('language'))
|
||||||
|
@ -128,7 +128,7 @@ class ElectrumGui:
|
||||||
self.app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
|
self.app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
|
||||||
except BaseException as e:
|
except BaseException as e:
|
||||||
use_dark_theme = False
|
use_dark_theme = False
|
||||||
print_error('Error setting dark theme: {}'.format(e))
|
self.print_error('Error setting dark theme: {}'.format(e))
|
||||||
# Even if we ourselves don't set the dark theme,
|
# Even if we ourselves don't set the dark theme,
|
||||||
# the OS/window manager/etc might set *a dark theme*.
|
# the OS/window manager/etc might set *a dark theme*.
|
||||||
# Hence, try to choose colors accordingly:
|
# Hence, try to choose colors accordingly:
|
||||||
|
@ -222,7 +222,7 @@ class ElectrumGui:
|
||||||
except UserCancelled:
|
except UserCancelled:
|
||||||
pass
|
pass
|
||||||
except GoBack as e:
|
except GoBack as e:
|
||||||
print_error('[start_new_window] Exception caught (GoBack)', e)
|
self.print_error('[start_new_window] Exception caught (GoBack)', e)
|
||||||
except (WalletFileException, BitcoinException) as e:
|
except (WalletFileException, BitcoinException) as e:
|
||||||
traceback.print_exc(file=sys.stderr)
|
traceback.print_exc(file=sys.stderr)
|
||||||
d = QMessageBox(QMessageBox.Warning, _('Error'),
|
d = QMessageBox(QMessageBox.Warning, _('Error'),
|
||||||
|
@ -267,6 +267,7 @@ class ElectrumGui:
|
||||||
if not self.windows:
|
if not self.windows:
|
||||||
self.config.save_last_wallet(window.wallet)
|
self.config.save_last_wallet(window.wallet)
|
||||||
run_hook('on_close_window', window)
|
run_hook('on_close_window', window)
|
||||||
|
self.daemon.stop_wallet(window.wallet.storage.path)
|
||||||
|
|
||||||
def init_network(self):
|
def init_network(self):
|
||||||
# Show network dialog if config does not exist
|
# Show network dialog if config does not exist
|
||||||
|
@ -309,6 +310,14 @@ class ElectrumGui:
|
||||||
self.tray.hide()
|
self.tray.hide()
|
||||||
self.app.aboutToQuit.connect(clean_up)
|
self.app.aboutToQuit.connect(clean_up)
|
||||||
|
|
||||||
|
# keep daemon running after close
|
||||||
|
if self.config.get('daemon'):
|
||||||
|
self.app.setQuitOnLastWindowClosed(False)
|
||||||
|
|
||||||
# main loop
|
# main loop
|
||||||
self.app.exec_()
|
self.app.exec_()
|
||||||
# on some platforms the exec_ call may not return, so use clean_up()
|
# on some platforms the exec_ call may not return, so use clean_up()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self.print_error('closing GUI')
|
||||||
|
self.app.quit()
|
||||||
|
|
|
@ -415,7 +415,7 @@ if __name__ == '__main__':
|
||||||
fd, server = daemon.get_fd_or_server(config)
|
fd, server = daemon.get_fd_or_server(config)
|
||||||
if fd is not None:
|
if fd is not None:
|
||||||
plugins = init_plugins(config, config.get('gui', 'qt'))
|
plugins = init_plugins(config, config.get('gui', 'qt'))
|
||||||
d = daemon.Daemon(config, fd, True)
|
d = daemon.Daemon(config, fd)
|
||||||
d.start()
|
d.start()
|
||||||
d.init_gui(config, plugins)
|
d.init_gui(config, plugins)
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
@ -436,7 +436,7 @@ if __name__ == '__main__':
|
||||||
print_stderr("starting daemon (PID %d)" % pid)
|
print_stderr("starting daemon (PID %d)" % pid)
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
init_plugins(config, 'cmdline')
|
init_plugins(config, 'cmdline')
|
||||||
d = daemon.Daemon(config, fd, False)
|
d = daemon.Daemon(config, fd)
|
||||||
d.start()
|
d.start()
|
||||||
if config.get('websocket_server'):
|
if config.get('websocket_server'):
|
||||||
from electrum import websockets
|
from electrum import websockets
|
||||||
|
|
Loading…
Add table
Reference in a new issue