* 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
+ #print "client thread", ipaddr
try:
ipaddr = ipaddr[0]
msg = ''
if d[-1]=='#':
break
- print msg
+ #print msg
try:
cmd, data = ast.literal_eval(msg[:-1])
elif cmd=='session':
import random, string
session_id = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(10))
- print "new session", ipaddr, session_id
+ try:
+ addresses = ast.literal_eval(data)
+ except:
+ print "error"
+ conn.close()
+ return
+
+ print time.asctime(), "session", ipaddr, session_id, addresses[0], len(addresses)
- addresses = ast.literal_eval(data)
+ clean_sessions()
sessions[session_id] = {}
for a in addresses:
sessions[session_id][a] = ''
out = repr( (session_id, SERVER_MESSAGE) )
+ sessions_last_time[session_id] = time.time()
elif cmd=='poll':
session_id = data
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 )
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'
args.connect_args = {"database":"abe"}
store = MyStore(args)
- #thread.start_new_thread(listen_thread, (store,))
- listen_thread(store)
- exit(0)
+ thread.start_new_thread(listen_thread, (store,))
while True:
try:
dblock.release()
except:
traceback.print_exc(file=sys.stdout)
+ print "continuing..."
time.sleep(10)