diff --git a/scripts/rpc.py b/scripts/rpc.py index d22033486..2e07eb690 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -11,6 +11,9 @@ if __name__ == "__main__": parser.add_argument('-p', dest='port', help='RPC port number (if server_addr is IP address)', default=5260, type=int) + parser.add_argument('-t', dest='timeout', + help='Timout as a floating point number expressed in seconds waiting for reponse. Default: 60.0', + default=60.0, type=float) parser.add_argument('-v', dest='verbose', help='Verbose mode', action='store_true') subparsers = parser.add_subparsers(help='RPC methods') @@ -503,5 +506,5 @@ if __name__ == "__main__": args = parser.parse_args() - args.client = rpc.client.JSONRPCClient(args.server_addr, args.port, args.verbose) + args.client = rpc.client.JSONRPCClient(args.server_addr, args.port, args.verbose, args.timeout) args.func(args) diff --git a/scripts/rpc/client.py b/scripts/rpc/client.py index 5756365eb..1f318c2b7 100755 --- a/scripts/rpc/client.py +++ b/scripts/rpc/client.py @@ -1,5 +1,6 @@ import json import socket +import time try: from shlex import quote @@ -20,8 +21,9 @@ def int_arg(arg): class JSONRPCClient(object): - def __init__(self, addr, port=None, verbose=False): + def __init__(self, addr, port=None, verbose=False, timeout=60.0): self.verbose = verbose + self.timeout = timeout if addr.startswith('/'): self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.sock.connect(addr) @@ -56,13 +58,23 @@ class JSONRPCClient(object): buf = '' closed = False response = {} + start_time = time.clock() + while not closed: - newdata = self.sock.recv(4096) - if (newdata == b''): - closed = True - buf += newdata try: + timeout = self.timeout - (time.clock() - start_time) + if timeout <= 0.0: + break + + self.sock.settimeout(timeout) + newdata = self.sock.recv(4096) + if (newdata == b''): + closed = True + + buf += newdata response = json.loads(buf) + except socket.timeout: + break except ValueError: continue # incomplete response; keep buffering break @@ -70,7 +82,10 @@ class JSONRPCClient(object): if not response: if method == "kill_instance": exit(0) - print "Connection closed with partial response:" + if closed: + print "Connection closed with partial response:" + else: + print "Timeout while waiting for response:" print buf exit(1)