vboxshell.py revision 1b4b33e031eadf2a18888135f1ecf003b5b8ed03
#
# Copyright (C) 2009 Sun Microsystems, Inc.
#
# This file is part of VirtualBox Open Source Edition (OSE), as
# available from http://www.virtualbox.org. This file is free software;
# General Public License (GPL) as published by the Free Software
# Foundation, in version 2 as it comes in the "COPYING" file of the
# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
# Clara, CA 95054 USA or visit http://www.sun.com if you need
# additional information or have any questions.
#
#
#################################################################################
# This program is a simple interactive shell for VirtualBox. You can query #
# information and issue commands from a simple command line. #
# #
# It also provides you with examples on how to use VirtualBox's Python API. #
# This shell is even somewhat documented and supports TAB-completion and #
# history if you have Python readline installed. #
# #
# Enjoy. #
################################################################################
import traceback
class PerfCollector:
""" This class provides a wrapper over IPerformanceCollector in order to
get more 'pythonic' interface.
To begin collection of metrics use setup() method.
To get collected data use query() method.
It is possible to disable metric collection without changing collection
parameters with disable() method. The enable() method resumes metric
collection.
"""
""" Initializes the instance.
Pass an instance of IVirtualBox as parameter.
"""
""" Discards all previously collected values for the specified
metrics, sets the period of collection and the number of retained
samples, enables collection.
"""
""" Resumes metric collection for the specified metrics.
"""
""" Suspends metric collection for the specified metrics.
"""
""" Retrieves collected metric values as well as some auxiliary
information. Returns an array of dictionaries, one dictionary per
metric. Each dictionary contains the following entries:
'name': metric name
'object': managed object this metric associated with
'unit': unit of measurement
'scale': divide 'values' by this number to get float numbers
'values': collected data
'values_as_string': pre-processed values ready for 'print' statement
"""
out = []
if scale != 1:
fmt = '%.2f%s'
else:
fmt = '%d %s'
'scale':scale,
'values_as_string':'['+', '.join([fmt % (int(values[j])/scale, units[i]) for j in xrange(int(indices[i]), int(indices[i])+int(lengths[i]))])+']'
})
return out
# Simple implementation of IConsoleCallback, one can use it as skeleton
# for custom implementations
class GuestMonitor:
def onAdditionsStateChange(self):
def onDVDDriveChange(self):
def onFloppyDriveChange(self):
def onVRDPServerChange(self):
def onUSBControllerChange(self):
def onCanShowWindow(self):
return True
class VBoxMonitor:
pass
print "onMachineDataChange: %s" %(id)
return True
print "onMediaRegistred: %s" %(id)
print "onMachineRegistred: %s" %(id)
print "onGuestPropertyChange: %s" %(id)
g_hasreadline = 1
try:
import readline
import rlcompleter
except:
g_hasreadline = 0
if g_hasreadline:
"""
taken from:
"""
if text == "":
return ['\t',None][state]
else:
"""
Compute matches when text is a simple name.
Return a list of all names currently defined
in self.namespace that match.
"""
matches = []
try:
# although it has autoconversion, we need to cast
# explicitly for subscripts to work
except Exception,e:
print e
return matches
if not g_hasreadline:
return
comps = {}
comps[k] = None
def split_no_quotes(s):
return s.split()
"00000000-0000-0000-0000-000000000000")
for d in mach.getHardDiskAttachments():
if mach:
if rc == 0:
# we ignore exceptions to allow starting VM even if
# perf collector cannot be started
if perf:
try:
except Exception,e:
print e
if g_verbose:
pass
# if session not opened, close doesn't make sense
else:
# Not yet implemented error string query API for remote API
if not ctx['remote']:
def getMachines(ctx):
if var:
return 'on'
else:
return 'off'
if not ctx['perf']:
return
exec cmds
import time
if dur == -1:
# not infinity, but close enough
dur = 100000
try:
# We need to catch all exceptions here, otherwise callback will never be unregistered
except:
pass
import time
if dur == -1:
# not infinity, but close enough
dur = 100000
try:
# We need to catch all exceptions here, otherwise callback will never be unregistered
except Exception,e:
print e
if g_verbose:
pass
try:
except Exception,e:
if g_verbose:
return
return
# unfortunately IGuest is suppressed, thus WebServices knows not about it
# this is an example how to handle local only functionality
print 'Trying to use local only functionality, ignored'
return
}
try:
except Exception, e:
print 'failed: ',e
if g_verbose:
# can cache known machines, if needed
mach = None
for m in getMachines(ctx):
mach = m
break
mach = m
break
return mach
return None
if m == None:
print "Machine '%s' is unknown, use list command to find available machines" %(id)
return m
print "Help page:"
for i in commands:
else:
if c == None:
else:
return 0
for m in getMachines(ctx):
return 0
print "usage: info [vmname|uuid]"
return 0
if mach == None:
return 0
return 0
if mach == None:
return 0
else:
type = "gui"
return 0
print "usage: create name ostype <basefolder>"
return 0
else:
base = ''
try:
except Exception, e:
print 'Unknown OS type:',oskind
return 0
return 0
if mach == None:
return 0
return 0
if mach == None:
return 0
return 0
if mach == None:
return 0
return 0
if mach == None:
return 0
return 0
if mach == None:
return 0
return 0
print "usage: guest name commands"
return 0
if mach == None:
return 0
return 0
print "usage: setvar [vmname|uuid] expr value"
return 0
if mach == None:
return 0
print "Executing",expr
try:
exec expr
except Exception, e:
print 'failed: ',e
if g_verbose:
return 0
return 1
print "'%s' is an alias for '%s'" %(k,v)
return 0
global g_verbose
return 0
print "Processor count:",cnt
if ctx['perf']:
return 0
print "usage: monitorGuest name (duration)"
return 0
if mach == None:
return 0
dur = 5
return 0
print "usage: monitorVbox (duration)"
return 0
dur = 5
return 0
try:
exec expr
except Exception, e:
print 'failed: ',e
if g_verbose:
return 0
'i':'info',
'l':'list',
'h':'help',
'a':'aliases',
'q':'quit', 'exit':'quit',
'v':'verbose'}
'eval':['Evaluate arbitrary Python construction: eval for m in getMachines(ctx): print m.name,"has",m.memorySize,"M"', evalCmd],
'guest':['Execute command for guest: guest Win32 console.mouse.putMouseEvent(20, 20, 0, 0)', guestCmd],
'monitorGuest':['Monitor what happens with the guest for some time: monitorGuest Win32 10', monitorGuestCmd],
'monitorVbox':['Monitor what happens with Virtual Box for some time: monitorVbox 10', monitorVboxCmd],
}
c = args[0]
c = aliases[c]
if ci == None:
print "Unknown command: '%s', type 'help' for list of known commands" %(c)
return 0
# to allow to print actual host information, we collect info for
# last 150 secs maximum, (sample every 10 secs and keep up to 15 samples)
if ctx['perf']:
try:
except:
pass
while True:
try:
if done != 0: break
except KeyboardInterrupt:
print '====== You can type quit or q to leave'
break
except EOFError:
break;
except Exception,e:
print e
if g_verbose:
try:
# There is no need to disable metric collection. This is just an example.
if ct['perf']:
except:
pass
from vboxapi import VirtualBoxManager
style = None
style = "WEBSERVICE"
}
if __name__ == '__main__':