root / QMP / qmp.py @ 1a1ea6f0
History | View | Annotate | Download (2 kB)
1 | cedebdac | Luiz Capitulino | # QEMU Monitor Protocol Python class
|
---|---|---|---|
2 | cedebdac | Luiz Capitulino | #
|
3 | cedebdac | Luiz Capitulino | # Copyright (C) 2009 Red Hat Inc.
|
4 | cedebdac | Luiz Capitulino | #
|
5 | cedebdac | Luiz Capitulino | # Authors:
|
6 | cedebdac | Luiz Capitulino | # Luiz Capitulino <lcapitulino@redhat.com>
|
7 | cedebdac | Luiz Capitulino | #
|
8 | cedebdac | Luiz Capitulino | # This work is licensed under the terms of the GNU GPL, version 2. See
|
9 | cedebdac | Luiz Capitulino | # the COPYING file in the top-level directory.
|
10 | cedebdac | Luiz Capitulino | |
11 | cedebdac | Luiz Capitulino | import socket, json |
12 | cedebdac | Luiz Capitulino | |
13 | cedebdac | Luiz Capitulino | class QMPError(Exception): |
14 | cedebdac | Luiz Capitulino | pass
|
15 | cedebdac | Luiz Capitulino | |
16 | cedebdac | Luiz Capitulino | class QMPConnectError(QMPError): |
17 | cedebdac | Luiz Capitulino | pass
|
18 | cedebdac | Luiz Capitulino | |
19 | cedebdac | Luiz Capitulino | class QEMUMonitorProtocol: |
20 | cedebdac | Luiz Capitulino | def connect(self): |
21 | cedebdac | Luiz Capitulino | self.sock.connect(self.filename) |
22 | cedebdac | Luiz Capitulino | data = self.__json_read()
|
23 | cedebdac | Luiz Capitulino | if data == None: |
24 | cedebdac | Luiz Capitulino | raise QMPConnectError
|
25 | cedebdac | Luiz Capitulino | if not data.has_key('QMP'): |
26 | cedebdac | Luiz Capitulino | raise QMPConnectError
|
27 | cedebdac | Luiz Capitulino | return data['QMP']['capabilities'] |
28 | cedebdac | Luiz Capitulino | |
29 | cedebdac | Luiz Capitulino | def close(self): |
30 | cedebdac | Luiz Capitulino | self.sock.close()
|
31 | cedebdac | Luiz Capitulino | |
32 | cedebdac | Luiz Capitulino | def send_raw(self, line): |
33 | cedebdac | Luiz Capitulino | self.sock.send(str(line)) |
34 | cedebdac | Luiz Capitulino | return self.__json_read() |
35 | cedebdac | Luiz Capitulino | |
36 | cedebdac | Luiz Capitulino | def send(self, cmdline): |
37 | cedebdac | Luiz Capitulino | cmd = self.__build_cmd(cmdline)
|
38 | cedebdac | Luiz Capitulino | self.__json_send(cmd)
|
39 | cedebdac | Luiz Capitulino | resp = self.__json_read()
|
40 | cedebdac | Luiz Capitulino | if resp == None: |
41 | cedebdac | Luiz Capitulino | return
|
42 | cedebdac | Luiz Capitulino | elif resp.has_key('error'): |
43 | cedebdac | Luiz Capitulino | return resp['error'] |
44 | cedebdac | Luiz Capitulino | else:
|
45 | cedebdac | Luiz Capitulino | return resp['return'] |
46 | cedebdac | Luiz Capitulino | |
47 | cedebdac | Luiz Capitulino | def __build_cmd(self, cmdline): |
48 | cedebdac | Luiz Capitulino | cmdargs = cmdline.split() |
49 | cedebdac | Luiz Capitulino | qmpcmd = { 'execute': cmdargs[0], 'arguments': {} } |
50 | cedebdac | Luiz Capitulino | for arg in cmdargs[1:]: |
51 | cedebdac | Luiz Capitulino | opt = arg.split('=')
|
52 | cedebdac | Luiz Capitulino | try:
|
53 | cedebdac | Luiz Capitulino | value = int(opt[1]) |
54 | cedebdac | Luiz Capitulino | except ValueError: |
55 | cedebdac | Luiz Capitulino | value = opt[1]
|
56 | cedebdac | Luiz Capitulino | qmpcmd['arguments'][opt[0]] = value |
57 | cedebdac | Luiz Capitulino | return qmpcmd
|
58 | cedebdac | Luiz Capitulino | |
59 | cedebdac | Luiz Capitulino | def __json_send(self, cmd): |
60 | cedebdac | Luiz Capitulino | # XXX: We have to send any additional char, otherwise
|
61 | cedebdac | Luiz Capitulino | # the Server won't read our input
|
62 | cedebdac | Luiz Capitulino | self.sock.send(json.dumps(cmd) + ' ') |
63 | cedebdac | Luiz Capitulino | |
64 | cedebdac | Luiz Capitulino | def __json_read(self): |
65 | cedebdac | Luiz Capitulino | try:
|
66 | bbafc7a8 | Jan Kiszka | while True: |
67 | bbafc7a8 | Jan Kiszka | line = json.loads(self.sockfile.readline())
|
68 | bbafc7a8 | Jan Kiszka | if not 'event' in line: |
69 | bbafc7a8 | Jan Kiszka | return line
|
70 | cedebdac | Luiz Capitulino | except ValueError: |
71 | cedebdac | Luiz Capitulino | return
|
72 | cedebdac | Luiz Capitulino | |
73 | cedebdac | Luiz Capitulino | def __init__(self, filename): |
74 | cedebdac | Luiz Capitulino | self.filename = filename
|
75 | cedebdac | Luiz Capitulino | self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
76 | bbafc7a8 | Jan Kiszka | self.sockfile = self.sock.makefile() |