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

Reply via email to