daemon; initial commit
This commit is contained in:
53
electrum
53
electrum
@@ -114,15 +114,16 @@ def run_command(cmd, password=None, args=[]):
|
||||
cmd_runner.password = password
|
||||
|
||||
if cmd.requires_network and not options.offline:
|
||||
cmd_runner.network = xmlrpclib.ServerProxy('http://localhost:8000')
|
||||
|
||||
while True:
|
||||
try:
|
||||
if cmd_runner.network.ping() == 'pong':
|
||||
break
|
||||
cmd_runner.network = NetworkProxy(config)
|
||||
cmd_runner.network.start()
|
||||
break
|
||||
except socket.error:
|
||||
if cmd.name != 'daemon':
|
||||
start_daemon()
|
||||
print "starting daemon"
|
||||
start_daemon(config)
|
||||
else:
|
||||
print "Daemon not running"
|
||||
sys.exit(1)
|
||||
@@ -133,6 +134,7 @@ def run_command(cmd, password=None, args=[]):
|
||||
else:
|
||||
cmd_runner.network = None
|
||||
|
||||
|
||||
try:
|
||||
result = func(*args[1:])
|
||||
except Exception:
|
||||
@@ -153,50 +155,7 @@ def run_command(cmd, password=None, args=[]):
|
||||
|
||||
|
||||
|
||||
def start_server():
|
||||
network = Network(config)
|
||||
if not network.start(wait=True):
|
||||
print_msg("Not connected, aborting.")
|
||||
sys.exit(1)
|
||||
print_msg("Network daemon connected to " + network.interface.connection_msg)
|
||||
from SimpleXMLRPCServer import SimpleXMLRPCServer
|
||||
server = SimpleXMLRPCServer(('localhost',8000), allow_none=True, logRequests=False)
|
||||
server.network = network
|
||||
server.register_function(lambda: 'pong', 'ping')
|
||||
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')
|
||||
return server
|
||||
|
||||
def start_daemon():
|
||||
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 = start_server()
|
||||
server.running = True
|
||||
timeout = 60
|
||||
t0 = time.time()
|
||||
server.socket.settimeout(timeout)
|
||||
while server.running:
|
||||
server.handle_request()
|
||||
t = time.time()
|
||||
if t - t0 > 0.9*timeout:
|
||||
break
|
||||
if not server.network.is_connected():
|
||||
break
|
||||
t0 = t
|
||||
sys.exit(0)
|
||||
|
||||
time.sleep(2)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
Reference in New Issue
Block a user