handle signals
[electrum-server.git] / server.py
index ae21e4a..decdd89 100755 (executable)
--- a/server.py
+++ b/server.py
@@ -82,12 +82,13 @@ def create_config():
     return config
 
 
-def run_rpc_command(cmd, stratum_tcp_port):
+def run_rpc_command(params):
+    cmd = params[0]
     import xmlrpclib
     server = xmlrpclib.ServerProxy('http://localhost:8000')
     func = getattr(server, cmd)
     try:
-        r = func()
+        r = func(*params[1:])
     except socket.error:
         print "server not running"
         sys.exit(1)
@@ -114,12 +115,7 @@ def cmd_info():
                           "subscriptions": len(s.subscriptions)},
                dispatcher.request_dispatcher.get_sessions())
 
-def cmd_debug():
-    try:
-        s = request['params'][1]
-    except:
-        s = None
-
+def cmd_debug(s):
     if s:
         from guppy import hpy
         h = hpy()
@@ -146,7 +142,7 @@ if __name__ == '__main__':
         assert ssl_certfile and ssl_keyfile
 
     if len(sys.argv) > 1:
-        run_rpc_command(sys.argv[1], stratum_tcp_port)
+        run_rpc_command(sys.argv[1:])
         sys.exit(0)
 
     try:
@@ -183,6 +179,15 @@ if __name__ == '__main__':
     dispatcher = Dispatcher(config)
     shared = dispatcher.shared
 
+    # handle termination signals
+    import signal
+    def handler(signum = None, frame = None):
+        print_log('Signal handler called with signal', signum)
+        shared.stop()
+    for sig in [signal.SIGTERM, signal.SIGHUP, signal.SIGQUIT]:
+        signal.signal(sig, handler)
+
+
     # Create and register processors
     chain_proc = BlockchainProcessor(config, shared)
     dispatcher.register('blockchain', chain_proc)
@@ -211,20 +216,21 @@ if __name__ == '__main__':
     for server in transports:
         server.start()
 
-
-
-    from SimpleXMLRPCServer import SimpleXMLRPCServer
     
 
+    from SimpleXMLRPCServer import SimpleXMLRPCServer
     server = SimpleXMLRPCServer(('localhost',8000), allow_none=True, logRequests=False)
     server.register_function(lambda: os.getpid(), 'getpid')
     server.register_function(shared.stop, 'stop')
     server.register_function(cmd_info, 'info')
     server.register_function(cmd_debug, 'debug')
+    server.socket.settimeout(1)
  
     while not shared.stopped():
         try:
             server.handle_request()
+        except socket.timeout:
+            continue
         except:
             shared.stop()