X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=lib%2Fdaemon.py;h=f34159e9255318e64eaaae2506eb961cb0486e80;hb=8997c760a2cdfdc4a78e093c143788938fa68407;hp=8cb5229489416dcfa2e452913bad61977da8fbbb;hpb=0bb16f083626815ffc6df39b3dcf6e46a625dfc5;p=electrum-nvc.git diff --git a/lib/daemon.py b/lib/daemon.py index 8cb5229..f34159e 100644 --- a/lib/daemon.py +++ b/lib/daemon.py @@ -17,7 +17,6 @@ # along with this program. If not, see . import socket -import select import time import sys import os @@ -26,27 +25,65 @@ import traceback import json import Queue from network import Network -from util import print_msg +from util import print_msg, print_stderr +from simple_config import SimpleConfig +DAEMON_PORT=8001 class NetworkProxy(threading.Thread): # connects to daemon # sends requests, runs callbacks - def __init__(self, config): + def __init__(self, config=None): + if config is None: + config = {} # Do not use mutables as default arguments! threading.Thread.__init__(self) self.daemon = True - self.config = config + self.config = SimpleConfig(config) if type(config) == type({}) else config self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self.daemon_port = config.get('daemon_port', 8000) - self.socket.connect(('', self.daemon_port)) + self.daemon_port = config.get('daemon_port', DAEMON_PORT) self.message_id = 0 self.unanswered_requests = {} self.subscriptions = {} self.debug = False self.lock = threading.Lock() - + self.pending_transactions_for_notifications = [] + + + def start(self, start_daemon=False): + daemon_started = False + while True: + try: + self.socket.connect(('', self.daemon_port)) + threading.Thread.start(self) + return True + + except socket.error: + if not start_daemon: + return False + + elif not daemon_started: + print_stderr( "Starting daemon [%s]"%self.config.get('server')) + daemon_started = True + pid = os.fork() + if (pid == 0): # The first child. + os.chdir("/") + os.setsid() + os.umask(0) + pid2 = os.fork() + if (pid2 == 0): # Second child + server = NetworkServer(self.config) + try: + server.main_loop() + except KeyboardInterrupt: + print "Ctrl C - Stopping server" + sys.exit(1) + sys.exit(0) + else: + time.sleep(0.1) + + def parse_json(self, message): s = message.find('\n') @@ -99,10 +136,10 @@ class NetworkProxy(threading.Thread): if message not in self.subscriptions[callback]: self.subscriptions[callback].append(message) - self.do_send( messages, callback ) + self.send( messages, callback ) - def do_send(self, messages, callback): + def send(self, messages, callback): """return the ids of the requests that we sent""" out = '' ids = [] @@ -122,7 +159,7 @@ class NetworkProxy(threading.Thread): def synchronous_get(self, requests, timeout=100000000): queue = Queue.Queue() - ids = self.do_send(requests, lambda i,x: queue.put(x)) + ids = self.send(requests, lambda i,x: queue.put(x)) id2 = ids[:] res = {} while ids: @@ -273,7 +310,7 @@ class NetworkServer: self.network = network self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self.daemon_port = config.get('daemon_port', 8000) + self.daemon_port = config.get('daemon_port', DAEMON_PORT) self.server.bind(('', self.daemon_port)) self.server.listen(5) self.server.settimeout(1)