tmove static methods away from daemon class; restore initial logic - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 690c8629239b8eb615f52613cc850ec8ab02d4e9 DIR parent 3b00f62d4681c43fafa6f1903bb6d5cce6f8efa8 HTML Author: ThomasV <thomasv@electrum.org> Date: Mon, 1 Feb 2016 10:20:22 +0100 move static methods away from daemon class; restore initial logic Diffstat: M electrum | 63 ++++++++++++++++--------------- M lib/daemon.py | 92 +++++++++++++++---------------- 2 files changed, 77 insertions(+), 78 deletions(-) --- DIR diff --git a/electrum b/electrum t@@ -74,7 +74,7 @@ from electrum.util import print_msg, print_stderr, json_encode, json_decode from electrum.util import set_verbosity, InvalidPassword from electrum.plugins import Plugins from electrum.commands import get_parser, known_commands, Commands, config_variables -from electrum.daemon import Daemon +from electrum import daemon # get password routine t@@ -313,48 +313,49 @@ if __name__ == '__main__': sys.exit(0) if cmdname == 'gui': - lockfile = Daemon.lockfile(config) - fd = Daemon.get_fd_or_server(lockfile) + fd = daemon.get_fd_or_server(config) if isinstance(fd, int): - daemon = Daemon(config, fd) - daemon.start() - daemon.init_gui(config, plugins) + d = daemon.Daemon(config, fd) + d.start() + d.init_gui(config, plugins) sys.exit(0) else: server = fd result = server.gui(config_options) elif cmdname == 'daemon': - lockfile = Daemon.lockfile(config) - fd = Daemon.get_fd_or_server(lockfile) - if isinstance(fd, int): - subcommand = config.get('subcommand') - assert subcommand in ['start', 'stop', 'status'] - if subcommand != 'start': - print_msg("Daemon not running") - os.close(fd) - Daemon.remove_lockfile(lockfile) - sys.exit(1) - pid = os.fork() - if pid: - print_stderr("starting daemon (PID %d)" % pid) + subcommand = config.get('subcommand') + assert subcommand in ['start', 'stop', 'status'] + if subcommand == 'start': + fd = daemon.get_fd_or_server(config) + if isinstance(fd, int): + pid = os.fork() + if pid: + print_stderr("starting daemon (PID %d)" % pid) + sys.exit(0) + d = daemon.Daemon(config, fd) + d.start() + if config.get('websocket_server'): + from electrum import websockets + websockets.WebSocketServer(config, d.network).start() + if config.get('requests_dir'): + util.check_www_dir(config.get('requests_dir')) + d.join() sys.exit(0) - daemon = Daemon(config, fd) - daemon.start() - if config.get('websocket_server'): - from electrum import websockets - websockets.WebSocketServer(config, daemon.network).start() - if config.get('requests_dir'): - util.check_www_dir(config.get('requests_dir')) - daemon.join() - sys.exit(0) + else: + server = fd + result = server.daemon(config_options) else: - server = fd - result = server.daemon(config_options) + server = daemon.get_server(config) + if server is not None: + result = server.daemon(config_options) + else: + print_msg("Daemon not running") + sys.exit(1) else: # command line init_cmdline(config_options) - server = Daemon.get_server(Daemon.lockfile(config)) + server = daemon.get_server(config) if server is not None: result = server.run_cmdline(config_options) else: DIR diff --git a/lib/daemon.py b/lib/daemon.py t@@ -33,6 +33,50 @@ from commands import known_commands, Commands from simple_config import SimpleConfig +def get_lockfile(config): + return os.path.join(config.path, 'daemon') + +def remove_lockfile(lockfile): + os.unlink(lockfile) + +def get_fd_or_server(config): + '''Tries to create the lockfile, using O_EXCL to + prevent races. If it succeeds it returns the FD. + Otherwise try and connect to the server specified in the lockfile. + If this succeeds, the server is returned. Otherwise remove the + lockfile and try again.''' + lockfile = get_lockfile(config) + while True: + try: + return os.open(lockfile, os.O_CREAT | os.O_EXCL | os.O_WRONLY) + except OSError: + pass + server = get_server(config) + if server is not None: + return server + # Couldn't connect; remove lockfile and try again. + remove_lockfile(lockfile) + +def get_server(config): + lockfile = get_lockfile(config) + while True: + create_time = None + try: + with open(lockfile) as f: + (host, port), create_time = ast.literal_eval(f.read()) + server = jsonrpclib.Server('http://%s:%d' % (host, port)) + # Test daemon is running + server.ping() + return server + except: + pass + if not create_time or create_time < time.time() - 1.0: + return None + # Sleep a bit and try again; it might have just been started + time.sleep(1.0) + + + class RequestHandler(SimpleJSONRPCRequestHandler): def do_OPTIONS(self): t@@ -172,7 +216,7 @@ class Daemon(DaemonThread): def stop(self): self.print_error("stopping, removing lockfile") - Daemon.remove_lockfile(Daemon.lockfile(self.config)) + remove_lockfile(get_lockfile(self.config)) DaemonThread.stop(self) def init_gui(self, config, plugins): t@@ -182,49 +226,3 @@ class Daemon(DaemonThread): gui = __import__('electrum_gui.' + gui_name, fromlist=['electrum_gui']) self.gui = gui.ElectrumGui(config, self, plugins) self.gui.main() - - @staticmethod - def lockfile(config): - return os.path.join(config.path, 'daemon') - - @staticmethod - def remove_lockfile(lockfile): - os.unlink(lockfile) - - @staticmethod - def get_fd_or_server(lockfile): - '''If create is True, tries to create the lockfile, using O_EXCL to - prevent races. If it succeeds it returns the FD. - - Otherwise try and connect to the server specified in the lockfile. - If this succeeds, the server is returned. Otherwise remove the - lockfile and try again.''' - while True: - try: - return os.open(lockfile, os.O_CREAT | os.O_EXCL | os.O_WRONLY) - except OSError: - pass - server = Daemon.get_server(lockfile) - if server is not None: - return server - # Couldn't connect; remove lockfile and try again. - Daemon.remove_lockfile(lockfile) - - @staticmethod - def get_server(lockfile): - while True: - create_time = None - try: - with open(lockfile) as f: - (host, port), create_time = ast.literal_eval(f.read()) - server = jsonrpclib.Server('http://%s:%d' % (host, port)) - # Test daemon is running - server.ping() - return server - except: - pass - if not create_time or create_time < time.time() - 1.0: - return None - # Sleep a bit and try again; it might have just been started - time.sleep(1.0) -