* improve txpoint sorting
"""
-SERVER_MESSAGE = """
-Welcome to ecdsa.org.
-
-This service is free. Support this node:
-19mP9FKrXqL46Si58pHdhGKow88SUPy1V8
-
-The server code is free software; you may
-download it and operate your own Electrum
-node. See http://ecdsa.org/electrum
-"""
-
-
import time, socket, operator, thread, ast, sys
-
import psycopg2, binascii
import bitcoinrpc
from Abe.DataStore import DataStore as Datastore_class
from Abe import DataStore, readconf, BCDataStream, deserialize, util, base58
+try:
+ f = open('/etc/electrum.conf','r')
+ data = f.read()
+ f.close()
+ HOST, PORT, SERVER_MESSAGE = ast.literal_eval(data)
+except:
+ print "could not read /etc/electrum.conf"
+ SERVER_MESSAGE = "Welcome to Electrum"
+ HOST = 'ecdsa.org'
+ PORT = 50000
+
+
sessions = {}
+sessions_last_time = {}
dblock = thread.allocate_lock()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- s.bind(('ecdsa.org', 50000))
+ s.bind((HOST, PORT))
s.listen(1)
while True:
conn, addr = s.accept()
def client_thread(ipaddr,conn):
+ #print "client thread", ipaddr
try:
ipaddr = ipaddr[0]
msg = ''
while 1:
d = conn.recv(1024)
- if d: msg+=d
- try:
- cmd, data = ast.literal_eval(msg)
+ msg += d
+ if d[-1]=='#':
break
- except:
- continue
-
+
+ #print msg
+
+ try:
+ cmd, data = ast.literal_eval(msg[:-1])
+ except:
+ print "syntax error", repr(msg)
+ conn.close()
+ return
if cmd=='b':
out = "%d"%store.get_block_number(1)
- elif cmd=='watch':
- addresses = ast.literal_eval(data)
- sessions[ipaddr] = {}
+ elif cmd=='session':
+ import random, string
+ session_id = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(10))
+ try:
+ addresses = ast.literal_eval(data)
+ except:
+ print "error"
+ conn.close()
+ return
+
+ print time.asctime(), "session", ipaddr, session_id, addresses[0], len(addresses)
+
+ clean_sessions()
+ sessions[session_id] = {}
for a in addresses:
- sessions[ipaddr][a] = ''
- out = SERVER_MESSAGE
+ sessions[session_id][a] = ''
+ out = repr( (session_id, SERVER_MESSAGE) )
+ sessions_last_time[session_id] = time.time()
elif cmd=='poll':
- addresses = sessions.get(ipaddr)
+ session_id = data
+ addresses = sessions.get(session_id)
if not addresses:
print "session not found", ipaddr
out = repr( (-1, {}))
else:
+ sessions_last_time[session_id] = time.time()
ret = {}
for addr in addresses:
status = store.get_status( addr )
- last_status = sessions[ipaddr].get( addr )
+ last_status = sessions[session_id].get( addr )
if last_status != status:
- sessions[ipaddr][addr] = status
+ sessions[session_id][addr] = status
ret[addr] = status
out = repr( (store.get_block_number(1), ret ) )
pass
else:
store.import_tx(tx, False)
- print tx['hash'][::-1].encode('hex')
+ #print tx['hash'][::-1].encode('hex')
store.commit()
+
+
+
+def clean_sessions():
+ t = time.time()
+ for k,t0 in sessions_last_time.items():
+ if t - t0 > 60:
+ print "lost session",k
+ sessions.pop(k)
+ sessions_last_time.pop(k)
+
+
+
import traceback
if __name__ == '__main__':
+ print "starting Electrum server"
conf = DataStore.CONFIG_DEFAULTS
args, argv = readconf.parse_argv( [], conf)
args.dbtype='psycopg2'
dblock.release()
except:
traceback.print_exc(file=sys.stdout)
+ print "continuing..."
time.sleep(10)