Vinzenz Feenstra has uploaded a new change for review. Change subject: Add OS info reporting ......................................................................
Add OS info reporting Change-Id: I682fd9683cf9e4b392ecd4824e4a9526bf7e5e59 Bug-Url: https://bugzilla.redhat.com/869296 Signed-off-by: Vinzenz Feenstra <[email protected]> --- M ovirt-guest-agent/GuestAgentLinux2.py M ovirt-guest-agent/GuestAgentWin32.py M ovirt-guest-agent/OVirtAgentLogic.py A scripts/ovirt-osinfo M tests/guest_agent_test.py M tests/message_validator.py 6 files changed, 98 insertions(+), 11 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-guest-agent refs/changes/38/28938/1 diff --git a/ovirt-guest-agent/GuestAgentLinux2.py b/ovirt-guest-agent/GuestAgentLinux2.py index 2f37137..23562e0 100644 --- a/ovirt-guest-agent/GuestAgentLinux2.py +++ b/ovirt-guest-agent/GuestAgentLinux2.py @@ -220,6 +220,27 @@ def getOsVersion(self): return os.uname()[2] + def getOsInfo(self): + cmd = [_get_script_path('ovirt-osinfo')] + logging.debug('Executing ovirt-osinfo command: %s', cmd) + result = { + 'version': '', + 'distribution': '', + 'codename': '', + 'arch': '', + 'type': 'linux', + 'kernel': ''} + try: + p = subprocess.Popen(cmd, stdout=subprocess.PIPE) + for line in p.stdout.read().split('\n'): + k, v = line.split('=', 1) + if v and k in result: + result[k] = v + p.close() + except Exception: + logging.exception('ovirt-osinfo invocation failed') + return result + def getAllNetworkInterfaces(self): return self.list_nics() diff --git a/ovirt-guest-agent/GuestAgentWin32.py b/ovirt-guest-agent/GuestAgentWin32.py index 910c910..b93aa5a 100644 --- a/ovirt-guest-agent/GuestAgentWin32.py +++ b/ovirt-guest-agent/GuestAgentWin32.py @@ -16,6 +16,7 @@ import subprocess import socket from OVirtAgentLogic import AgentLogicBase, DataRetriverBase +import ctypes from ctypes import c_ulong, byref, windll, create_unicode_buffer,\ Structure, sizeof, c_void_p from ctypes.util import find_library @@ -146,27 +147,29 @@ '3.3.0': WINCE3_3_0} def getWinOsType(self): - retval = self.UNKNOWN + name = self.UNKNOWN + version = '' try: versionTupple = win32api.GetVersionEx(1) key = "%d.%d.%d" % ( versionTupple[3], versionTupple[0], versionTupple[1]) + version = '%d.%d' % versionTupple[:1] if key in self.winVersionMatrix: - retval = self.winVersionMatrix[key] + name = self.winVersionMatrix[key] # Window 7 and Window Server 2008 R2 share the same version. # Need to fix it using the wProductType field. VER_NT_WORKSTATION = 1 - if (retval == WinOsTypeHandler.WIN2008R2 and + if (name == WinOsTypeHandler.WIN2008R2 and versionTupple[8] == VER_NT_WORKSTATION): - retval = WinOsTypeHandler.WIN7 - elif (retval == WinOsTypeHandler.WIN2012 and + name = WinOsTypeHandler.WIN7 + elif (name == WinOsTypeHandler.WIN2012 and versionTupple[8] == VER_NT_WORKSTATION): - retval = WinOsTypeHandler.WIN8 - logging.debug("WinOsTypeHandler::getWinOsType osType = '%s'", - retval) + name = WinOsTypeHandler.WIN8 + logging.debug("WinOsTypeHandler::getWinOsType osType = '%s' " + "version = '%s'", name, version) except: logging.exception("getWinOsType - failed") - return retval + return {'name': name, 'version': version} class CommandHandlerWin: @@ -306,6 +309,7 @@ class WinDataRetriver(DataRetriverBase): def __init__(self): + self.arch = self._getArch() self.os = WinOsTypeHandler().getWinOsType() DataRetriverBase.__init__(self) @@ -313,7 +317,29 @@ return os.environ.get('COMPUTERNAME', '') def getOsVersion(self): - return self.os + return self.os['name'] + + def _getArch(self): + arch = 'x86' + try: + kernel32 = ctypes.windll.kernel32 + result = ctypes.c_int() + proc = kernel32.GetCurrentProcess() + if kernel32.IsWow64Process(proc, ctypes.byref(result)) == 1: + if result: + arch = 'x86_64' + except AttributeError: + pass + return arch + + def getOsInfo(self): + return { + 'version': self.os['version'], + 'distribution': '', + 'codename': self.os['name'], + 'arch': self.arch, + 'type': 'windows', + 'kernel': ''} def getAllNetworkInterfaces(self): return GetNetworkInterfaces() diff --git a/ovirt-guest-agent/OVirtAgentLogic.py b/ovirt-guest-agent/OVirtAgentLogic.py index 965d1a2..b775de8 100644 --- a/ovirt-guest-agent/OVirtAgentLogic.py +++ b/ovirt-guest-agent/OVirtAgentLogic.py @@ -51,6 +51,7 @@ 'network-interfaces': 0, 'number-of-cpus': 1, 'os-version': 0, + 'os-info': 2, 'session-lock': 0, 'session-logoff': 0, 'session-logon': 0, @@ -143,6 +144,9 @@ def getFQDN(self): return socket.getfqdn() + + def getOsInfo(self): + pass def getNumberOfCPUs(self): """ @@ -350,6 +354,7 @@ def sendInfo(self): self._send('host-name', {'name': self.dr.getMachineName()}) self._send('os-version', {'version': self.dr.getOsVersion()}) + self._send('os-info', self.dr.getOsInfo()) self._send('network-interfaces', {'interfaces': self.dr.getAllNetworkInterfaces()}) diff --git a/scripts/ovirt-osinfo b/scripts/ovirt-osinfo new file mode 100755 index 0000000..4f5d3a9 --- /dev/null +++ b/scripts/ovirt-osinfo @@ -0,0 +1,11 @@ +#!/usr/bin/python + +import platform +info = platform.linux_distribution() + +print 'distribution=%s' % info[0] +print 'version=%s' % info[1] +print 'codename=%s' % info[2] +print 'arch=%s' % platform.uname()[-1] +print 'kernel=%s' % platform.release() +print 'type=linux' diff --git a/tests/guest_agent_test.py b/tests/guest_agent_test.py index 757ec69..17f921f 100644 --- a/tests/guest_agent_test.py +++ b/tests/guest_agent_test.py @@ -69,6 +69,8 @@ def testRefresh(self): self._validator.verifyRefreshReply(self.vdsAgent) self._validator.verifyRefreshReply2(self.vdsAgent) + self._validator.verifyRefreshReply3(self.vdsAgent) + self._validator.verifyRefreshReply4(self.vdsAgent) def testSendInfo(self): self._validator.verifySendInfo(self.vdsAgent) diff --git a/tests/message_validator.py b/tests/message_validator.py index cf959c7..007274b 100644 --- a/tests/message_validator.py +++ b/tests/message_validator.py @@ -148,6 +148,18 @@ assert_integral_param(mem, 'swap_out') +def validate_os_info(msg): + assert_string_param(msg, 'version') + assert_string_param(msg, 'distribution') + assert_string_param(msg, 'codename') + assert_string_param(msg, 'arch') + assert_string_param(msg, 'type') + assert_string_param(msg, 'kernel') + assert(msg['arch']) + assert(msg['version']) + assert(msg['type']) + + def validate_timezone(msg): assertIn('zone', msg) assertIn('offset', msg) @@ -166,6 +178,7 @@ 'network-interfaces': validate_network_interfaces, 'number-of-cpus': _name_and_one_integral_param('number-of-cpus', 'count'), 'os-version': _name_and_one_str_param('os-version', 'version'), + 'os-info': validate_os_info, 'session-lock': _name_only('session-lock'), 'session-logoff': _name_only('session-logoff'), 'session-logon': _name_only('session-logon'), @@ -298,9 +311,18 @@ assert(agent.dr.getAPIVersion() == 0) @_ensure_messages('applications', 'host-name', 'os-version', 'active-user', - 'network-interfaces', 'disks-usage', 'fqdn', 'timezone') + 'network-interfaces', 'disks-usage', 'fqdn') def verifyRefreshReply3(self, agent): agent.dr.setAPIVersion(2) assert(agent.dr.getAPIVersion() == 2) agent.parseCommand('refresh', {}) assert(agent.dr.getAPIVersion() == 0) + + @_ensure_messages('applications', 'host-name', 'os-version', 'active-user', + 'network-interfaces', 'disks-usage', 'fqdn', 'timezone', + 'os-info') + def verifyRefreshReply4(self, agent): + agent.dr.setAPIVersion(2) + assert(agent.dr.getAPIVersion() == 2) + agent.parseCommand('refresh', {'apiVersion': 2}) + assert(agent.dr.getAPIVersion() == 2) -- To view, visit http://gerrit.ovirt.org/28938 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I682fd9683cf9e4b392ecd4824e4a9526bf7e5e59 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-guest-agent Gerrit-Branch: master Gerrit-Owner: Vinzenz Feenstra <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
