vboxapi.py revision ebb33f3aef3b410579a2865109426b798b9d4a9d
b844a5645b69a09c4d6dacb9cfe96bb138cb21d4vboxsyncCopyright (C) 2009-2013 Oracle Corporation
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncThis file is part of VirtualBox Open Source Edition (OSE), as
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncavailable from http://www.virtualbox.org. This file is free software;
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncyou can redistribute it and/or modify it under the terms of the GNU
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncGeneral Public License (GPL) as published by the Free Software
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncFoundation, in version 2 as it comes in the "COPYING" file of the
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncVirtualBox OSE distribution. VirtualBox OSE is distributed in the
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsynchope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b5b8f3d0d95893edd81062c1b5d0bc455cc79bc1vboxsync# To set Python bitness on OSX use 'export VERSIONER_PYTHON_PREFER_32_BIT=yes'
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncVBoxBinDir = os.environ.get("VBOX_PROGRAM_PATH", None)
2561352ae77d8f2f825526a6cbafa34b45f16972vboxsync # Will be set by the installer
b5b8f3d0d95893edd81062c1b5d0bc455cc79bc1vboxsync # Will be set by the installer
c65e2fedaf400b449a85ae6db7b84858f2613708vboxsyncfrom VirtualBox_constants import VirtualBoxReflectionInfo
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ This class provides a wrapper over IPerformanceCollector in order to
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync get more 'pythonic' interface.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync To begin collection of metrics use setup() method.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync To get collected data use query() method.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync It is possible to disable metric collection without changing collection
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync parameters with disable() method. The enable() method resumes metric
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync collection.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Initializes the instance.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Discards all previously collected values for the specified
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync metrics, sets the period of collection and the number of retained
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync samples, enables collection.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync self.collector.setupMetrics(names, objects, period, nsamples)
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Resumes metric collection for the specified metrics.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Suspends metric collection for the specified metrics.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Retrieves collected metric values as well as some auxiliary
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync information. Returns an array of dictionaries, one dictionary per
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync metric. Each dictionary contains the following entries:
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'name': metric name
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'object': managed object this metric associated with
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'unit': unit of measurement
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'scale': divide 'values' by this number to get float numbers
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'values': collected data
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'values_as_string': pre-processed values ready for 'print' statement
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync # Get around the problem with input arrays returned in output
aaa80e9df329609078dea844a11f2611443b677avboxsync # parameters (see #3953) for MSCOM.
a7f701e8c51193f7c21137cc173ea5f86e53cac2vboxsync (values, names, objects, names_out, objects_out, units, scales, sequence_numbers,
a7f701e8c51193f7c21137cc173ea5f86e53cac2vboxsync indices, lengths) = self.collector.queryMetricsData(names, objects)
a7f701e8c51193f7c21137cc173ea5f86e53cac2vboxsync (values, names_out, objects_out, units, scales, sequence_numbers,
a7f701e8c51193f7c21137cc173ea5f86e53cac2vboxsync indices, lengths) = self.collector.queryMetricsData(names, objects)
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'values':[int(values[j]) for j in xrange(int(indices[i]), int(indices[i])+int(lengths[i]))],
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'values_as_string':'['+', '.join([fmt % (int(values[j])/scale, units[i]) for j in xrange(int(indices[i]), int(indices[i])+int(lengths[i]))])+']'
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync 'setattr' : None}
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync # try case-insensitivity workaround for class attributes (COM methods)
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync self.__class__.__dict__[attr] = self.__class__.__dict__[k]
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync return _COMForward['getattr'](self, ComifyName(attr))
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync return _COMForward['setattr'](self, ComifyName(attr), value)
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync # Class to fake access to constants in style of foo.bar.boo
08122b11035de1e54ce1e665dff7260fc548db72vboxsync self.__dict__['_depth']=parent.__dict__['_depth']+1
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync if fake != None:
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync while parent != None:
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync if name is not None:
da570ef57fe454ae2d9d5d88a7bfea214723dbb1vboxsync self.__dict__['_rootFake'] = PlatformMSCOM.ConstantFake(None, None)
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync VBOX_TLB_GUID = '{46137EEC-703B-4FE5-AFD4-7C9BBBBA0259}'
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync from win32com.client import gencache, DispatchBaseClass
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync from win32api import GetCurrentThread, GetCurrentThreadId, DuplicateHandle, GetCurrentProcess
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync handle = DuplicateHandle(pid, GetCurrentThread(), pid, 0, 0, DUPLICATE_SAME_ACCESS)
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync _COMForward['getattr'] = DispatchBaseClass.__dict__['__getattr__']
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync DispatchBaseClass.__dict__['__getattr__'] = CustomGetAttr
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync _COMForward['setattr'] = DispatchBaseClass.__dict__['__setattr__']
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync DispatchBaseClass.__dict__['__setattr__'] = CustomSetAttr
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync win32com.client.gencache.EnsureDispatch('VirtualBox.Session')
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync win32com.client.gencache.EnsureDispatch('VirtualBox.VirtualBox')
1d96c25e994a2160c1697208bb398d79ca117c4avboxsync return win32com.client.Dispatch("VirtualBox.Session")
2ea0ec406117609d51bd5ac51cbb3d4f0de9a16dvboxsync return win32com.client.Dispatch("VirtualBox.VirtualBox")
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return 'MSCOM'
b844a5645b69a09c4d6dacb9cfe96bb138cb21d4vboxsync str += " _typelib_version_ = tlb_major, tlb_minor\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync # Maybe we'd better implement Dynamic invoke policy, to be more flexible here
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " _reg_policy_spec_ = 'win32com.server.policy.EventHandlerPolicy'\n"
dafcc1aee6fa9a280e6c6d7630132e5a778f3a6fvboxsync # capitalized version of listener method
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " def __init__(self): BaseClass.__init__(self, arg)\n"
4bb0fd45b2679a58b304ba2d7bff3e19b74a447fvboxsync str += "result = win32com.server.util.wrap(ListenerImpl())\n"
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync exec (str, d, d)
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync return d['result']
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync from win32event import MsgWaitForMultipleObjects, \
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync raise TypeError("The timeout argument is not an integer")
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync raise Exception("wait for events from the same thread you inited!")
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync rc = MsgWaitForMultipleObjects(self.handles, 0, cMsTimeout, QS_ALLINPUT)
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync if rc >= WAIT_OBJECT_0 and rc < WAIT_OBJECT_0+len(self.handles):
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync # is it possible?
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync # Waiting messages
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync # check for interruption
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Basically a python implementation of EventQueue::postEvent().
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync The magic value must be in sync with the C++ implementation or this
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync won't work.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Note that because of this method we cannot easily make use of a
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync non-visible Window to handle the message like we would like to do.
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync PostThreadMessage(self.tid, WM_USER, None, 0xf241b819)
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync if h is not None:
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync sys.path.append(VBoxSdkDir+'/bindings/xpcom/python/')
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return xpcom.components.classes["@virtualbox.org/Session;1"].createInstance()
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return xpcom.components.classes["@virtualbox.org/VirtualBox;1"].createInstance()
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return 'XPCOM'
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " _com_interfaces_ = xpcom.components.interfaces.IEventListener\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " def __init__(self): BaseClass.__init__(self, arg)\n"
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync exec (str, d, d)
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync return d['result']
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync return obj.queryInterface(getattr(xpcom.components.interfaces, className))
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync sys.path.append(os.path.join(VBoxSdkDir, 'bindings', 'webservice', 'python', 'lib'))
7225c19c065cadcc51171f0ad664cc4a93303eddvboxsync #import VirtualBox_services
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync from VirtualBox_wrappers import IWebsessionManager2
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync if params is not None:
355edde34018a687b4a4d17054c378b780e3d8abvboxsync return self.connect(self.url, self.user, self.password)
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync from VirtualBox_wrappers import IWebsessionManager2
355edde34018a687b4a4d17054c378b780e3d8abvboxsync if url is None:
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync if user is None:
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync self.vbox = self.wsmgr.logon(self.user, self.password)
355edde34018a687b4a4d17054c378b780e3d8abvboxsync raise Exception("cannot connect to '"+self.url+"' as '"+self.user+"'")
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync if self.vbox is not None and self.wsmgr is not None:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return 'WEBSERVICE'
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync raise Exception("no active listeners for webservices")
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync # Webservices cannot do that yet
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync # Webservices cannot do that yet
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync str += "from VirtualBox_wrappers import "+className+"\n"
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync str += "result = "+className+"(obj.mgr, obj.handle)\n"
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync # wrong, need to test if class indeed implements this interface
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync exec (str, d, d)
ced49ddf2480e97120d7bb28cd774ab609047875vboxsync return d['result']
760ec8be64fa28d2bc7f493d707385c757a12e8evboxsync exec "self.platform = Platform"+style+"(platparams)"
760ec8be64fa28d2bc7f493d707385c757a12e8evboxsync # for webservices, enums are symbolic
760ec8be64fa28d2bc7f493d707385c757a12e8evboxsync self.constants = VirtualBoxReflectionInfo(style == "WEBSERVICE")
0c657f93ac727a3a1644497331d86fbcbc3722aavboxsync print "Installation problem: check that appropriate libs in place"
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync print "init exception: ", e
17d3bf6c92cd7b0f24800be4de3058fda764141bvboxsync def openMachineSession(self, mach, permitSharing = True):
29179bad4ddd202d265455fed7c5eae723859a8evboxsync if session is not None:
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Wait for events to arrive and process them.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync The timeout is in milliseconds. A negative value means waiting for
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync ever, while 0 does not wait at all.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Returns 0 if events was processed.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Returns 1 if timed out or interrupted in some way.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Returns 2 on error (like not supported for web services).
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync Raises an exception if the calling thread is not the main thread (the one
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync that initialized VirtualBoxManager) or if the time isn't an integer.
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync Interrupt a waitForEvents call.
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync This is normally called from a worker thread.
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync Returns True on success, False on failure.