Browse Source

AMBARI-7795. Host check process not showing any package warnings on Ubuntu12 (aonishuk)

Andrew Onishuk 11 năm trước cách đây
mục cha
commit
80f2e82e3e

+ 33 - 16
ambari-agent/src/main/python/ambari_agent/PackagesAnalyzer.py

@@ -25,6 +25,10 @@ import shell
 import subprocess
 from threading import Thread
 import threading
+from ambari_commons import OSCheck, OSConst, Firewall
+
+LIST_INSTALLED_PACKAGES_UBUNTU = "for i in $(dpkg -l |grep ^ii |awk -F' ' '{print $2}'); do      apt-cache showpkg \"$i\"|head -3|grep -v '^Versions'| tr -d '()' | awk '{ print $1\" \"$2 }'|sed -e 's/^Package: //;' | paste -d ' ' - -;  done"
+LIST_AVAILABLE_PACKAGES_UBUNTU = "packages=`for  i in $(ls -1 /var/lib/apt/lists  | grep -v \"ubuntu.com\") ; do grep ^Package: /var/lib/apt/lists/$i |  awk '{print $2}' ; done` ; for i in $packages; do      apt-cache showpkg \"$i\"|head -3|grep -v '^Versions'| tr -d '()' | awk '{ print $1\" \"$2 }'|sed -e 's/^Package: //;' | paste -d ' ' - -;  done"
 
 logger = logging.getLogger()
 
@@ -35,7 +39,8 @@ class PackagesAnalyzer:
   event = threading.Event()
 
   def launch_subprocess(self, command):
-    return subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    isShell = not isinstance(command, (list, tuple))
+    return subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=isShell)
 
   def watchdog_func(self, command):
     self.event.wait(self.TIMEOUT_SECONDS)
@@ -69,39 +74,51 @@ class PackagesAnalyzer:
       if item[0].find(pkgName) == 0:
         installedPkgs.append(item[0])
 
-  def hasZypper(self):
-    try:
-      result = self.subprocessWithTimeout(["which", "zypper"])
-      if 0 == result['retCode']:
-        return True
-      else:
-        return False
-    except:
-      pass
-
   # All installed packages in systems supporting yum
   def allInstalledPackages(self, allInstalledPackages):
-    if self.hasZypper():
+    osType = OSCheck.get_os_family()
+    
+    if osType == OSConst.SUSE_FAMILY:
       return self.lookUpZypperPackages(
         ["zypper", "search", "--installed-only", "--details"],
         allInstalledPackages)
-    else:
+    elif osType == OSConst.REDHAT_FAMILY:
       return self.lookUpYumPackages(
         ["yum", "list", "installed"],
         'Installed Packages',
         allInstalledPackages)
+    elif osType == OSConst.UBUNTU_FAMILY:
+       return self.lookUpAptPackages(
+        LIST_INSTALLED_PACKAGES_UBUNTU,
+        allInstalledPackages)   
 
-  # All available packages in systems supporting yum
   def allAvailablePackages(self, allAvailablePackages):
-    if self.hasZypper():
+    osType = OSCheck.get_os_family()
+    
+    if osType == OSConst.SUSE_FAMILY:
       return self.lookUpZypperPackages(
         ["zypper", "search", "--uninstalled-only", "--details"],
         allAvailablePackages)
-    else:
+    elif osType == OSConst.REDHAT_FAMILY:
       return self.lookUpYumPackages(
         ["yum", "list", "available"],
         'Available Packages',
         allAvailablePackages)
+    elif osType == OSConst.UBUNTU_FAMILY:
+       return self.lookUpAptPackages(
+        LIST_AVAILABLE_PACKAGES_UBUNTU,
+        allAvailablePackages)   
+      
+  def lookUpAptPackages(self, command, allPackages):   
+    try:
+      result = self.subprocessWithTimeout(command)
+      if 0 == result['retCode']:
+        for x in result['out'].split('\n'):
+          if x.strip():
+            allPackages.append(x.split(' '))
+      
+    except:
+      pass
 
   def lookUpYumPackages(self, command, skipTill, allPackages):
     try:

+ 6 - 8
ambari-agent/src/test/python/ambari_agent/TestHostInfo.py

@@ -40,11 +40,10 @@ with patch("platform.linux_distribution", return_value = ('redhat','11','Final')
 @patch.object(System, "os_family", new = 'redhat')
 class TestHostInfo(TestCase):
 
-  logger = logging.getLogger()
-
-  @patch.object(PackagesAnalyzer, 'hasZypper')
+  @patch.object(OSCheck, 'get_os_family')
   @patch.object(PackagesAnalyzer, 'subprocessWithTimeout')
-  def test_analyze_zypper_out(self, spwt_mock, hasZy_mock):
+  def test_analyze_zypper_out(self, spwt_mock, get_os_family_mock):
+    get_os_family_mock.return_value = 'suse'
     packageAnalyzer = PackagesAnalyzer()
     stringToRead = """Refreshing service 'susecloud'.
            Loading repository data...
@@ -65,7 +64,6 @@ class TestHostInfo(TestCase):
     result['retCode'] = 0
 
     spwt_mock.return_value = result
-    hasZy_mock.return_value = True
     installedPackages = []
     packageAnalyzer.allInstalledPackages(installedPackages)
     self.assertEqual(7, len(installedPackages))
@@ -133,9 +131,10 @@ class TestHostInfo(TestCase):
     for package in expected:
       self.assertTrue(package in allPackages)
 
-  @patch.object(PackagesAnalyzer, 'hasZypper')
+  @patch.object(OSCheck, 'get_os_family')
   @patch.object(PackagesAnalyzer, 'subprocessWithTimeout')
-  def test_analyze_yum_output(self, subprocessWithTimeout_mock, hasZy_mock):
+  def test_analyze_yum_output(self, subprocessWithTimeout_mock, get_os_family_mock):
+    get_os_family_mock.return_value = 'redhat'
     packageAnalyzer = PackagesAnalyzer()
     stringToRead = """Loaded plugins: amazon-id, product-id, rhui-lb, security, subscription-manager
                       Updating certificate-based repositories.
@@ -159,7 +158,6 @@ class TestHostInfo(TestCase):
     result['retCode'] = 0
 
     subprocessWithTimeout_mock.return_value = result
-    hasZy_mock.return_value = False
     installedPackages = []
     packageAnalyzer.allInstalledPackages(installedPackages)
     self.assertEqual(9, len(installedPackages))