X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=lib%2Fdaemon.py;h=f34159e9255318e64eaaae2506eb961cb0486e80;hb=8997c760a2cdfdc4a78e093c143788938fa68407;hp=7175befbb5f25a1403d1f4cc2e77a075a9eb3929;hpb=919ec8e837eef30364212eb7f95e26fc8cc7f850;p=electrum-nvc.git diff --git a/lib/daemon.py b/lib/daemon.py index 7175bef..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,26 +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.socket.connect(('', 8000)) + self.daemon_port = config.get('daemon_port', DAEMON_PORT) self.message_id = 0 self.unanswered_requests = {} self.subscriptions = {} - self.debug = True + 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') @@ -79,7 +117,7 @@ class NetworkProxy(threading.Thread): def process(self, response): # runs callbacks - #print "<--", response + if self.debug: print "<--", response msg_id = response.get('id') with self.lock: @@ -98,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 = [] @@ -110,7 +148,7 @@ class NetworkProxy(threading.Thread): request = json.dumps( { 'id':self.message_id, 'method':method, 'params':params } ) self.unanswered_requests[self.message_id] = method, params, callback ids.append(self.message_id) - # print "-->", request + if self.debug: print "-->", request self.message_id += 1 out += request + '\n' while out: @@ -121,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: @@ -179,6 +217,7 @@ class ClientThread(threading.Thread): self.network = network self.queue = Queue.Queue() self.unanswered_requests = {} + self.debug = False def run(self): @@ -212,7 +251,7 @@ class ClientThread(threading.Thread): def process(self, request): - #print "<--", request + if self.debug: print "<--", request method = request['method'] params = request['params'] _id = request['id'] @@ -228,6 +267,7 @@ class ClientThread(threading.Thread): except BaseException as e: out['error'] =str(e) self.queue.put(out) + return if method == 'daemon.shutdown': self.server.running = False @@ -255,7 +295,7 @@ class ClientThread(threading.Thread): while out: n = self.s.send(out) out = out[n:] - #print "-->", r + if self.debug: print "-->", r @@ -270,11 +310,12 @@ 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.server.bind(('', 8000)) + self.daemon_port = config.get('daemon_port', DAEMON_PORT) + self.server.bind(('', self.daemon_port)) self.server.listen(5) self.server.settimeout(1) self.running = False - self.timeout = 60 + self.timeout = config.get('daemon_timeout', 60) def main_loop(self): @@ -293,28 +334,6 @@ class NetworkServer: -def start_daemon(config): - 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(config) - try: - server.main_loop() - except KeyboardInterrupt: - print "Ctrl C - Stopping server" - sys.exit(1) - - sys.exit(0) - - # should use a signal - time.sleep(2) - - - if __name__ == '__main__': import simple_config config = simple_config.SimpleConfig({'verbose':True, 'server':'ecdsa.net:50002:s'})