1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
import zmq
import json
from time import sleep
class RpcClient():
def __init__ (self, server, port):
self.context = zmq.Context()
self.port = port
self.server = server
# Socket to talk to server
self.transport = "tcp://{0}:{1}".format(server, port)
self.verbose = False
def get_connection_details (self):
rc = {}
rc['server'] = self.server
rc['port'] = self.port
return rc
def create_jsonrpc_v2 (self, method_name, params = {}, id = None):
msg = {}
msg["jsonrpc"] = "2.0"
msg["method"] = method_name
msg["params"] = {}
for key, value in params.iteritems():
msg["params"][key] = value
msg["id"] = id
return json.dumps(msg)
def invoke_rpc_method (self, method_name, params = {}, block = True):
msg = self.create_jsonrpc_v2(method_name, params, id = 1)
if self.verbose:
print "\nSending Request To Server: " + str(msg) + "\n"
if block:
self.socket.send(msg)
else:
try:
self.socket.send(msg, flags = zmq.NOBLOCK)
except zmq.error.ZMQError:
return False, "Failed To Get Server Response"
got_response = False
if block:
response = self.socket.recv()
got_response = True
else:
for i in xrange(0 ,5):
try:
response = self.socket.recv(flags = zmq.NOBLOCK)
got_response = True
break
except zmq.error.Again:
sleep(0.1)
if not got_response:
return False, "Failed To Get Server Response"
if self.verbose:
print "Server Response: " + str(response) + "\n"
# decode
response_json = json.loads(response)
if (response_json.get("jsonrpc") != "2.0"):
return False, "Malfromed Response ({0})".format(str(response))
# error reported by server
if ("error" in response_json):
return False, response_json["error"]["message"]
# if no error there should be a result
if ("result" not in response_json):
return False, "Malfromed Response ({0})".format(str(response))
return True, response_json["result"]
def ping_rpc_server (self):
return self.invoke_rpc_method("rpc_ping", block = False)
def get_rpc_server_status (self):
return self.invoke_rpc_method("rpc_get_status")
def query_rpc_server (self):
return self.invoke_rpc_method("rpc_get_reg_cmds")
def set_verbose (self, mode):
self.verbose = mode
def connect (self):
print "\nConnecting To RPC Server On {0}".format(self.transport)
self.socket = self.context.socket(zmq.REQ)
self.socket.connect(self.transport)
# ping the server
rc, err = self.ping_rpc_server()
if not rc:
self.context.destroy(linger = 0)
raise Exception(err)
#print "Connection Established !\n"
print "[SUCCESS]\n"
def __del__ (self):
print "Shutting down RPC client\n"
self.context.destroy(linger = 0)
|