add json calls related to sessions
[electrum-server.git] / server.py
index 7177764..f6c001e 100755 (executable)
--- a/server.py
+++ b/server.py
@@ -323,11 +323,8 @@ class MyStore(Datastore_class):
 def send_tx(tx):
     postdata = dumps({"method": 'importtransaction', 'params': [tx], 'id':'jsonrpc'})
     respdata = urllib.urlopen(bitcoind_url, postdata).read()
-    try:
-        v = loads(respdata)['result']
-    except:
-        v = "error: transaction rejected by memorypool"
-    return v
+    r = loads(respdata)
+    return r 
 
 
 
@@ -366,7 +363,7 @@ def get_cache(pw,addr):
         return 'wrong password'
 
 
-def cmd_poll(session_id):
+def poll_session(session_id):
     session = sessions.get(session_id)
     if session is None:
         print time.asctime(), "session not found", session_id
@@ -405,26 +402,21 @@ def cmd_poll(session_id):
         return out
 
 
-def new_session(addresses, version, ipaddr):
+def new_session(addresses, version):
     session_id = random_string(10)
-
-    print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "new session", ipaddr, addresses[0] if addresses else addresses, len(addresses), version
-
-    sessions[session_id] = { 'addresses':{}, 'version':version, 'ip':ipaddr }
+    sessions[session_id] = { 'addresses':{}, 'version':version }
     for a in addresses:
         sessions[session_id]['addresses'][a] = ''
     out = repr( (session_id, config.get('server','banner').replace('\\n','\n') ) )
     sessions[session_id]['last_time'] = time.time()
     return out
 
-def update_session(session_id,addresses,ipaddr):
-    print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "update session", ipaddr, addresses[0] if addresses else addresses, len(addresses)
+def update_session(session_id,addresses):
     sessions[session_id]['addresses'] = {}
     for a in addresses:
         sessions[session_id]['addresses'][a] = ''
-    out = 'ok'
     sessions[session_id]['last_time'] = time.time()
-
+    return 'ok'
 
 def listen_thread(store):
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -485,7 +477,8 @@ def do_command(cmd, data, ipaddr):
         except:
             print "error", data
             return None
-        out = new_session(addresses, version, ipaddr)
+        print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "new session", ipaddr, addresses[0] if addresses else addresses, len(addresses), version
+        out = new_session(addresses, version)
 
     elif cmd=='update_session':
         try:
@@ -493,8 +486,8 @@ def do_command(cmd, data, ipaddr):
         except:
             print "error"
             return None
-        out = update_session(session_id,addresses,ipaddr)
-
+        print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "update session", ipaddr, addresses[0] if addresses else addresses, len(addresses)
+        out = update_session(session_id,addresses)
 
     elif cmd == 'bccapi_login':
         import electrum
@@ -544,7 +537,7 @@ def do_command(cmd, data, ipaddr):
         out = ''
             
     elif cmd=='poll': 
-        out = cmd_poll(data)
+        out = poll_session(data)
 
     elif cmd == 'h': 
         # history
@@ -555,7 +548,11 @@ def do_command(cmd, data, ipaddr):
         out = cmd_load(data)
 
     elif cmd =='tx':
-        out = send_tx(data)
+        r = send_tx(data)
+        if r['error'] != None:
+            out = "error: transaction rejected by memorypool"
+        else:
+            out = r['result']
         print "sent tx:", out
 
     elif cmd == 'stop':
@@ -578,10 +575,11 @@ def memorypool_update(store):
 
     postdata = dumps({"method": 'getmemorypool', 'params': [], 'id':'jsonrpc'})
     respdata = urllib.urlopen(bitcoind_url, postdata).read()
-    v = loads(respdata)['result']
-
+    r = loads(respdata)
+    if r['error'] != None:
+        return
 
-    v = v['transactions']
+    v = r['result'].get('transactions')
     for hextx in v:
         ds.clear()
         ds.write(hextx.decode('hex'))
@@ -605,7 +603,6 @@ def clean_session_thread():
         for k,s in sessions.items():
             t0 = s['last_time']
             if t - t0 > 5*60:
-                print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "end session", s['ip']
                 sessions.pop(k)
             
 
@@ -657,7 +654,7 @@ def jsonrpc_thread(store):
     from SocketServer import ThreadingMixIn
     from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
     class SimpleThreadedJSONRPCServer(ThreadingMixIn, SimpleJSONRPCServer): pass
-    server = SimpleThreadedJSONRPCServer(('localhost', 8080))
+    server = SimpleThreadedJSONRPCServer(( config.get('server','host'), 8081))
     server.register_function(lambda : peer_list.values(), 'peers')
     server.register_function(cmd_stop, 'stop')
     server.register_function(cmd_load, 'load')
@@ -666,6 +663,9 @@ def jsonrpc_thread(store):
     server.register_function(get_cache, 'get_cache')
     server.register_function(send_tx, 'blockchain.transaction.broadcast')
     server.register_function(store.get_history, 'blockchain.address.get_history')
+    server.register_function(new_session, 'session.new')
+    server.register_function(update_session, 'session.update')
+    server.register_function(poll_session, 'session.poll')
     server.serve_forever()
 
 
@@ -676,7 +676,7 @@ if __name__ == '__main__':
 
     if len(sys.argv)>1:
         import jsonrpclib
-        server = jsonrpclib.Server('http://localhost:8080')
+        server = jsonrpclib.Server('http://%s:8081'%config.get('server','host'))
         cmd = sys.argv[1]
         if cmd == 'load':
             out = server.load(password)