URI: 
       tproper start and stop commands for daemon - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 96070246b72acb4c97d8e0726c636cea3adc4fea
   DIR parent 374efd970e8248331c1dc08d666c1674d68b0e4e
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Fri, 25 Jul 2014 15:42:28 +0200
       
       proper start and stop commands for daemon
       
       Diffstat:
         M electrum                            |      28 +++++++++++++++++++---------
         M lib/daemon.py                       |      16 ++++++++++++++--
         M lib/network_proxy.py                |       3 +++
       
       3 files changed, 36 insertions(+), 11 deletions(-)
       ---
   DIR diff --git a/electrum b/electrum
       t@@ -146,6 +146,12 @@ 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 "starting daemon (PID %d)"%p.pid
       +
        
        def daemon_socket(start_daemon=True):
            import socket
       t@@ -161,17 +167,12 @@ def daemon_socket(start_daemon=True):
                    if not start_daemon:
                        return False
                    elif not daemon_started:
       -                import subprocess
       -                logfile = open(os.path.join(config.path, 'daemon.log'),'w')
       -                p = subprocess.Popen([__file__,"daemon","start"], stderr=logfile, stdout=logfile, close_fds=True)
       -                print "starting daemon (PID %d)"%p.pid
       +                do_start_daemon()
                        daemon_started = True
                    else:
                        time.sleep(0.1)
        
        
       -
       -
        if __name__ == '__main__':
        
            wallet = None
       t@@ -242,8 +243,7 @@ if __name__ == '__main__':
                sys.exit(0)
        
            if cmd == 'daemon':
       -        arg = args[1]
       -        if arg=='start':
       +        if len(args) == 1:
                    from electrum import daemon, util
                    util.set_verbosity(True)
                    print_stderr( "Starting daemon [%s]"%config.get('server'))
       t@@ -253,8 +253,18 @@ if __name__ == '__main__':
                    except KeyboardInterrupt:
                        print_msg("Ctrl C - Stopping server")
                    sys.exit(0)
       +        arg = args[1]
       +        if arg not in ['start', 'stop', 'status']:
       +            print_msg("syntax: electrum daemon <start|status|stop>")
       +            sys.exit(1)
       +        s = daemon_socket(start_daemon=False)
       +        if arg == 'start':
       +            if s:
       +                print_msg("Daemon already running")
       +                sys.exit(1) 
       +            do_start_daemon()
       +            sys.exit(0)
                elif arg in ['status','stop']:
       -            s = daemon_socket(start_daemon=False)
                    if not s:
                        print_msg("Daemon not running")
                        sys.exit(1)
   DIR diff --git a/lib/daemon.py b/lib/daemon.py
       t@@ -72,7 +72,11 @@ class ClientThread(threading.Thread):
        
                message = ''
                while True:
       -            self.send_responses()
       +            try:
       +                self.send_responses()
       +            except socket.error:
       +                break
       +
                    try:
                        data = self.s.recv(1024)
                    except socket.timeout:
       t@@ -100,6 +104,10 @@ class ClientThread(threading.Thread):
                params = request['params']
                _id = request['id']
        
       +        if method == ('daemon.stop'):
       +            self.server.stop()
       +            return
       +
                if method.startswith('network.'):
                    out = {'id':_id}
                    try:
       t@@ -168,6 +176,9 @@ class NetworkServer:
                self.clients = []
                # daemon needs to know which client subscribed to which address
        
       +    def stop(self):
       +        with self.lock:
       +            self.running = False
        
            def add_client(self, client):
                for key in ['status','banner','updated','servers','interfaces']:
       t@@ -210,6 +221,7 @@ class NetworkServer:
                    except socket.timeout:
                        if not self.clients:
                            if time.time() - t > self.timeout:
       +                        print_error("Daemon timeout")
                                break
                        else:
                            t = time.time()
       t@@ -217,8 +229,8 @@ class NetworkServer:
                    t = time.time()
                    client = ClientThread(self, self.network, connection)
                    client.start()
       +        print_error("Daemon exiting")
        
       -        print_error("Daemon exiting (timeout)")
        
        
        
   DIR diff --git a/lib/network_proxy.py b/lib/network_proxy.py
       t@@ -196,6 +196,9 @@ class NetworkProxy(threading.Thread):
            def stop(self):
                self.running = False
        
       +    def stop_daemon(self):
       +        return self.send([('daemon.stop',[])], None)
       +
            def register_callback(self, event, callback):
                with self.lock:
                    if not self.callbacks.get(event):