electrum

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

commit fb8f9e55efa2f4bed36c8120834b8e823f1a70a7
parent 93573282bf8c966a19ebbd7a3b3c0cc37b521f4a
Author: ThomasV <thomasv@electrum.org>
Date:   Wed, 23 Dec 2015 15:59:32 +0100

Cleanup main script, with semantic changes:
The --offline flag applies only to GUI.
Commands must use the daemon if a daemon is running, otherwise they are run offline.
Commands that only require the wallet do not have the require_network flag.

Diffstat:
Melectrum | 124++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mlib/commands.py | 21++++++++++-----------
2 files changed, 72 insertions(+), 73 deletions(-)

diff --git a/electrum b/electrum @@ -321,84 +321,84 @@ if __name__ == '__main__': config_options['url'] = uri config = SimpleConfig(config_options) - cmd_name = config.get('cmd') + cmdname = config.get('cmd') # initialize plugins. - gui_name = config.get('gui', 'qt') if cmd_name == 'gui' else 'cmdline' + gui_name = config.get('gui', 'qt') if cmdname == 'gui' else 'cmdline' plugins = Plugins(config, is_bundle or is_local or is_android, gui_name) # run non-RPC commands separately - if cmd_name in ['create', 'restore', 'deseed']: + if cmdname in ['create', 'restore', 'deseed']: run_non_RPC(config) sys.exit(0) # check if a daemon is running server = get_daemon(config) - # if no daemon is running, run the command offline - if cmd_name not in ['gui', 'daemon']: - init_cmdline(config_options) - if server is None: #not (cmd.requires_network or cmd.requires_wallet) or config.get('offline'): - result = run_offline_command(config, config_options) - print_msg(json_encode(result)) - sys.exit(0) - - # daemon is running - if server is not None: - cmdname = config_options.get('cmd') - if cmdname == 'daemon': - result = server.daemon(config_options) - elif cmdname == 'gui': + if cmdname == 'gui': + if server is not None: result = server.gui(config_options) else: - result = server.run_cmdline(config_options) - if type(result) in [str, unicode]: - print_msg(result) - elif type(result) is dict and result.get('error'): - print_stderr(result.get('error')) - elif result is not None: - print_msg(json_encode(result)) - sys.exit(0) - - # daemon is not running - if cmd_name == 'gui': - if not config.get('offline'): - network = Network(config) - network.start() - plugins.start() - else: - network = None - gui = init_gui(config, network, plugins) - daemon = Daemon(config, network, gui) - daemon.start() - gui.main() - sys.exit(0) - - elif cmd_name == 'daemon': - subcommand = config.get('subcommand') - if subcommand in ['status', 'stop']: - print_msg("Daemon not running") - sys.exit(1) - elif subcommand == 'start': - p = os.fork() - if p == 0: + if not config.get('offline'): network = Network(config) network.start() plugins.start() - daemon = Daemon(config, network) - if config.get('websocket_server'): - from electrum import websockets - websockets.WebSocketServer(config, network).start() - if config.get('requests_dir'): - util.check_www_dir(config.get('requests_dir')) - daemon.start() - daemon.join() else: - print_stderr("starting daemon (PID %d)"%p) - sys.exit(0) + network = None + gui = init_gui(config, network, plugins) + daemon = Daemon(config, network, gui) + daemon.start() + gui.main() + sys.exit(0) + + elif cmdname == 'daemon': + if server is not None: + result = server.daemon(config_options) else: - print_msg("syntax: electrum daemon <start|status|stop>") - sys.exit(1) + subcommand = config.get('subcommand') + if subcommand in ['status', 'stop']: + print_msg("Daemon not running") + sys.exit(1) + elif subcommand == 'start': + p = os.fork() + if p == 0: + network = Network(config) + network.start() + plugins.start() + daemon = Daemon(config, network) + if config.get('websocket_server'): + from electrum import websockets + websockets.WebSocketServer(config, network).start() + if config.get('requests_dir'): + util.check_www_dir(config.get('requests_dir')) + daemon.start() + daemon.join() + sys.exit(0) + else: + print_stderr("starting daemon (PID %d)"%p) + sys.exit(0) + else: + print_msg("syntax: electrum daemon <start|status|stop>") + sys.exit(1) + else: - print_msg("Network daemon is not running. Try 'electrum daemon start'\nIf you want to run this command offline, use the -o flag.") - sys.exit(1) + # command line + init_cmdline(config_options) + if server is not None: + result = server.run_cmdline(config_options) + else: + cmd = known_commands[cmdname] + if cmd.requires_network: + print_msg("Network daemon is not running. Try 'electrum daemon start'") + sys.exit(1) + else: + result = run_offline_command(config, config_options) + + # print result + if type(result) in [str, unicode]: + print_msg(result) + elif type(result) is dict and result.get('error'): + print_stderr(result.get('error')) + elif result is not None: + print_msg(json_encode(result)) + sys.exit(0) diff --git a/lib/commands.py b/lib/commands.py @@ -160,7 +160,7 @@ class Commands: """ return self.network.synchronous_get(('blockchain.address.get_history', [address])) - @command('nw') + @command('w') def listunspent(self): """List unspent outputs. Returns the list of unspent transaction outputs in your wallet.""" @@ -276,10 +276,9 @@ class Commands: """Return the public keys for a wallet address. """ return self.wallet.get_public_keys(address) - @command('nw') + @command('w') def getbalance(self, account=None): - """Return the balance of your wallet. If run with the --offline flag, - returns the last known balance.""" + """Return the balance of your wallet. """ if account is None: c, u, x = self.wallet.get_balance() else: @@ -421,21 +420,21 @@ class Commands: self.wallet.sign_transaction(tx, self._password) return tx - @command('wpn') + @command('wp') def payto(self, destination, amount, tx_fee=None, from_addr=None, change_addr=None, nocheck=False, unsigned=False): """Create a transaction. """ domain = [from_addr] if from_addr else None tx = self._mktx([(destination, amount)], tx_fee, change_addr, domain, nocheck, unsigned) return tx.as_dict() - @command('wpn') + @command('wp') def paytomany(self, outputs, tx_fee=None, from_addr=None, change_addr=None, nocheck=False, unsigned=False): """Create a multi-output transaction. """ domain = [from_addr] if from_addr else None tx = self._mktx(outputs, tx_fee, change_addr, domain, nocheck, unsigned) return tx.as_dict() - @command('wn') + @command('w') def history(self): """Wallet history. Returns the transaction history of your wallet.""" balance = 0 @@ -505,7 +504,7 @@ class Commands: out.append(item) return out - @command('nw') + @command('w') def gettransaction(self, txid): """Retrieve a transaction. """ tx = self.wallet.transactions.get(txid) if self.wallet else None @@ -538,7 +537,7 @@ class Commands: out['status'] = pr_str[out.get('status', PR_UNKNOWN)] return out - @command('wn') + @command('w') def getrequest(self, key): """Return a payment request""" r = self.wallet.get_payment_request(key, self.config) @@ -551,7 +550,7 @@ class Commands: # """<Not implemented>""" # pass - @command('wn') + @command('w') def listrequests(self, pending=False, expired=False, paid=False): """List the payment requests you made.""" out = self.wallet.get_sorted_requests(self.config) @@ -734,7 +733,6 @@ def get_parser(): group.add_argument("-v", "--verbose", action="store_true", dest="verbose", default=False, help="Show debugging information") group.add_argument("-P", "--portable", action="store_true", dest="portable", default=False, help="Use local 'electrum_data' directory") group.add_argument("-w", "--wallet", dest="wallet_path", help="wallet path") - group.add_argument("-o", "--offline", action="store_true", dest="offline", default=False, help="Run offline") # create main parser parser = argparse.ArgumentParser( parents=[parent_parser], @@ -745,6 +743,7 @@ def get_parser(): parser_gui.add_argument("url", nargs='?', default=None, help="bitcoin URI (or bip70 file)") #parser_gui.set_defaults(func=run_gui) parser_gui.add_argument("-g", "--gui", dest="gui", help="select graphical user interface", choices=['qt', 'lite', 'gtk', 'kivy', 'text', 'stdio', 'jsonrpc']) + 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("-L", "--lang", dest="language", default=None, help="default language used in GUI") add_network_options(parser_gui)