Browse Source

spawn daemon using daemon.py

283
ThomasV 11 years ago
parent
commit
087490a197
  1. 51
      electrum
  2. 27
      lib/daemon.py
  3. 5
      scripts/block_headers

51
electrum

@ -46,6 +46,7 @@ if is_local:
from electrum import util
from electrum import SimpleConfig, Network, Wallet, WalletStorage, NetworkProxy, Commands, known_commands, pick_random_server
from electrum.util import print_msg, print_stderr, print_json, set_verbosity
from electrum.daemon import get_daemon
# get password routine
def prompt_password(prompt, confirm=True):
@ -105,13 +106,11 @@ def print_help_cb(self, opt, value, parser):
sys.exit(1)
def run_command(cmd, password=None, args=None):
if args is None:
args = [] # Do not use mutables as default values!
if cmd.requires_network and not options.offline:
s = daemon_socket()
s = get_daemon(config, True)
network = NetworkProxy(s, config)
network.start()
while network.is_connecting():
@ -147,32 +146,6 @@ def run_command(cmd, password=None, args=None):
print_json(result)
def do_start_daemon():
import subprocess
logfile = open(os.path.join(config.path, 'daemon.log'),'w')
p = subprocess.Popen([__file__,"daemon"], stderr=logfile, stdout=logfile, close_fds=True)
print_stderr("starting daemon (PID %d)"%p.pid)
def daemon_socket(start_daemon=True):
import socket
from electrum.daemon import DAEMON_PORT
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
daemon_port = config.get('daemon_port', DAEMON_PORT)
daemon_started = False
while True:
try:
s.connect(('', daemon_port))
return s
except socket.error:
if not start_daemon:
return False
elif not daemon_started:
do_start_daemon()
daemon_started = True
else:
time.sleep(0.1)
if __name__ == '__main__':
@ -222,7 +195,7 @@ if __name__ == '__main__':
# network interface
if not options.offline:
s = daemon_socket(start_daemon=options.daemon)
s = get_daemon(config, start_daemon=options.daemon)
network = NetworkProxy(s, config)
network.start()
else:
@ -236,30 +209,20 @@ if __name__ == '__main__':
# we use daemon threads, their termination is enforced.
# this sleep command gives them time to terminate cleanly.
time.sleep(0.1)
time.sleep(0.2)
sys.exit(0)
if cmd == 'daemon':
if len(args) == 1:
from electrum import daemon, util
util.set_verbosity(True)
print_stderr( "Starting daemon [%s]"%config.get('server'))
server = daemon.NetworkServer(config)
try:
server.main_loop()
except KeyboardInterrupt:
print_msg("Ctrl C - Stopping server")
sys.exit(0)
arg = args[1]
arg = args[1] if len(args)>1 else None
if arg not in ['start', 'stop', 'status']:
print_msg("syntax: electrum daemon <start|status|stop>")
sys.exit(1)
s = daemon_socket(start_daemon=False)
s = get_daemon(config, False)
if arg == 'start':
if s:
print_msg("Daemon already running")
sys.exit(1)
do_start_daemon()
get_daemon(config, True)
sys.exit(0)
elif arg in ['status','stop']:
if not s:

27
lib/daemon.py

@ -30,11 +30,34 @@ from network import Network
from util import print_error, print_stderr, parse_json
from simple_config import SimpleConfig
DAEMON_PORT=8001
def do_start_daemon(config):
import subprocess
logfile = open(os.path.join(config.path, 'daemon.log'),'w')
p = subprocess.Popen(["python",__file__], stderr=logfile, stdout=logfile, close_fds=True)
print_stderr("starting daemon (PID %d)"%p.pid)
def get_daemon(config, start_daemon=True):
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
daemon_port = config.get('daemon_port', DAEMON_PORT)
daemon_started = False
while True:
try:
s.connect(('', daemon_port))
return s
except socket.error:
if not start_daemon:
return False
elif not daemon_started:
do_start_daemon(config)
daemon_started = True
else:
time.sleep(0.1)
class ClientThread(threading.Thread):

5
scripts/block_headers

@ -5,7 +5,10 @@
import time, electrum
# start network
network = electrum.NetworkProxy(False)
c = electrum.SimpleConfig()
s = electrum.daemon.get_daemon(c,True)
network = electrum.NetworkProxy(s,c)
network.start()
# wait until connected

Loading…
Cancel
Save