json rpc daemon
[electrum-nvc.git] / electrum
index a8934c2..f6b8506 100755 (executable)
--- a/electrum
+++ b/electrum
@@ -105,15 +105,34 @@ def print_help_cb(self, opt, value, parser):
 
 
 def run_command(cmd, password=None, args=[]):
+    import xmlrpclib, socket
     cmd_runner = Commands(wallet, network)
-    func = getattr(cmd_runner, cmd)
+    func = getattr(cmd_runner, cmd.name)
     cmd_runner.password = password
+
+    if cmd.requires_network and not options.offline:
+        cmd_runner.network = xmlrpclib.ServerProxy('http://localhost:8000')
+        if wallet:
+            wallet.start_threads(cmd_runner.network)
+            wallet.update()
+    else:
+        cmd_runner.network = None
+
     try:
         result = func(*args[1:])
+    except socket.error:
+        print "Network server not found."
+        sys.exit(1)
     except Exception:
         traceback.print_exc(file=sys.stdout)
         sys.exit(1)
 
+
+    if cmd.requires_network and not options.offline:
+        if wallet:
+            wallet.stop_threads()
+
+
     if type(result) == str:
         util.print_msg(result)
     elif result is not None:
@@ -201,6 +220,11 @@ if __name__ == '__main__':
         print_msg("Type 'electrum create' to create a new wallet, or provide a path to a wallet with the -w option")
         sys.exit(0)
 
+
+
+
+
+
     if cmd.name in ['create', 'restore']:
         if storage.file_exists:
             sys.exit("Error: Remove the existing wallet first!")
@@ -345,19 +369,41 @@ if __name__ == '__main__':
             print_msg("Warning: Final argument was reconstructed from several arguments:", repr(message))
             args = args[0:cmd.min_args] + [message]
 
-    # open session
-    if cmd.requires_network and not options.offline:
-        network = Network(config)
-        if not network.start(wait=True):
-            print_msg("Not connected, aborting.")
-            sys.exit(1)
-        print_error("Connected to " + network.interface.connection_msg)
 
-        if wallet:
-            wallet.start_threads(network)
-            wallet.update()
-    else:
-        network = None
+    if cmd.name == 'start_network':
+        pid = os.fork()
+        if (pid == 0): # The first child.
+            os.chdir("/")
+            os.setsid()
+            os.umask(0)
+            pid2 = os.fork()
+            if (pid2 == 0):  # Second child
+                from SimpleXMLRPCServer import SimpleXMLRPCServer
+                # start the daemon
+                network = Network(config)
+                if not network.start(wait=True):
+                    print_msg("Not connected, aborting.")
+                    sys.exit(1)
+                print_msg("Connected to " + network.interface.connection_msg)
+                server = SimpleXMLRPCServer(('localhost',8000), allow_none=True, logRequests=False)
+                server.register_function(network.synchronous_get, 'synchronous_get')
+                server.register_function(network.get_servers, 'get_servers')
+                server.register_function(network.main_server, 'main_server')
+                server.register_function(network.send, 'send')
+                server.register_function(network.subscribe, 'subscribe')
+                server.register_function(network.is_connected, 'is_connected')
+                server.register_function(network.is_up_to_date, 'is_up_to_date')
+                server.register_function(lambda: setattr(server,'running', False), 'stop')
+                server.running = True
+                while server.running:
+                    server.handle_request()
+                print_msg("Server stopped")
+                sys.exit(0)
+            else:
+                sys.exit(0)
+        else:
+            sys.exit(0)
+
 
     # run the command
     if cmd.name == 'deseed':
@@ -394,11 +440,8 @@ if __name__ == '__main__':
         wallet.update_password(password, new_password)
 
     else:
-        run_command(cmd.name, password, args)
+        run_command(cmd, password, args)
 
-    if network:
-        if wallet:
-            wallet.stop_threads()
-        network.stop()
-        time.sleep(0.1)
-        sys.exit(0)
+
+    time.sleep(0.1)
+    sys.exit(0)