VirtualBox

Changeset 20332 in vbox


Ignore:
Timestamp:
Jun 5, 2009 1:32:27 PM (16 years ago)
Author:
vboxsync
Message:

Python: include vboxshell into binary distribution

Location:
trunk/src/VBox
Files:
1 deleted
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxShell/Makefile.kmk

    r19962 r20332  
    2626VBoxShell_INST = $(INST_SDK)/bindings
    2727VBoxShell_SOURCES = \
    28         vboxshell.py=>glue/python/sample/vboxshell.py \
    29         shellcommon.py=>glue/python/sample/shellcommon.py
     28        vboxshell.py=>glue/python/sample/vboxshell.py
    3029
    3130include $(KBUILD_PATH)/subfooter.kmk
  • trunk/src/VBox/Frontends/VBoxShell/vboxshell.py

    r19859 r20332  
    3030import traceback
    3131
     32class PerfCollector:
     33    """ This class provides a wrapper over IPerformanceCollector in order to
     34    get more 'pythonic' interface.
     35
     36    To begin collection of metrics use setup() method.
     37
     38    To get collected data use query() method.
     39
     40    It is possible to disable metric collection without changing collection
     41    parameters with disable() method. The enable() method resumes metric
     42    collection.
     43    """
     44
     45    def __init__(self, vb):
     46        """ Initializes the instance.
     47
     48        Pass an instance of IVirtualBox as parameter.
     49        """
     50        self.collector = vb.performanceCollector
     51
     52    def setup(self, names, objects, period, nsamples):
     53        """ Discards all previously collected values for the specified
     54        metrics, sets the period of collection and the number of retained
     55        samples, enables collection.
     56        """
     57        self.collector.setupMetrics(names, objects, period, nsamples)
     58
     59    def enable(self, names, objects):
     60        """ Resumes metric collection for the specified metrics.
     61        """
     62        self.collector.enableMetrics(names, objects)
     63
     64    def disable(self, names, objects):
     65        """ Suspends metric collection for the specified metrics.
     66        """
     67        self.collector.disableMetrics(names, objects)
     68
     69    def query(self, names, objects):
     70        """ Retrieves collected metric values as well as some auxiliary
     71        information. Returns an array of dictionaries, one dictionary per
     72        metric. Each dictionary contains the following entries:
     73        'name': metric name
     74        'object': managed object this metric associated with
     75        'unit': unit of measurement
     76        'scale': divide 'values' by this number to get float numbers
     77        'values': collected data
     78        'values_as_string': pre-processed values ready for 'print' statement
     79        """
     80        (values, names_out, objects_out, units, scales, sequence_numbers,
     81            indices, lengths) = self.collector.queryMetricsData(names, objects)
     82        out = []
     83        for i in xrange(0, len(names_out)):
     84            scale = int(scales[i])
     85            if scale != 1:
     86                fmt = '%.2f%s'
     87            else:
     88                fmt = '%d %s'
     89            out.append({
     90                'name':str(names_out[i]),
     91                'object':str(objects_out[i]),
     92                'unit':str(units[i]),
     93                'scale':scale,
     94                'values':[int(values[j]) for j in xrange(int(indices[i]), int(indices[i])+int(lengths[i]))],
     95                'values_as_string':'['+', '.join([fmt % (int(values[j])/scale, units[i]) for j in xrange(int(indices[i]), int(indices[i])+int(lengths[i]))])+']'
     96            })
     97        return out
     98
     99g_hasreadline = 1
     100try:
     101    import readline
     102    import rlcompleter
     103except:
     104    g_hasreadline = 0
     105
     106
     107if g_hasreadline:
     108  class CompleterNG(rlcompleter.Completer):
     109    def __init__(self, dic, ctx):
     110        self.ctx = ctx
     111        return rlcompleter.Completer.__init__(self,dic)
     112
     113    def complete(self, text, state):
     114        """
     115        taken from:
     116        http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496812
     117        """
     118        if text == "":
     119            return ['\t',None][state]
     120        else:
     121            return rlcompleter.Completer.complete(self,text,state)
     122
     123    def global_matches(self, text):
     124        """
     125        Compute matches when text is a simple name.
     126        Return a list of all names currently defined
     127        in self.namespace that match.
     128        """
     129
     130        matches = []
     131        n = len(text)
     132
     133        for list in [ self.namespace ]:
     134            for word in list:
     135                if word[:n] == text:
     136                    matches.append(word)
     137
     138
     139        try:
     140            for m in getMachines(self.ctx):
     141                # although it has autoconversion, we need to cast
     142                # explicitly for subscripts to work
     143                word = str(m.name)
     144                if word[:n] == text:
     145                    matches.append(word)
     146                word = str(m.id)
     147                if word[0] == '{':
     148                    word = word[1:-1]
     149                if word[:n] == text:
     150                    matches.append(word)
     151        except Exception,e:
     152            traceback.print_exc()
     153            print e
     154
     155        return matches
     156
     157
     158def autoCompletion(commands, ctx):
     159  if  not g_hasreadline:
     160      return
     161
     162  comps = {}
     163  for (k,v) in commands.items():
     164      comps[k] = None
     165  completer = CompleterNG(comps, ctx)
     166  readline.set_completer(completer.complete)
     167  readline.parse_and_bind("tab: complete")
     168
     169g_verbose = True
     170
     171def split_no_quotes(s):
     172   return s.split()
     173
     174def createVm(ctx,name,kind,base):
     175    mgr = ctx['mgr']
     176    vb = ctx['vb']
     177    mach = vb.createMachine(name, kind, base,
     178                            "00000000-0000-0000-0000-000000000000")
     179    mach.saveSettings()
     180    print "created machine with UUID",mach.id
     181    vb.registerMachine(mach)
     182
     183def removeVm(ctx,mach):
     184    mgr = ctx['mgr']
     185    vb = ctx['vb']
     186    id = mach.id
     187    print "removing machine ",mach.name,"with UUID",id
     188    session = ctx['global'].openMachineSession(id)
     189    mach=session.machine
     190    for d in mach.getHardDiskAttachments():
     191        mach.detachHardDisk(d.controller, d.port, d.device)
     192    ctx['global'].closeMachineSession(session)
     193    mach = vb.unregisterMachine(id)
     194    if mach:
     195         mach.deleteSettings()
     196
     197def startVm(ctx,mach,type):
     198    mgr = ctx['mgr']
     199    vb = ctx['vb']
     200    perf = ctx['perf']
     201    session = mgr.getSessionObject(vb)
     202    uuid = mach.id
     203    progress = vb.openRemoteSession(session, uuid, type, "")
     204    progress.waitForCompletion(-1)
     205    completed = progress.completed
     206    rc = int(progress.resultCode)
     207    print "Completed:", completed, "rc:",hex(rc&0xffffffff)
     208    if rc == 0:
     209        # we ignore exceptions to allow starting VM even if
     210        # perf collector cannot be started
     211        if perf:
     212          try:
     213            perf.setup(['*'], [mach], 10, 15)
     214          except Exception,e:
     215            print e
     216            if g_verbose:
     217                traceback.print_exc()
     218            pass
     219         # if session not opened, close doesn't make sense
     220        session.close()
     221    else:
     222        # Not yet implemented error string query API for remote API
     223        if not ctx['remote']:
     224            print session.QueryErrorObject(rc)
     225
     226def getMachines(ctx):
     227    return ctx['global'].getArray(ctx['vb'], 'machines')
     228
     229def asState(var):
     230    if var:
     231        return 'on'
     232    else:
     233        return 'off'
     234
     235def guestStats(ctx,mach):
     236    if not ctx['perf']:
     237        return
     238    for metric in ctx['perf'].query(["*"], [mach]):
     239        print metric['name'], metric['values_as_string']
     240
     241def guestExec(ctx, machine, console, cmds):
     242    exec cmds
     243
     244def cmdExistingVm(ctx,mach,cmd,args):
     245    mgr=ctx['mgr']
     246    vb=ctx['vb']
     247    session = mgr.getSessionObject(vb)
     248    uuid = mach.id
     249    try:
     250        progress = vb.openExistingSession(session, uuid)
     251    except Exception,e:
     252        print "Session to '%s' not open: %s" %(mach.name,e)
     253        if g_verbose:
     254            traceback.print_exc()
     255        return
     256    if session.state != ctx['ifaces'].SessionState_Open:
     257        print "Session to '%s' in wrong state: %s" %(mach.name, session.state)
     258        return
     259    # unfortunately IGuest is suppressed, thus WebServices knows not about it
     260    # this is an example how to handle local only functionality
     261    if ctx['remote'] and cmd == 'stats2':
     262        print 'Trying to use local only functionality, ignored'
     263        return
     264    console=session.console   
     265    ops={'pause' :     lambda: console.pause(),
     266         'resume':     lambda: console.resume(),
     267         'powerdown':  lambda: console.powerDown(),
     268         'stats':      lambda: guestStats(ctx, mach),
     269         'guest':      lambda: guestExec(ctx, mach, console, args)
     270         }
     271    try:
     272        ops[cmd]()
     273    except Exception, e:
     274        print 'failed: ',e
     275        if g_verbose:
     276            traceback.print_exc()
     277
     278    session.close()
     279
     280# can cache known machines, if needed
     281def machById(ctx,id):
     282    mach = None
     283    for m in getMachines(ctx):
     284        if m.name == id:
     285            mach = m
     286            break
     287        mid = str(m.id)
     288        if mid[0] == '{':
     289            mid = mid[1:-1]
     290        if mid == id:
     291            mach = m
     292            break
     293    return mach
     294
     295def argsToMach(ctx,args):
     296    if len(args) < 2:
     297        print "usage: %s [vmname|uuid]" %(args[0])
     298        return None
     299    id = args[1]
     300    m = machById(ctx, id)
     301    if m == None:
     302        print "Machine '%s' is unknown, use list command to find available machines" %(id)
     303    return m
     304
     305def helpCmd(ctx, args):
     306    if len(args) == 1:
     307        print "Help page:"
     308        for i in commands:
     309            print "   ",i,":", commands[i][0]
     310    else:
     311        c = commands.get(args[1], None)
     312        if c == None:
     313            print "Command '%s' not known" %(args[1])
     314        else:
     315            print "   ",args[1],":", c[0]
     316    return 0
     317
     318def listCmd(ctx, args):
     319    for m in getMachines(ctx):
     320        print "Machine '%s' [%s], state=%s" %(m.name,m.id,m.sessionState)
     321    return 0
     322
     323def infoCmd(ctx,args):
     324    if (len(args) < 2):
     325        print "usage: info [vmname|uuid]"
     326        return 0
     327    mach = argsToMach(ctx,args)
     328    if mach == None:
     329        return 0
     330    os = ctx['vb'].getGuestOSType(mach.OSTypeId)
     331    print "  Name: ",mach.name
     332    print "  ID: ",mach.id
     333    print "  OS Type: ",os.description
     334    print "  RAM:  %dM" %(mach.memorySize)
     335    print "  VRAM:  %dM" %(mach.VRAMSize)
     336    print "  Clipboard mode:  %d" %(mach.clipboardMode)
     337    print "  Machine status: " ,mach.sessionState
     338    bios = mach.BIOSSettings
     339    print "  BIOS ACPI: ",bios.ACPIEnabled
     340    print "  PAE: ",mach.PAEEnabled
     341    print "  Hardware virtualization: ",asState(mach.HWVirtExEnabled)
     342    print "  Nested paging: ",asState(mach.HWVirtExNestedPagingEnabled)
     343    print "  Last changed: ",mach.lastStateChange
     344
     345    return 0
     346
     347def startCmd(ctx, args):
     348    mach = argsToMach(ctx,args)
     349    if mach == None:
     350        return 0
     351    if len(args) > 2:
     352        type = args[2]
     353    else:
     354        type = "gui"
     355    startVm(ctx, mach, type)
     356    return 0
     357
     358def createCmd(ctx, args):
     359    if (len(args) < 3 or len(args) > 4):
     360        print "usage: create name ostype <basefolder>"
     361        return 0
     362    name = args[1]
     363    oskind = args[2]
     364    if len(args) == 4:
     365        base = args[3]
     366    else:
     367        base = ''
     368    try:
     369         ctx['vb'].getGuestOSType(oskind)
     370    except Exception, e:
     371        print 'Unknown OS type:',oskind
     372        return 0
     373    createVm(ctx, name, oskind, base)
     374    return 0
     375
     376def removeCmd(ctx, args):
     377    mach = argsToMach(ctx,args)
     378    if mach == None:
     379        return 0
     380    removeVm(ctx, mach)
     381    return 0
     382
     383def pauseCmd(ctx, args):
     384    mach = argsToMach(ctx,args)
     385    if mach == None:
     386        return 0
     387    cmdExistingVm(ctx, mach, 'pause', '')
     388    return 0
     389
     390def powerdownCmd(ctx, args):
     391    mach = argsToMach(ctx,args)
     392    if mach == None:
     393        return 0
     394    cmdExistingVm(ctx, mach, 'powerdown', '')
     395    return 0
     396
     397def resumeCmd(ctx, args):
     398    mach = argsToMach(ctx,args)
     399    if mach == None:
     400        return 0
     401    cmdExistingVm(ctx, mach, 'resume', '')
     402    return 0
     403
     404def statsCmd(ctx, args):
     405    mach = argsToMach(ctx,args)
     406    if mach == None:
     407        return 0
     408    cmdExistingVm(ctx, mach, 'stats', '')
     409    return 0
     410
     411def guestCmd(ctx, args):
     412    if (len(args) < 3):
     413        print "usage: guest name commands"
     414        return 0
     415    mach = argsToMach(ctx,args)
     416    if mach == None:
     417        return 0
     418    cmdExistingVm(ctx, mach, 'guest', ' '.join(args[2:]))
     419    return 0
     420
     421def setvarCmd(ctx, args):
     422    if (len(args) < 4):
     423        print "usage: setvar [vmname|uuid] expr value"
     424        return 0
     425    mach = argsToMach(ctx,args)
     426    if mach == None:
     427        return 0
     428    session = ctx['mgr'].getSessionObject(vbox)
     429    vbox.openSession(session, mach.id)
     430    mach = session.machine
     431    expr = 'mach.'+args[2]+' = '+args[3]
     432    print "Executing",expr
     433    try:
     434        exec expr
     435    except Exception, e:
     436        print 'failed: ',e
     437        if g_verbose:
     438            traceback.print_exc()
     439    mach.saveSettings()
     440    session.close()
     441    return 0
     442
     443def quitCmd(ctx, args):
     444    return 1
     445
     446def aliasesCmd(ctx, args):
     447    for (k,v) in aliases.items():
     448        print "'%s' is an alias for '%s'" %(k,v)
     449    return 0
     450
     451def verboseCmd(ctx, args):
     452    global g_verbose
     453    g_verbose = not g_verbose
     454    return 0
     455
     456def hostCmd(ctx, args):
     457   host = ctx['vb'].host
     458   cnt = host.processorCount
     459   print "Processor count:",cnt
     460   for i in range(0,cnt):
     461      print "Processor #%d speed: %dMHz" %(i,host.getProcessorSpeed(i))
     462
     463   if ctx['perf']:
     464     for metric in ctx['perf'].query(["*"], [host]):
     465       print metric['name'], metric['values_as_string']
     466
     467   return 0
     468
     469
     470def evalCmd(ctx, args):
     471   expr = ' '.join(args[1:])
     472   try:
     473        exec expr
     474   except Exception, e:
     475        print 'failed: ',e
     476        if g_verbose:
     477            traceback.print_exc()
     478   return 0
     479
     480aliases = {'s':'start',
     481           'i':'info',
     482           'l':'list',
     483           'h':'help',
     484           'a':'aliases',
     485           'q':'quit', 'exit':'quit',
     486           'v':'verbose'}
     487
     488commands = {'help':['Prints help information', helpCmd],
     489            'start':['Start virtual machine by name or uuid', startCmd],
     490            'create':['Create virtual machine', createCmd],
     491            'remove':['Remove virtual machine', removeCmd],
     492            'pause':['Pause virtual machine', pauseCmd],
     493            'resume':['Resume virtual machine', resumeCmd],
     494            'stats':['Stats for virtual machine', statsCmd],
     495            'powerdown':['Power down virtual machine', powerdownCmd],
     496            'list':['Shows known virtual machines', listCmd],
     497            'info':['Shows info on machine', infoCmd],
     498            'aliases':['Shows aliases', aliasesCmd],
     499            'verbose':['Toggle verbosity', verboseCmd],
     500            'setvar':['Set VMs variable: setvar Fedora BIOSSettings.ACPIEnabled True', setvarCmd],
     501            'eval':['Evaluate arbitrary Python construction: eval for m in getMachines(ctx): print m.name,"has",m.memorySize,"M"', evalCmd],
     502            'quit':['Exits', quitCmd],
     503            'host':['Show host information', hostCmd],
     504            'guest':['Execute command for guest: guest Win32 console.mouse.putMouseEvent(20, 20, 0, 0)', guestCmd],
     505            }
     506
     507def runCommand(ctx, cmd):
     508    if len(cmd) == 0: return 0
     509    args = split_no_quotes(cmd)
     510    if len(args) == 0: return 0
     511    c = args[0]
     512    if aliases.get(c, None) != None:
     513        c = aliases[c]
     514    ci = commands.get(c,None)
     515    if ci == None:
     516        print "Unknown command: '%s', type 'help' for list of known commands" %(c)
     517        return 0
     518    return ci[1](ctx, args)
     519
     520
     521def interpret(ctx):
     522    vbox = ctx['vb']
     523    print "Running VirtualBox version %s" %(vbox.version)
     524    ctx['perf'] = PerfCollector(vbox)
     525
     526    autoCompletion(commands, ctx)
     527
     528    # to allow to print actual host information, we collect info for
     529    # last 150 secs maximum, (sample every 10 secs and keep up to 15 samples)
     530    if ctx['perf']:
     531      try:
     532        ctx['perf'].setup(['*'], [vbox.host], 10, 15)
     533      except:
     534        pass
     535
     536    while True:
     537        try:
     538            cmd = raw_input("vbox> ")
     539            done = runCommand(ctx, cmd)
     540            if done != 0: break
     541        except KeyboardInterrupt:
     542            print '====== You can type quit or q to leave'
     543            break
     544        except EOFError:
     545            break;
     546        except Exception,e:
     547            print e
     548            if g_verbose:
     549                traceback.print_exc()
     550
     551    try:
     552        # There is no need to disable metric collection. This is just an example.
     553        if ct['perf']:
     554           ctx['perf'].disable(['*'], [vbox.host])
     555    except:
     556        pass
     557
     558
    32559from vboxapi import VirtualBoxManager
    33 from shellcommon import interpret
    34560
    35561def main(argv):   
  • trunk/src/VBox/Installer/linux/Makefile.kmk

    r20310 r20332  
    6868linux-bin_SOURCES = \
    6969        VBoxSysInfo.sh \
    70         VBox.sh=>VBox.sh
     70        VBox.sh=>VBox.sh \
     71        $(if $(VBOX_WITH_PYTHON),$(PATH_ROOT)/src/VBox/Frontends/VBoxShell/vboxshell.py=>vboxshell.py,)
    7172
    7273INSTALLS += linux-misc
     
    142143          components/VBoxXPCOMBase.xpt \
    143144          components/VirtualBox_XPCOM.xpt) \
     145        $(if $(VBOX_WITH_PYTHON),vboxshell.py,) \
    144146        VBoxSysInfo.sh \
    145147        VBox.sh \
  • trunk/src/VBox/Installer/solaris/Makefile.kmk

    r20314 r20332  
    103103PROGRAMS         += VBoxZoneAccess VBoxISAExec
    104104INSTALLS         += solaris-doc
     105
     106INSTALLS += solaris-bin
     107solaris-bin_INST = bin/
     108solaris-bin_MODE = a+rx,u+w
     109solaris-bin_SOURCES = \
     110        $(if $(VBOX_WITH_PYTHON),$(PATH_ROOT)/src/VBox/Frontends/VBoxShell/vboxshell.py=>vboxshell.py,)
    105111
    106112BLDDIRS          += \
     
    234240        components/VBoxXPCOMBase.xpt \
    235241        components/VirtualBox_XPCOM.xpt \
    236         $(if $(and $(VBOX_LICENSE_FILES),$(VBOX_WITH_QTGUI)),$(VBOX_LICENSE_FILES))
     242        $(if $(and $(VBOX_LICENSE_FILES),$(VBOX_WITH_QTGUI)),$(VBOX_LICENSE_FILES)) \
     243        $(if $(VBOX_WITH_PYTHON),vboxshell.py,)
    237244
    238245SOLARIS_USRBIN_LINKS = \
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette