Setting tag nodeupdate-0.5-11
[nodeupdate.git] / NodeUpdate.py
old mode 100644 (file)
new mode 100755 (executable)
index c6823fb..9962ec4
@@ -23,7 +23,6 @@ RPM_PATH = "/bin/rpm"
 
 RPM_GPG_PATH = "/etc/pki/rpm-gpg"
 
-
 # location of file containing http/https proxy info, if needed
 PROXY_FILE = '/etc/planetlab/http_proxy'
 
@@ -47,6 +46,23 @@ EXTENSIONS_FILE='/etc/planetlab/extensions'
 # that were not intended to be deleted.
 DELETE_RPM_LIST_FILE= '/etc/planetlab/delete-rpm-list'
 
+# ok, so the logic should be simple, just yum update the world
+# however there are many cases in the real life where this 
+# just does not work, because of a glitch somewhere
+# so, we force the update of crucial pkgs independently, as 
+# the whole group is sometimes too much to swallow 
+# this one is builtin
+CRUCIAL_PACKAGES_BUILTIN=[ 'NodeUpdate' , 'nodemanager' ]
+# and operations can also try to push a list through a conf_file
+# should use the second one for consistency, try the first one as well for legacy
+CRUCIAL_PACKAGES_OPTIONAL_PATHS=[
+    # this is a legacy name, please avoid using this one
+    '/etc/planetlab/NodeUpdate.packages'
+    # file to use with a hand-written conf_file
+    '/etc/planetlab/crucial-rpm-list'
+    # this one could some day be maintained by a predefined config_file
+    '/etc/planetlab/sliceimage-rpm-list'
+]
 
 # print out a message only if we are displaying output
 def Message(message):
@@ -154,14 +170,33 @@ class NodeUpdate:
             yum_options += " --verbose"
         else:
             Message( "Unsupported, not using --verbose option" )
-                    
+        
+        # a configurable list of packages to try and update independently
+        # cautious..
+        try:
+            crucial_packages = []
+            for package in CRUCIAL_PACKAGES_BUILTIN: crucial_packages.append(package)
+            for path in CRUCIAL_PACKAGES_OPTIONAL_PATHS:
+                try: crucial_packages += file(CRUCIAL_PACKAGES_OPTIONAL_PATH1).read().split()
+                except: pass
+            for package in crucial_packages:
+                # if package is not yet installed, like e.g. slice images, 
+                # need to yum install, not yum update
+                if os.system("rpm -q %s > /dev/null"%package)==0:
+                    Message( "\nUpdating crucial package %s" % package)
+                    os.system( "%s %s -y update %s" %(YUM_PATH, yum_options, package))
+                else:
+                    Message( "\Installing crucial package %s" % package)
+                    os.system( "%s %s -y install %s" %(YUM_PATH, yum_options, package))
+        except:
+            pass
+
         Message( "\nUpdating PlanetLab group" )
         os.system( "%s %s %s -y groupinstall \"PlanetLab\"" %
                    (YUM_PATH, yum_options, sslcertdir) )
 
         Message( "\nUpdating rest of system" )
-        os.system( "%s %s %s -y update" %
-                   (YUM_PATH, yum_options, sslcertdir) )
+        os.system( "%s %s %s -y update" % (YUM_PATH, yum_options, sslcertdir) )
 
         Message( "\nChecking for extra groups (extensions) to update" )
         if os.access(EXTENSIONS_FILE, os.R_OK) and \
@@ -204,24 +239,30 @@ class NodeUpdate:
         Message( "\nLooking for RPMs to be deleted." )
         if os.access(DELETE_RPM_LIST_FILE, os.R_OK) and \
            os.path.isfile(DELETE_RPM_LIST_FILE):
-            rpm_list_contents= file(DELETE_RPM_LIST_FILE).read()
-            rpm_list_contents= string.strip(rpm_list_contents)
+            rpm_list_contents= file(DELETE_RPM_LIST_FILE).read().strip()
 
             if rpm_list_contents == "":
                 Message( "No RPMs listed in file to delete." )
                 return
 
-            rpm_list= string.join(string.split(rpm_list_contents))
-            
-            Message( "Deleting these RPMs:" )
-            Message( rpm_list_contents )
+            rpm_list= string.split(rpm_list_contents)
             
-            rc= os.system( "%s -ev %s" % (RPM_PATH, rpm_list) )
-
-            if rc != 0:
-                Error( "Unable to delete RPMs, continuing. rc=%d" % rc )
-            else:
-                Message( "RPMs deleted successfully." )
+            Message( "Deleting RPMs from %s: %s" %(DELETE_RPM_LIST_FILE," ".join(rpm_list)))
+
+            # invoke them separately as otherwise one faulty (e.g. already uninstalled)
+            # would prevent the other ones from uninstalling
+            for rpm in rpm_list:
+                # is it installed
+                is_installed = os.system ("%s -q %s"%(RPM_PATH,rpm))==0
+                if not is_installed:
+                    Message ("Ignoring rpm %s marked to delete, already uninstalled"%rpm)
+                    continue
+                uninstalled = os.system( "%s -ev %s" % (RPM_PATH, rpm) )==0
+                if uninstalled:
+                    Message ("Successfully removed RPM %s"%rpm)
+                    continue
+                else:
+                    Error( "Unable to delete RPM %s, continuing. rc=%d" % (rpm,uninstalled))
             
         else:
             Message( "No RPMs list file found." )