Changeset 20332 in vbox
- Timestamp:
- Jun 5, 2009 1:32:27 PM (16 years ago)
- Location:
- trunk/src/VBox
- Files:
-
- 1 deleted
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VBoxShell/Makefile.kmk
r19962 r20332 26 26 VBoxShell_INST = $(INST_SDK)/bindings 27 27 VBoxShell_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 30 29 31 30 include $(KBUILD_PATH)/subfooter.kmk -
trunk/src/VBox/Frontends/VBoxShell/vboxshell.py
r19859 r20332 30 30 import traceback 31 31 32 class 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 99 g_hasreadline = 1 100 try: 101 import readline 102 import rlcompleter 103 except: 104 g_hasreadline = 0 105 106 107 if 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 158 def 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 169 g_verbose = True 170 171 def split_no_quotes(s): 172 return s.split() 173 174 def 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 183 def 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 197 def 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 226 def getMachines(ctx): 227 return ctx['global'].getArray(ctx['vb'], 'machines') 228 229 def asState(var): 230 if var: 231 return 'on' 232 else: 233 return 'off' 234 235 def 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 241 def guestExec(ctx, machine, console, cmds): 242 exec cmds 243 244 def 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 281 def 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 295 def 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 305 def 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 318 def 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 323 def 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 347 def 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 358 def 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 376 def removeCmd(ctx, args): 377 mach = argsToMach(ctx,args) 378 if mach == None: 379 return 0 380 removeVm(ctx, mach) 381 return 0 382 383 def pauseCmd(ctx, args): 384 mach = argsToMach(ctx,args) 385 if mach == None: 386 return 0 387 cmdExistingVm(ctx, mach, 'pause', '') 388 return 0 389 390 def powerdownCmd(ctx, args): 391 mach = argsToMach(ctx,args) 392 if mach == None: 393 return 0 394 cmdExistingVm(ctx, mach, 'powerdown', '') 395 return 0 396 397 def resumeCmd(ctx, args): 398 mach = argsToMach(ctx,args) 399 if mach == None: 400 return 0 401 cmdExistingVm(ctx, mach, 'resume', '') 402 return 0 403 404 def statsCmd(ctx, args): 405 mach = argsToMach(ctx,args) 406 if mach == None: 407 return 0 408 cmdExistingVm(ctx, mach, 'stats', '') 409 return 0 410 411 def 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 421 def 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 443 def quitCmd(ctx, args): 444 return 1 445 446 def aliasesCmd(ctx, args): 447 for (k,v) in aliases.items(): 448 print "'%s' is an alias for '%s'" %(k,v) 449 return 0 450 451 def verboseCmd(ctx, args): 452 global g_verbose 453 g_verbose = not g_verbose 454 return 0 455 456 def 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 470 def 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 480 aliases = {'s':'start', 481 'i':'info', 482 'l':'list', 483 'h':'help', 484 'a':'aliases', 485 'q':'quit', 'exit':'quit', 486 'v':'verbose'} 487 488 commands = {'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 507 def 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 521 def 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 32 559 from vboxapi import VirtualBoxManager 33 from shellcommon import interpret34 560 35 561 def main(argv): -
trunk/src/VBox/Installer/linux/Makefile.kmk
r20310 r20332 68 68 linux-bin_SOURCES = \ 69 69 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,) 71 72 72 73 INSTALLS += linux-misc … … 142 143 components/VBoxXPCOMBase.xpt \ 143 144 components/VirtualBox_XPCOM.xpt) \ 145 $(if $(VBOX_WITH_PYTHON),vboxshell.py,) \ 144 146 VBoxSysInfo.sh \ 145 147 VBox.sh \ -
trunk/src/VBox/Installer/solaris/Makefile.kmk
r20314 r20332 103 103 PROGRAMS += VBoxZoneAccess VBoxISAExec 104 104 INSTALLS += solaris-doc 105 106 INSTALLS += solaris-bin 107 solaris-bin_INST = bin/ 108 solaris-bin_MODE = a+rx,u+w 109 solaris-bin_SOURCES = \ 110 $(if $(VBOX_WITH_PYTHON),$(PATH_ROOT)/src/VBox/Frontends/VBoxShell/vboxshell.py=>vboxshell.py,) 105 111 106 112 BLDDIRS += \ … … 234 240 components/VBoxXPCOMBase.xpt \ 235 241 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,) 237 244 238 245 SOLARIS_USRBIN_LINKS = \
Note:
See TracChangeset
for help on using the changeset viewer.