qmp_client/README

77 lines
2.4 KiB
Plaintext

== qmp_client
This library interfaces with a running QEMU process using the QMP protocol. It
also works with the QEMU-KVM branch.
To get a QMP socket for a QEMU process, use one of these command-line arguments:
-qmp tcp:[host]:port[,server][,nowait][,nodelay]
-qmp unix:path[,server][,nowait]
-qmp stdio
-qmp pipe:filename
The QMP protocol is still evolving, and the kinds of things you can do with it
are changing with each release. It's also currently (QEMU 0.15) impossible to
set every option available on the command line via the QMP console. However,
there are plans to make that possible, and this library will track the features
available from the server as closely as possible.
Usage example:
QMPClient::connect_tcp("127.0.0.1", 4440) do |api|
api.on_event('BLOCK_IO_ERROR') do |e|
puts "Block I/O error detected: #{e.inspect}"
end
msg = api.sync_query("status") # Blocks until a response comes back
puts "VM status: #{m.inspect}"
api.command('eject', 'device' => 'ide1-cd0') {|m| puts "CDROM ejected" }
api.query("status") {|m| puts "VM status now: #{m.inspect}" }
api.wait # Blocks until no commands or queries are outstanding.
api.command('quit') # Specifying a callback is optional
end
You can also do this perfectly safely:
stopq = Queue.new
api_outer = nil
Thread.new do
QMPClient::connect_tcp("127.0.0.1", 4440) do |api_inner|
api = api_inner
stopq.pop
end
end
sleep(0.1) while api_outer.nil?
# do stuff with the api object
stopq.push(:ok)
Or, indeed, this:
QMPClient::connect_tcp("127.0.0.1", 4440) do |api|
Thread.new { }.join # use the API object in here
end
Callbacks are run on a thread pool; if an exception is raised on one of those
threads, the process aborts. The default thread pool size is 10. Both of these
things will be made configurable later.
More information about QMP can be found at the following locations:
http://wiki.qemu.org/QMP
http://wiki.qemu.org/Features/QAPI
Patches to fix bugs or support new functionality are welcome. To submit a patch
or report a bug, go to http://github.com/lupine/qmp_client - follow the usual
fork, commit fixes and tests, send pull request procedure for github.
The aim is to be compatible with Ruby 1.8.7 and 1.9.3 as implemented by MRI,
Rubinius and JRuby - tests and fixes to that aim are especially welcomed.
See LICENSE for copyright details.
- Nick Thomas <nick@lupine.me.uk>