def init(applicationResourceFile, loggerName): if os.geteuid() != 0: print RED + 'You must be root to run this program.' + RESETCOLORS exit(1) usage = 'usage: %prog [[-a] [-k] [-o] [-p]] [-v] [-h]' parser = optparse.OptionParser(usage=usage) parser.add_option( '-a', action='store_true', default=False, help= 'This option will result in the application of both OS and Kernel patches.' ) parser.add_option( '-k', action='store_true', default=False, help='This option will result in the application of Kernel patches.') parser.add_option( '-o', action='store_true', default=False, help='This option will result in the application of OS patches.') parser.add_option( '-p', action='store_true', default=False, help='This option is used to perform the post update tasks.') parser.add_option( '-v', action='store_true', default=False, help="This option is used to display the application's version.") options, args = parser.parse_args() applicationName = os.path.basename(sys.argv[0]) applicationVersion = 'v1.8-10' if options.v: print applicationName + ' ' + applicationVersion exit(0) if options.a and options.k or options.a and options.o or options.k and options.o or options.a and options.p or options.o and options.p or options.k and options.p: parser.error('Options -a, -k, -o and -p are mutually exclusive.') if not options.a and not options.k and not options.o and not options.p: parser.error("Try '" + applicationName + " -h' to get command specific help.") if options.p: print GREEN + 'Phase 1: Initializing for the post system update.' + RESETCOLORS else: print GREEN + 'Phase 1: Initializing for the system update.' + RESETCOLORS patchResourceDict = {} patchResourceDict['options'] = options try: with open(applicationResourceFile) as f: for line in f: line = line.strip() line = re.sub('[\'"]', '', line) if len(line) == 0 or re.match('^\\s*#', line) or re.match( '^\\s+$', line): continue else: key, val = line.split('=') key = key.strip() patchResourceDict[key] = val.strip() except IOError as err: print RED + "Unable to access the application's resource file " + applicationResourceFile + '.\n' + str( err) + '\n' + RESETCOLORS exit(1) try: logBaseDir = re.sub('\\s+', '', patchResourceDict['logBaseDir']).rstrip('/') patchApplicationLog = re.sub('\\s+', '', patchResourceDict['patchApplicationLog']) patchApplicationLog = logBaseDir + '/' + patchApplicationLog except KeyError as err: print RED + 'The resource key (' + str( err ) + ') was not present in the resource file; exiting program execution.' + '\n' + RESETCOLORS exit(1) if not options.p: try: logList = os.listdir(logBaseDir) for log in logList: os.remove(logBaseDir + '/' + log) except OSError as err: print RED + 'Unable to remove old logs in ' + logBaseDir + '; exiting program execution.\n' + str( err) + '\n' + RESETCOLORS exit(1) handler = logging.FileHandler(patchApplicationLog) logger = logging.getLogger(loggerName) logger.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s:%(levelname)s:%(message)s', datefmt='%m/%d/%Y %H:%M:%S') handler.setFormatter(formatter) logger.addHandler(handler) if options.p: return patchResourceDict logger.info(applicationName + ' ' + applicationVersion) try: if len(patchResourceDict['rpmsToRemove']) != 0: patchResourceDict['removeRPMs'] = True else: patchResourceDict['removeRPMs'] = False if len(patchResourceDict['rpmsToAdd']) != 0: patchResourceDict['addRPMs'] = True else: patchResourceDict['addRPMs'] = False except KeyError as err: logger.error('The resource key (' + str(err) + ') was not present in the resource file.') print RED + 'A resource key was not present in the resource file, check the log file for errors; exiting program execution.' + '\n' + RESETCOLORS exit(1) checkDiskSpace(loggerName) osDistLevel = checkOSVersion(patchResourceDict.copy(), loggerName) patchResourceDict['osDistLevel'] = osDistLevel command = 'dmidecode -s system-product-name' result = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) out, err = result.communicate() logger.info('The output of the command (' + command + ") used to get the system's model was: " + out.strip()) if result.returncode != 0: logger.error("Unable to get the system's model information.\n" + err) print RED + "\nUnable to get the system's model information; check the log file for errors; exiting program execution.\n" + RESETCOLORS exit(1) systemModel = re.match('[a-z,0-9]+\\s+(.*)', out, re.IGNORECASE).group(1).replace(' ', '') logger.info("The system's model was determined to be: " + systemModel + '.') patchResourceDict['systemModel'] = systemModel if osDistLevel == 'SLES_SP1': sles12MultipathFix(loggerName) if systemModel == 'DL580Gen9' and osDistLevel == 'SLES_SP1': if checkStorage(loggerName) and checkForMellanox(loggerName): removeMellanoxDriver(loggerName) mlx4Configure(loggerName) if '16s' in systemModel: cpuModel = getProcessorType(loggerName) if cpuModel == 'broadwell' and not osDistLevel == 'SLES_SP4': updateFstabTimeout(loggerName) if options.a or options.k: if systemModel == 'DL580G7' or systemModel == 'DL980G7' or systemModel == 'DL380pGen8' or systemModel == 'DL360pGen8' or systemModel == 'DL360Gen9': patchResourceDict['postUpdateRequired'] = 'yes' try: logBaseDir = re.sub( '\\s+', '', patchResourceDict['logBaseDir']).rstrip('/') postUpdateResumeLog = re.sub( '\\s+', '', patchResourceDict['postUpdateResumeLog']) postUpdateResumeLog = logBaseDir + '/' + postUpdateResumeLog except KeyError as err: logger.error('The resource key (' + str(err) + ') was not present in the resource file.') print RED + 'The resource key for the post update resume log was not present in the resource file; check the log file for errors; exiting program execution.' + RESETCOLORS exit(1) try: f = open(postUpdateResumeLog, 'a') if systemModel == 'DL380pGen8' or systemModel == 'DL360pGen8' or systemModel == 'DL360Gen9': f.write('isServiceguardSystem = yes\n') else: f.write('isServiceguardSystem = no\n') if systemModel == 'DL580G7' or systemModel == 'DL980G7': f.write('isFusionIOSystem = yes\n') removeFusionIOPackages(patchResourceDict.copy(), loggerName) else: f.write('isFusionIOSystem = no\n') f.close() except IOError as err: logger.error('Unable to access the post update resume log.\n' + str(err)) print RED + 'Unable to access the post update resume log; check the log file for errors; exiting program execution.' + RESETCOLORS exit(1) else: patchResourceDict['postUpdateRequired'] = 'no' else: patchResourceDict['postUpdateRequired'] = 'no' if (options.a or options.o) and patchResourceDict['suseSLESSAPReleaseRPM'] != '': command = 'rpm -q SUSE_SLES_SAP-release' result = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) out, err = result.communicate() if result.returncode == 0: updateSUSE_SLES_SAPRelease(patchResourceDict.copy(), loggerName) elif 'package SUSE_SLES_SAP-release is not installed' not in out: logger.error( 'Unable to determine if the SUSE_SLES_SAP-release RPM is installed.\n' + out) print RED + 'Unable to determine if the SUSE_SLES_SAP-release RPM is installed; check the log file for errors; exiting program execution.' + RESETCOLORS exit(1) patchDirList = setPatchDirectories(patchResourceDict.copy(), loggerName) configureRepositories(patchDirList[:], loggerName) repositoryList = [] for dir in patchDirList: repositoryList.append(dir.split('/').pop()) patchResourceDict['repositoryList'] = repositoryList updateZyppConf(loggerName) if osDistLevel == 'SLES_SP4': updateBootloaderCFG(loggerName) return patchResourceDict
configureRepositories(patchDirList[:], loggerName) # configureRepository repositoryList = [] for dir in patchDirList: repositoryList.append(dir.split('/').pop()) patchResourceDict['repositoryList'] = repositoryList #from modules.updateZyppConf import updateZyppConf updateZyppConf(loggerName) # updateZyppConf if osDistLevel == 'SLES_SP4': updateBootloaderCFG(loggerName) # Preupgrade 5 return patchResourceDict def main(): applicationResourceFile = '/hp/support/patches/resourceFiles/patchResourceFile' loggerName = 'patchLogger' patchResourceDict = init(applicationResourceFile, loggerName) logger = logging.getLogger(loggerName) options = patchResourceDict['options'] if not options.p: print GREEN + 'Phase 2: Updating system with patches.' + RESETCOLORS osDistLevel = patchResourceDict['osDistLevel'] if not options.k: if patchResourceDict['removeRPMs'] or patchResourceDict['addRPMs']: #from modules.oneOffs import OneOffs