electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 39af17bc236602bced51d5feab6564ef26bd26e6
parent d97106f17d874bd8b441ef1c1c9ba80d2f241532
Author: ThomasV <thomasv@electrum.org>
Date:   Sat, 28 Nov 2015 15:37:51 +0100

load wallets in daemon

Diffstat:
Melectrum | 43+++++++++++++++++++++++++++++--------------
1 file changed, 29 insertions(+), 14 deletions(-)

diff --git a/electrum b/electrum @@ -233,16 +233,8 @@ def init_cmdline(config): return cmd, password -def run_command(config, network, password): - cmdname = config.get('cmd') - cmd = known_commands[cmdname] - # instanciate wallet for command-line - storage = WalletStorage(config.get_wallet_path()) - # create wallet instance - wallet = Wallet(storage) if cmd.requires_wallet else None - # start threads +def run_command(config, cmd, network, wallet, password): if wallet and network: - wallet.start_threads(network) wallet.wait_until_synchronized() # arguments passed to function args = map(lambda x: config.get(x), cmd.params) @@ -254,9 +246,6 @@ def run_command(config, network, password): cmd_runner.password = password func = getattr(cmd_runner, cmd.name) result = func(*args) - # stop threads - if wallet: - wallet.stop_threads() return result @@ -298,13 +287,16 @@ class ClientThread(util.DaemonThread): 'nodes': self.network.get_interfaces(), 'connected': self.network.is_connected(), 'auto_connect': p[4], + 'wallets': self.server.wallets.keys(), } elif sub == 'stop': self.server.stop() response = "Daemon stopped" else: + c = known_commands[cmd] + wallet = self.server.load_wallet(config) if c.requires_wallet else None try: - response = run_command(config, self.network, password) + response = run_command(config, c, self.network, wallet, password) except BaseException as e: err = traceback.format_exc() response = {'error':err} @@ -325,6 +317,18 @@ class NetworkServer(util.DaemonThread): self.lock = threading.RLock() # gui is None is we run as daemon self.gui = None + self.wallets = {} + + def load_wallet(self, config): + path = config.get_wallet_path() + if path in self.wallets: + wallet = self.wallets[path] + else: + storage = WalletStorage(path) + wallet = Wallet(storage) + wallet.start_threads(self.network) + self.wallets[path] = wallet + return wallet def run(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -343,6 +347,11 @@ class NetworkServer(util.DaemonThread): client.start() print_error("Daemon exiting") + def stop(self): + for k, wallet in self.wallets.items(): + wallet.stop_threads() + util.DaemonThread.stop(self) + def get_daemon(config): lockfile = os.path.join(config.path, 'lock') @@ -426,7 +435,13 @@ if __name__ == '__main__': if cmd_name not in ['gui', 'daemon']: cmd, password = init_cmdline(config) if not cmd.requires_network or config.get('offline'): - result = run_command(config, None, password) + if cmd.requires_wallet: + path = config.get_wallet_path() + storage = WalletStorage(path) + wallet = Wallet(storage) + else: + wallet = None + result = run_command(config, cmd, None, wallet, password) print_msg(json_encode(result)) sys.exit(0) else: