From: Luiz Capitulino <lcapitulino@redhat.com>
To: qemu-devel@nongnu.org
Cc: aliguori@us.ibm.com, avi@redhat.com
Subject: [Qemu-devel] [PATCH 14/15] QMP: Introduce qmp-shell
Date: Thu, 19 Nov 2009 13:13:42 -0200 [thread overview]
Message-ID: <1258643623-8636-15-git-send-email-lcapitulino@redhat.com> (raw)
In-Reply-To: <1258643623-8636-1-git-send-email-lcapitulino@redhat.com>
This is a very simple shell written in Python which works
on top of QMP.
Unfortunately it's a bit awkward right now, as the user has
to specify the arguments names, for example:
(QEMU) info item=version
0.11.50
(QEMU)
Also, if the output is not a string or integer, the user is
is going to get a low-level dictionary or list.
It's worth to note that the shell is broken into two files.
One is the shell itself, the other is the QMP class which
handles the communication with QEMU.
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
QMP/qmp-shell | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
QMP/qmp.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 120 insertions(+), 0 deletions(-)
create mode 100755 QMP/qmp-shell
create mode 100644 QMP/qmp.py
diff --git a/QMP/qmp-shell b/QMP/qmp-shell
new file mode 100755
index 0000000..2faf79b
--- /dev/null
+++ b/QMP/qmp-shell
@@ -0,0 +1,66 @@
+#!/usr/bin/python
+#
+# Simple QEMU shell on top of QMP
+#
+# Usage:
+#
+# Start QEMU with:
+#
+# $ qemu [...] -monitor control,unix:./qmp,server
+#
+# Run the shell:
+#
+# $ qmp-shell ./qmp
+#
+# Commands have the following format:
+#
+# < command-name > [ arg-name1=arg1 ] ... [ arg-nameN=argN ]
+#
+# For example:
+#
+# (QEMU) info item=network
+#
+# Luiz Capitulino <lcapitulino@redhat.com>
+
+import qmp
+import readline
+from sys import argv,exit
+
+def shell_help():
+ print 'bye exit from the shell'
+
+def main():
+ if len(argv) != 2:
+ print 'qemu-shell <unix-socket>'
+ exit(1)
+
+ qemu = qmp.QEMUMonitorProtocol(argv[1])
+ qemu.connect()
+
+ print 'Connected!'
+
+ while True:
+ try:
+ cmd = raw_input('(QEMU) ')
+ except EOFError:
+ print
+ break
+ if cmd == '':
+ continue
+ elif cmd == 'bye':
+ break
+ elif cmd == 'help':
+ shell_help()
+ else:
+ try:
+ resp = qemu.send(cmd)
+ if resp == None:
+ print 'Disconnected'
+ break
+ print resp
+ except IndexError:
+ print '-> command format: <command-name> ',
+ print '[arg-name1=arg1] ... [arg-nameN=argN]'
+
+if __name__ == '__main__':
+ main()
diff --git a/QMP/qmp.py b/QMP/qmp.py
new file mode 100644
index 0000000..c56f143
--- /dev/null
+++ b/QMP/qmp.py
@@ -0,0 +1,54 @@
+import socket, json
+
+class QMPError(Exception):
+ pass
+
+class QMPConnectError(QMPError):
+ pass
+
+class QEMUMonitorProtocol:
+ def connect(self):
+ self.sock.connect(self.filename)
+ data = self.__json_read()
+ if data == None:
+ raise QMPConnectError
+ if not data.has_key('QMP'):
+ raise QMPConnectError
+ return data['QMP']['capabilities']
+
+ def send(self, cmdline):
+ cmd = self.__build_cmd(cmdline)
+ self.__json_send(cmd)
+ resp = self.__json_read()
+ if resp == None:
+ return
+ elif resp.has_key('error'):
+ return resp['error']
+ else:
+ return resp['return']
+
+ def __build_cmd(self, cmdline):
+ cmdargs = cmdline.split()
+ qmpcmd = { 'execute': cmdargs[0], 'arguments': {} }
+ for arg in cmdargs[1:]:
+ opt = arg.split('=')
+ try:
+ value = int(opt[1])
+ except ValueError:
+ value = opt[1]
+ qmpcmd['arguments'][opt[0]] = value
+ return qmpcmd
+
+ def __json_send(self, cmd):
+ self.sock.send(json.dumps(cmd) + '\n')
+
+ def __json_read(self):
+ try:
+ return json.loads(self.sock.recv(1024))
+ except ValueError:
+ return
+
+ def __init__(self, filename):
+ self.filename = filename
+ self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+
--
1.6.5.3.148.g785c5
next prev parent reply other threads:[~2009-11-19 15:14 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-19 15:13 [Qemu-devel] [RFC v0 00/15] QEMU Monitor Protocol Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 01/15] monitor: Introduce MONITOR_USE_CONTROL flag Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 02/15] monitor: Command-line flag to enable control mode Luiz Capitulino
2009-11-22 18:06 ` Anthony Liguori
2009-11-19 15:13 ` [Qemu-devel] [PATCH 03/15] monitor: Move handler calling code to its own function Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 04/15] QError: Add errors used by QMP Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 05/15] QMP: chardev handling Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 06/15] QMP: Output support Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 07/15] QMP: Input support Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 08/15] QMP: Asynchronous events infrastructure Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 09/15] QMP: Introduce basic asynchronous events Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 10/15] QMP: Disable monitor print functions Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 11/15] QMP: Introduce README file Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 12/15] QMP: Introduce specification Luiz Capitulino
2009-11-19 15:13 ` [Qemu-devel] [PATCH 13/15] QMP: Introduce qmp-events.txt Luiz Capitulino
2009-11-19 15:13 ` Luiz Capitulino [this message]
2009-11-19 15:13 ` [Qemu-devel] [PATCH 15/15] QMP: Introduce vm-info Luiz Capitulino
2009-11-19 15:20 ` [Qemu-devel] Re: [RFC v0 00/15] QEMU Monitor Protocol Avi Kivity
2009-11-19 16:47 ` Luiz Capitulino
2009-11-22 9:41 ` Avi Kivity
2009-11-22 15:02 ` Luiz Capitulino
2009-11-22 16:04 ` Anthony Liguori
2009-11-23 13:07 ` Luiz Capitulino
2009-11-19 17:00 ` [Qemu-devel] " Luiz Capitulino
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1258643623-8636-15-git-send-email-lcapitulino@redhat.com \
--to=lcapitulino@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=avi@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).