URI: 
       tadd dump and getrequest to merchant script - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit feebd7c25381ca7b0b9538665a3b3d86ae3f3cd3
   DIR parent 484cd3983b002686fa40a99b5e5052e641b11b34
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Thu, 18 Sep 2014 12:59:29 +0200
       
       add dump and getrequest to merchant script
       
       Diffstat:
         M scripts/merchant/merchant.py        |     149 +++++++++++++++++++++----------
       
       1 file changed, 101 insertions(+), 48 deletions(-)
       ---
   DIR diff --git a/scripts/merchant/merchant.py b/scripts/merchant/merchant.py
       t@@ -17,8 +17,10 @@
        # along with this program. If not, see <http://www.gnu.org/licenses/>.
        
        
       -import time, thread, sys, socket, os
       -import urllib2,json
       +import time, sys, socket, os
       +import threading
       +import urllib2
       +import json
        import Queue
        import sqlite3
        
       t@@ -61,6 +63,19 @@ def check_create_table(conn):
            print "num rows", num
        
        
       +def row_to_dict(x):
       +    return {
       +        'id':x[0],
       +        'address':x[1],
       +        'amount':x[2],
       +        'confirmations':x[3],
       +        'received_at':x[4],
       +        'expires_at':x[5],
       +        'paid':x[6],
       +        'processed':x[7]
       +    }
       +
       +
        
        # this process detects when addresses have received payments
        def on_wallet_update():
       t@@ -96,7 +111,6 @@ def do_stop(password):
        
        def process_request(amount, confirmations, expires_in, password):
            global num
       -
            if password != my_password:
                return "wrong password"
        
       t@@ -116,69 +130,52 @@ def process_request(amount, confirmations, expires_in, password):
        
        
        
       -def server_thread(conn):
       -    from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
       -    server = SimpleJSONRPCServer(( my_host, my_port))
       -    server.register_function(process_request, 'request')
       -    server.register_function(do_stop, 'stop')
       -    server.serve_forever()
       -    
       +def do_dump(password):
       +    if password != my_password:
       +        return "wrong password"
        
       +    conn = sqlite3.connect(database);
       +    cur = conn.cursor()
       +    # read pending requests from table
       +    cur.execute("SELECT oid, * FROM electrum_payments;")
       +    data = cur.fetchall()
       +    return map(row_to_dict, data)
        
        
       +def getrequest(oid, password):
       +    oid = int(oid)
       +    conn = sqlite3.connect(database);
       +    cur = conn.cursor()
       +    # read pending requests from table
       +    cur.execute("SELECT oid, * FROM electrum_payments WHERE oid=%d;"%(oid))
       +    data = cur.fetchone()
       +    return row_to_dict(data)
       +
        
        def send_command(cmd, params):
            import jsonrpclib
            server = jsonrpclib.Server('http://%s:%d'%(my_host, my_port))
            try:
       -        if cmd == 'request':
       -            out = server.request(*params)
       -        elif cmd == 'stop':
       -            out = server.stop(*params)
       -        else:
       -            out = "unknown command"
       +        f = getattr(server, cmd)
       +    except socket.error:
       +        print "Server not running"
       +        return 1
       +        
       +    try:
       +        out = f(*params)
            except socket.error:
                print "Server not running"
                return 1
        
       -    print out
       +    print json.dumps(out, indent=4)
            return 0
        
        
       -if __name__ == '__main__':
       -
       -    if len(sys.argv) > 1:
       -        cmd = sys.argv[1]
       -        params = sys.argv[2:] + [my_password]
       -        ret = send_command(cmd, params)
       -        sys.exit(ret)
        
       +def db_thread():
            conn = sqlite3.connect(database);
            # create table if needed
            check_create_table(conn)
       -
       -    # init network
       -    network = electrum.NetworkProxy(False)
       -    network.start()
       -    while network.is_connecting():
       -        time.sleep(0.1)
       -
       -    # create watching_only wallet
       -    config = electrum.SimpleConfig({'wallet_path':wallet_path})
       -    storage = electrum.WalletStorage(config)
       -    if not storage.file_exists:
       -        print "creating wallet file"
       -        wallet = electrum.wallet.Wallet.from_xpub(xpub, storage)
       -    else:
       -        wallet = electrum.wallet.Wallet(storage)
       -
       -    wallet.synchronize = lambda: None # prevent address creation by the wallet
       -    wallet.start_threads(network)
       -    network.register_callback('updated', on_wallet_update)
       -    
       -    out_queue = Queue.Queue()
       -    thread.start_new_thread(server_thread, (conn,))
       -
            while not stopping:
                cur = conn.cursor()
        
       t@@ -230,6 +227,8 @@ if __name__ == '__main__':
                    data_json = { 'address':address, 'password':cb_password, 'paid':paid }
                    data_json = json.dumps(data_json)
                    url = received_url if paid else expired_url
       +            if not url:
       +                continue
                    req = urllib2.Request(url, data_json, headers)
                    try:
                        response_stream = urllib2.urlopen(req)
       t@@ -244,5 +243,59 @@ if __name__ == '__main__':
                conn.commit()
        
            conn.close()
       -    print "Done"
       +    print "database closed"
       +
       +
       +
       +if __name__ == '__main__':
       +
       +    if len(sys.argv) > 1:
       +        cmd = sys.argv[1]
       +        params = sys.argv[2:] + [my_password]
       +        ret = send_command(cmd, params)
       +        sys.exit(ret)
       +
       +    # start network
       +    c = electrum.SimpleConfig({'wallet_path':wallet_path})
       +    daemon_socket = electrum.daemon.get_daemon(c,True)
       +    network = electrum.NetworkProxy(daemon_socket,config)
       +    network.start()
       +
       +    # wait until connected
       +    while network.is_connecting():
       +        time.sleep(0.1)
       +
       +    if not network.is_connected():
       +        print_msg("daemon is not connected")
       +        sys.exit(1)
       +
       +    # create watching_only wallet
       +    storage = electrum.WalletStorage(c)
       +    if not storage.file_exists:
       +        print "creating wallet file"
       +        wallet = electrum.wallet.Wallet.from_xpub(xpub, storage)
       +    else:
       +        wallet = electrum.wallet.Wallet(storage)
       +
       +    wallet.synchronize = lambda: None # prevent address creation by the wallet
       +    wallet.start_threads(network)
       +    network.register_callback('updated', on_wallet_update)
       +
       +
       +    threading.Thread(target=db_thread, args=()).start()
       +    
       +    out_queue = Queue.Queue()
       +    # server thread
       +    from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
       +    server = SimpleJSONRPCServer(( my_host, my_port))
       +    server.register_function(process_request, 'request')
       +    server.register_function(do_dump, 'dump')
       +    server.register_function(getrequest, 'getrequest')
       +    server.register_function(do_stop, 'stop')
       +    server.socket.settimeout(1)
       +    while not stopping:
       +        try:
       +            server.handle_request()
       +        except socket.timeout:
       +            continue