commit 928498d695745bb6a527f33d06dbbdbb362248f0
parent 3ada7b61fe565e5a878a18139bcc8d84e4cff9d1
Author: ThomasV <thomasv@gitorious>
Date: Fri, 23 Dec 2011 01:57:13 +0300
more command separation
Diffstat:
M | server/server.py | | | 181 | +++++++++++++++++++++++++++++++++++++++++++------------------------------------ |
1 file changed, 98 insertions(+), 83 deletions(-)
diff --git a/server/server.py b/server/server.py
@@ -326,6 +326,100 @@ def send_tx(tx):
v = "error: transaction rejected by memorypool"
return v
+def random_string(N):
+ import random, string
+ return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N))
+
+
+
+def cmd_stop(data):
+ global stopping
+ if password == data:
+ stopping = True
+ return 'ok'
+ else:
+ return 'wrong password'
+
+def cmd_load(pw):
+ if password == pw:
+ return repr( len(sessions) )
+ else:
+ return 'wrong password'
+
+
+def clear_cache(pw):
+ if password == pw:
+ store.tx_cache = {}
+ return 'ok'
+ else:
+ return 'wrong password'
+
+def get_cache(pw,addr):
+ if password == pw:
+ return store.tx_cache.get(addr)
+ else:
+ return 'wrong password'
+
+
+def cmd_poll(session_id):
+ session = sessions.get(session_id)
+ if session is None:
+ print time.asctime(), "session not found", session_id, ipaddr
+ out = repr( (-1, {}))
+ else:
+ t1 = time.time()
+ addresses = session['addresses']
+ session['last_time'] = time.time()
+ ret = {}
+ k = 0
+ for addr in addresses:
+ if store.tx_cache.get( addr ) is not None: k += 1
+
+ # get addtess status, i.e. the last block for that address.
+ tx_points = store.get_history(addr)
+ if not tx_points:
+ status = None
+ else:
+ lastpoint = tx_points[-1]
+ status = lastpoint['blk_hash']
+ # this is a temporary hack; move it up once old clients have disappeared
+ if status == 'mempool' and session['version'] != "old":
+ status = status + ':%d'% len(tx_points)
+
+ last_status = addresses.get( addr )
+ if last_status != status:
+ addresses[addr] = status
+ ret[addr] = status
+ if ret:
+ sessions[session_id]['addresses'] = addresses
+ out = repr( (block_number, ret ) )
+ t2 = time.time() - t1
+ if t2 > 10:
+ print "high load:", session_id, "%d/%d"%(k,len(addresses)), t2
+
+ return out
+
+
+def new_session(addresses, version, ipaddr):
+ 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 }
+ 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):
+ print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "update session", ipaddr, addresses[0] if addresses else addresses, len(addresses)
+ sessions[session_id]['addresses'] = {}
+ for a in addresses:
+ sessions[session_id]['addresses'][a] = ''
+ out = 'ok'
+ sessions[session_id]['last_time'] = time.time()
+
def listen_thread(store):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -336,9 +430,7 @@ def listen_thread(store):
conn, addr = s.accept()
thread.start_new_thread(client_thread, (addr, conn,))
-def random_string(N):
- import random, string
- return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N))
+
def client_thread(ipaddr,conn):
#print "client thread", ipaddr
@@ -370,35 +462,6 @@ def client_thread(ipaddr,conn):
finally:
conn.close()
-
-
-def cmd_stop(data):
- global stopping
- if password == data:
- stopping = True
- return 'ok'
- else:
- return 'wrong password'
-
-def cmd_load(pw):
- if password == pw:
- return repr( len(sessions) )
- else:
- return 'wrong password'
-
-
-def clear_cache(pw):
- if password == pw:
- store.tx_cache = {}
- return 'ok'
- else:
- return 'wrong password'
-
-def get_cache(pw,addr):
- if password == pw:
- return store.tx_cache.get(addr)
- else:
- return 'wrong password'
def do_command(cmd, data, ipaddr):
@@ -407,7 +470,6 @@ def do_command(cmd, data, ipaddr):
out = "%d"%block_number
elif cmd in ['session','new_session']:
- session_id = random_string(10)
try:
if cmd == 'session':
addresses = ast.literal_eval(data)
@@ -418,14 +480,7 @@ def do_command(cmd, data, ipaddr):
except:
print "error", data
return None
-
- 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 }
- 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()
+ out = new_session(addresses, version, ipaddr)
elif cmd=='update_session':
try:
@@ -433,14 +488,8 @@ def do_command(cmd, data, ipaddr):
except:
print "error"
return None
+ out = update_session(session_id,addresses)
- print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "update session", ipaddr, addresses[0] if addresses else addresses, len(addresses)
-
- sessions[session_id]['addresses'] = {}
- for a in addresses:
- sessions[session_id]['addresses'][a] = ''
- out = 'ok'
- sessions[session_id]['last_time'] = time.time()
elif cmd == 'bccapi_login':
import electrum
@@ -490,41 +539,7 @@ def do_command(cmd, data, ipaddr):
out = ''
elif cmd=='poll':
- session_id = data
- session = sessions.get(session_id)
- if session is None:
- print time.asctime(), "session not found", session_id, ipaddr
- out = repr( (-1, {}))
- else:
- t1 = time.time()
- addresses = session['addresses']
- session['last_time'] = time.time()
- ret = {}
- k = 0
- for addr in addresses:
- if store.tx_cache.get( addr ) is not None: k += 1
-
- # get addtess status, i.e. the last block for that address.
- tx_points = store.get_history(addr)
- if not tx_points:
- status = None
- else:
- lastpoint = tx_points[-1]
- status = lastpoint['blk_hash']
- # this is a temporary hack; move it up once old clients have disappeared
- if status == 'mempool' and session['version'] != "old":
- status = status + ':%d'% len(tx_points)
-
- last_status = addresses.get( addr )
- if last_status != status:
- addresses[addr] = status
- ret[addr] = status
- if ret:
- sessions[session_id]['addresses'] = addresses
- out = repr( (block_number, ret ) )
- t2 = time.time() - t1
- if t2 > 10:
- print "high load:", session_id, "%d/%d"%(k,len(addresses)), t2
+ out = cmd_poll(data)
elif cmd == 'h':
# history