Statistics
| Branch: | Revision:

root / QMP / qmp.py @ 1a4f5971

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()