Revision 37628f11 QMP/qmp.py
b/QMP/qmp.py | ||
---|---|---|
22 | 22 |
pass |
23 | 23 |
|
24 | 24 |
class QEMUMonitorProtocol: |
25 |
def __init__(self, address): |
|
25 |
def __init__(self, address, server=False):
|
|
26 | 26 |
""" |
27 | 27 |
Create a QEMUMonitorProtocol class. |
28 | 28 |
|
29 | 29 |
@param address: QEMU address, can be either a unix socket path (string) |
30 | 30 |
or a tuple in the form ( address, port ) for a TCP |
31 | 31 |
connection |
32 |
@note No connection is established, this is done by the connect() method |
|
32 |
@param server: server mode listens on the socket (bool) |
|
33 |
@raise socket.error on socket connection errors |
|
34 |
@note No connection is established, this is done by the connect() or |
|
35 |
accept() methods |
|
33 | 36 |
""" |
34 | 37 |
self.__events = [] |
35 | 38 |
self.__address = address |
36 | 39 |
self.__sock = self.__get_sock() |
37 |
self.__sockfile = self.__sock.makefile() |
|
40 |
if server: |
|
41 |
self.__sock.bind(self.__address) |
|
42 |
self.__sock.listen(1) |
|
38 | 43 |
|
39 | 44 |
def __get_sock(self): |
40 | 45 |
if isinstance(self.__address, tuple): |
... | ... | |
43 | 48 |
family = socket.AF_UNIX |
44 | 49 |
return socket.socket(family, socket.SOCK_STREAM) |
45 | 50 |
|
51 |
def __negotiate_capabilities(self): |
|
52 |
self.__sockfile = self.__sock.makefile() |
|
53 |
greeting = self.__json_read() |
|
54 |
if greeting is None or not greeting.has_key('QMP'): |
|
55 |
raise QMPConnectError |
|
56 |
# Greeting seems ok, negotiate capabilities |
|
57 |
resp = self.cmd('qmp_capabilities') |
|
58 |
if "return" in resp: |
|
59 |
return greeting |
|
60 |
raise QMPCapabilitiesError |
|
61 |
|
|
46 | 62 |
def __json_read(self, only_event=False): |
47 | 63 |
while True: |
48 | 64 |
data = self.__sockfile.readline() |
... | ... | |
67 | 83 |
@raise QMPCapabilitiesError if fails to negotiate capabilities |
68 | 84 |
""" |
69 | 85 |
self.__sock.connect(self.__address) |
70 |
greeting = self.__json_read() |
|
71 |
if greeting is None or not greeting.has_key('QMP'): |
|
72 |
raise QMPConnectError |
|
73 |
# Greeting seems ok, negotiate capabilities |
|
74 |
resp = self.cmd('qmp_capabilities') |
|
75 |
if "return" in resp: |
|
76 |
return greeting |
|
77 |
raise QMPCapabilitiesError |
|
86 |
return self.__negotiate_capabilities() |
|
87 |
|
|
88 |
def accept(self): |
|
89 |
""" |
|
90 |
Await connection from QMP Monitor and perform capabilities negotiation. |
|
91 |
|
|
92 |
@return QMP greeting dict |
|
93 |
@raise socket.error on socket connection errors |
|
94 |
@raise QMPConnectError if the greeting is not received |
|
95 |
@raise QMPCapabilitiesError if fails to negotiate capabilities |
|
96 |
""" |
|
97 |
self.__sock, _ = self.__sock.accept() |
|
98 |
return self.__negotiate_capabilities() |
|
78 | 99 |
|
79 | 100 |
def cmd_obj(self, qmp_cmd): |
80 | 101 |
""" |
Also available in: Unified diff