#!/usr/bin/env python3 # -*- coding:utf-8 -*- ############################################################################# # Copyright (c) 2020 Huawei Technologies Co.,Ltd. # # openGauss is licensed under Mulan PSL v2. # You can use this software according to the terms # and conditions of the Mulan PSL v2. # You may obtain a copy of Mulan PSL v2 at: # # http://license.coscl.org.cn/MulanPSL2 # # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OF ANY KIND, # EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, # MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. # See the Mulan PSL v2 for more details. # ---------------------------------------------------------------------------- # Description : gs_checkos is a utility to check and set cluster OS information. ############################################################################# import os import sys import time import subprocess from datetime import datetime, timedelta sys.path.append(sys.path[0] + '/../lib') from gspylib.threads.SshTool import SshTool from gspylib.common.GaussLog import GaussLog from gspylib.common.Common import DefaultValue from gspylib.common.OMCommand import OMCommand from gspylib.common.DbClusterInfo import dbClusterInfo from gspylib.common.ErrorCode import ErrorCode from gspylib.common.ParameterParsecheck import Parameter from base_utils.os.file_util import FileUtil from base_utils.os.net_util import NetUtil from domain_utils.domain_common.cluster_constants import ClusterConstants from base_utils.common.constantsbase import ConstantsBase ############################################################################# # Global variables # gs_checkos_version: the gs_checkos verion number # g_opts: globle option # g_logger: globle logger # g_sshTool: globle ssh interface # g_OSCheckOpts: options about all checking and setting items # DEFAULT_INTERVAL: default space number # CHECK_ITEMNUMLIST: checking item list # SET_ITEMNUMLIST: setting item list # LOG_DIR: the log directory about gs_checkos ############################################################################# g_opts = None g_logger = None g_sshTool = None host = None g_clusterInfo = None g_OSCheckOpts = { 'A1': ['Checking items', '[ OS version status ]', 'Normal', 'OK', 'OK'], 'A2': ['Checking items', '[ Kernel version status ]', 'Normal', 'OK', 'OK'], 'A3': ['Checking items', '[ Unicode status ]', 'Normal', 'OK', 'OK'], 'A4': ['Checking items', '[ Time zone status ]', 'Normal', 'OK', 'OK'], 'A5': ['Checking items', '[ Swap memory status ]', 'Normal', 'OK', 'OK'], 'A6': ['Checking items', '[ System control parameters status ]', 'Normal', 'OK', 'OK'], 'A7': ['Checking items', '[ File system configuration status ]', 'Normal', 'OK', 'OK'], 'A8': ['Checking items', '[ Disk configuration status ]', 'Normal', 'OK', 'OK'], 'A9': ['Checking items', '[ Pre-read block size status ]', 'Normal', 'OK', 'OK'], 'A10': ['Checking items', '[ IO scheduler status ]', 'Normal', 'OK', 'OK'], 'A11': ['Checking items', '[ Network card configuration status ]', 'Normal', 'OK', 'OK'], 'A12': ['Checking items', '[ Time consistency status ]', 'Normal', 'OK', 'OK'], 'A13': ['Checking items', '[ Firewall service status ]', 'Normal', 'OK', 'OK'], 'A14': ['Checking items', '[ THP service status ]', 'Normal', 'OK', 'OK'], 'B1': ['Setting items', '[ Set system control parameters ]', 'Normal', 'OK', 'OK'], 'B2': ['Setting items', '[ Set file system configuration value ]', 'Normal', 'OK', 'OK'], 'B3': ['Setting items', '[ Set pre-read block size value ]', 'Normal', 'OK', 'OK'], 'B4': ['Setting items', '[ Set IO scheduler value ]', 'Normal', 'OK', 'OK'], 'B5': ['Setting items', '[ Set network card configuration value ]', 'Normal', 'OK', 'OK'], 'B6': ['Setting items', '[ Set THP service ]', 'Normal', 'OK', 'OK'], 'B7': ['Setting items', '[ Set RemoveIPC value ]', 'Normal', 'OK', 'OK'], 'B8': ['Setting items', '[ Set Session Process ]', 'Normal', 'OK', 'OK']} DEFAULT_INTERVAL = 60 CHECK_ITEMNUMLIST = ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', 'A11', 'A12', 'A13', 'A14'] SET_ITEMNUMLIST = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8'] LOG_DIR = "/tmp/gs_checkos" Local_CheckOs = "" Local_Check = "" ####################################################### # action option strings ACTION_CHECK_OS_VERSION = "Check_OS_Version" ACTION_CHECK_KERNEL_VERSION = "Check_Kernel_Version" ACTION_CHECK_UNICODE = "Check_Unicode" ACTION_CHECK_TIMEZONE = "Check_TimeZone" ACTION_CHECK_SYSCTL_PARAMETER = "Check_SysCtl_Parameter" ACTION_CHECK_DISK_CONFIGURE = "Check_Disk_Configure" ACTION_CHECK_BLOCKDEV_CONFIGURE = "Check_BlockDev_Configure" ACTION_CHECK_LOGICAL_BLOCK = "Check_Logical_Block" ACTION_CHECK_IO_REQUEST = "Check_IO_Request" ACTION_CHECK_ASYNCHRONOUS_IO_REQUEST = "Check_Asynchronous_IO_Request" ACTION_CHECK_IO_CONFIGURE = "Check_IO_Configure" ACTION_CHECK_NETWORK_CONFIGURE = "Check_Network_Configure" ACTION_CHECK_NETWORK_BOND_MODE = "Check_Network_Bond_Mode" ACTION_CHECK_SWAP_MEMORY_CONFIGURE = "Check_Swap_Memory_Configure" ACTION_CHECK_FILESYSTEM_CONFIGURE = "Check_FileSystem_Configure" ACTION_CHECK_TIME_CONSISTENCY = "Check_Time_Consistency" ACTION_CHECK_FIREWALL_SERVICE = "Check_Firewall_Service" ACTION_CHECK_THP_SERVICE = "Check_THP_Service" ACTION_SET_SYSCTL_PARAMETER = "Set_SysCtl_Parameter" ACTION_SET_FILESYSTEM_CONFIGURE = "Set_FileSystem_Configure" ACTION_SET_NETWORK_CONFIGURE = "Set_Network_Configure" ACTION_SET_THP_SERVICE = "Set_THP_Service" ACTION_SET_REMOVEIPC_VALUE = "Set_RemoveIPC_Value" ACTION_SET_SESSION_PROCESS = "Set_Session_Process" ACTION_SET_BLOCKDEV_CONFIGURE = "Set_BlockDev_Configure" ACTION_SET_LOGICAL_BLOCK = "Set_Logical_Block" ACTION_SET_IO_CONFIGURE = "Set_IO_Configure" ACTION_SET_IO_REQUEST = "Set_IO_REQUEST" ACTION_SET_ASYNCHRONOUS_IO_REQUEST = "Set_Asynchronous_IO_Request" ####################################################### class CmdOptions(): """ init the command options """ def __init__(self): self.hostnamestr = "" self.itemstr = "" self.hostlistfile = "" self.hostnameList = [] self.outputfile = "" self.logFile = "" self.localLog = "" self.set = False self.detail = False self.detail_all = False self.item_detail = [] self.confFile = "" self.localMode = False ######################################################### # Init global log ######################################################### def initGlobals(): """ init the global parameter g_logger and g_sshTool """ global g_logger global g_sshTool global g_clusterInfo g_logger = GaussLog(g_opts.logFile, "gs_checkos") dirName = os.path.dirname(g_opts.logFile) g_opts.localLog = os.path.join(dirName, ClusterConstants.LOCAL_LOG_FILE) g_sshTool = SshTool(g_opts.hostnameList, g_logger.logFile, DefaultValue.TIMEOUT_PSSH_CHECK) g_clusterInfo = dbClusterInfo() if (g_opts.confFile != ""): g_clusterInfo.initFromXml(g_opts.confFile) ############################################################################# # Parse and check parameters ############################################################################# def usage(): """ gs_checkos is a utility to check and set cluster OS information. Usage: gs_checkos -? | --help gs_checkos -V | --version gs_checkos -i ITEM [-f HOSTFILE] [-h HOSTNAME] [-X XMLFILE] [--detail] [-o OUTPUT] [-l LOGFILE] General options: -i Item number. To check all items, enter "-i A". To set all parameters, enter "-i B". To check multiple status, enter the items in the following format: "-i A1,A2,A3". -f File listing names of all the hosts to connect to. The host names are separated by line breaks. -h Name of the host to connect to. -X Configuration file of the cluster. --detail Show detailed information. -o Save the result to the specified file. -l Path of log file. -? --help Show help information for this utility, and exit the command line mode. -V --version Show version information. Item number description: 'A1':[ OS version status ] 'A2':[ Kernel version status ] 'A3':[ Unicode status ] 'A4':[ Time zone status ] 'A5':[ Swap memory status ] 'A6':[ System control parameters status ] 'A7':[ File system configuration status ] 'A8':[ Disk configuration status ] 'A9':[ Pre-read block size status ] 'A10':[ IO scheduler status ] 'A11':[ Network card configuration status ] 'A12':[ Time consistency status ] 'A13':[ Firewall service status ] 'A14':[ THP service status ] 'B1':[ Set system control parameters ] 'B2':[ Set file system configuration value ] 'B3':[ Set pre-read block size value ] 'B4':[ Set IO scheduler value ] 'B5':[ Set network card configuration value ] 'B6':[ Set THP service ] 'B7':[Set RemoveIPC value] 'B8':[Set Session Process] """ print(usage.__doc__) def parseHostnameOpts(value): """ parse hostnames by value """ if (len(value) > 1): for val in value: val = val.strip() if val != "" and val not in g_opts.hostnameList: g_opts.hostnameList.append(val) else: g_opts.hostnameList.append(value[0]) def parseItemOpts(itemList): """ parse items by value """ value = [] for val in itemList: if (len(val.split(',')) > 1): for i in val.split(','): value.append(i) else: value.append(val) if (len(value) > 1): for val in value: val = val.strip().upper() if (val in CHECK_ITEMNUMLIST or val.upper() == "A" or val in SET_ITEMNUMLIST or val.upper() == "B"): if val not in g_opts.item_detail: g_opts.item_detail.append(val) else: GaussLog.exitWithError( ErrorCode.GAUSS_500["GAUSS_50004"] % 'i') else: value = value[0].upper() if (value in CHECK_ITEMNUMLIST or value == "A" or value in SET_ITEMNUMLIST or value == "B"): if value not in g_opts.item_detail: g_opts.item_detail.append(value) else: GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50004"] % 'i') def parseCommandLine(): """ Parse command line and save to global variable """ global g_opts g_opts = CmdOptions() ParaObj = Parameter() ParaDict = ParaObj.ParameterCommandLine("checkos") if (ParaDict.__contains__("helpFlag")): usage() sys.exit(0) if (ParaDict.__contains__("logFile")): g_opts.logFile = ParaDict.get("logFile") if (ParaDict.__contains__("confFile")): g_opts.confFile = ParaDict.get("confFile") if (ParaDict.__contains__("nodename")): g_opts.hostnamestr = ParaDict.get("nodename") if (ParaDict.__contains__("hostfile")): g_opts.hostlistfile = ParaDict.get("hostfile") if (ParaDict.__contains__("outFile")): g_opts.outputfile = ParaDict.get("outFile") if (ParaDict.__contains__("itemstr")): g_opts.itemstr = ParaDict.get("itemstr") if (ParaDict.__contains__("show_detail")): g_opts.detail = ParaDict.get("show_detail") def readHostFile(hostfile): """ read host file to hostlist """ try: with open(hostfile, "r") as fp: for readline in fp: hostname = readline.strip().split("\n")[0] if hostname != "" and hostname not in hostfile: g_opts.hostnameList.append(hostname) except Exception as e: GaussLog.exitWithError(ErrorCode.GAUSS_502["GAUSS_50204"] % hostfile + " Error: \n%s" % str(e)) def checkHostList(): """ """ if (g_opts.hostnamestr == "" and g_opts.hostlistfile == ""): g_opts.hostnameList = [NetUtil.GetHostIpOrName()] elif (g_opts.hostnamestr != "" and g_opts.hostlistfile != ""): GaussLog.exitWithError( ErrorCode.GAUSS_500["GAUSS_50005"] % ('h', 'f')) elif (g_opts.hostnamestr == "" and g_opts.hostlistfile != ""): if (not os.path.isfile(g_opts.hostlistfile)): GaussLog.exitWithError( ErrorCode.GAUSS_502["GAUSS_50201"] % g_opts.hostlistfile) else: readHostFile(g_opts.hostlistfile) else: parseHostnameOpts(g_opts.hostnamestr) def checkConfigFile(): """ """ if (g_opts.confFile != ""): if (not os.path.isfile(g_opts.confFile)): GaussLog.exitWithError( ErrorCode.GAUSS_502["GAUSS_50201"] % g_opts.confFile) def setLogFile(): """ """ if (g_opts.logFile == ""): cmd = "(if [ ! -d %s ]; then mkdir -p %s -m %s; fi)" % ( LOG_DIR, LOG_DIR, DefaultValue.KEY_DIRECTORY_MODE) (status, output) = subprocess.getstatusoutput(cmd) if (status != 0): GaussLog.exitWithError(ErrorCode.GAUSS_502["GAUSS_50208"] % "log of gs_checkos" + " Error: \n%s." % output + "The cmd is %s" % cmd) g_opts.logFile = os.path.join(LOG_DIR, "gs_checkos.log") def checkItems(): """ """ if (g_opts.itemstr == ""): GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50001"] % "i" + ".") def checkOutputFile(): """ """ try: if (g_opts.outputfile != ""): DefaultValue.checkOutputFile(g_opts.outputfile) except Exception as e: GaussLog.exitWithError(str(e)) def checkParameter(): """ Check parameter from command line """ ############################################ # check hostlist info ########################################### checkHostList() # check config file checkConfigFile() if (len(g_opts.hostnameList) == 0): g_opts.hostnameList = [NetUtil.GetHostIpOrName()] g_opts.hostnameList.sort() checkHostnameList() ########################################## # set logfile ############################################ setLogFile() ########################################## # set items ############################################ checkItems() parseItemOpts(g_opts.itemstr) if (("B" in g_opts.item_detail)): g_opts.set = True else: for i in SET_ITEMNUMLIST: for j in g_opts.item_detail: if (j == i): g_opts.set = True break if (g_opts.set == True): if ("A" in g_opts.item_detail): GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50004"] % 'i' + " Checking items and setting items" " can't be used together.") for i in CHECK_ITEMNUMLIST: for j in g_opts.item_detail: if (j == i): GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50004"] % 'i' + " Checking items and " "setting items can't be" " used together.") ############################################ # check output file ############################################ checkOutputFile() def doCheckOS(itemNumber): """ do the checing ation by item """ if (itemNumber == 'A1'): checkOSVersion() elif (itemNumber == 'A2'): checkKernelVersion() elif (itemNumber == 'A3'): checkUnicode() elif (itemNumber == 'A4'): checkTimeZone() elif (itemNumber == 'A5'): checkMemoryUsage() elif (itemNumber == 'A6'): checkSysCtlParameter() elif (itemNumber == 'A7'): checkFileSystemConfigure() elif (itemNumber == 'A8'): checkDiskConfigure() elif (itemNumber == 'A9'): checkBlockDevConfigure() checkLogicalBlock() elif (itemNumber == 'A10'): checkIOrequestqueue() checkMaxAsyIOrequests() checkIOConfigure() elif (itemNumber == 'A11'): checkNetworkConfigure() elif (itemNumber == 'A12'): checkTimeConsistency() elif (itemNumber == 'A13'): checkFirewallService() elif (itemNumber == 'A14'): checkTHPService() def doSetOS(itemNumber): """ do the setting ation by item """ if (itemNumber == 'B1'): setSysCtlParameter() elif (itemNumber == 'B2'): setFileSystemConfigure() elif (itemNumber == 'B3'): setLogicalBlock() setBlockDevConfigure() elif (itemNumber == 'B4'): setIOrequestqueue() setMaxAsyIOrequests() setIOConfigure() elif (itemNumber == 'B5'): setNetworkConfigure() elif (itemNumber == 'B6'): setTHPService() elif (itemNumber == 'B7'): setRemoveIPCValue() elif (itemNumber == 'B8'): setSessionProcess() def checkOSVersion(): """ check OS version make sure that the OS vesion is in SuSE11 sp1/2/3/4, SuSE12 sp0/1/2/3 or Redhat(centos) 6.4/6.5/6.5/6.7/6.8/6.9/7.0/7.1/7.2/7.3/7.4/7.5 If it is local, skipping. Else the OS version from all nodes are same information type like this: True SuSE11SP1 SuSE_11_SP1_64bit False SuSE SuSE_10_SP4_64bit """ g_logger.debug("Checking OS version.") try: cmd = "%s -t %s -l %s" % ( Local_CheckOs, ACTION_CHECK_OS_VERSION, g_opts.localLog) (status, output, outputMap) = getCmdOutput(cmd) parRes = "" detail_msg = "" for node in list(status.keys()): outputMap[node] = outputMap[node].strip().split("\n")[0].strip() for node in list(status.keys()): if ((status[node] != DefaultValue.SUCCESS)): g_logger.logExit("[%s]: \n" % node + ErrorCode.GAUSS_516["GAUSS_51632"] % cmd + " Error: \n%s" % outputMap[node].strip()) if ((status[node] == DefaultValue.SUCCESS) and (outputMap[node].strip().split(' ')[0].strip() == str(False))): g_OSCheckOpts['A1'][2] = 'Abnormal' parRes += "[%s]\n%s\n" % ( node, outputMap[node].strip().split(' ')[2].strip()) detail_msg += "[%s]\n%s [Abnormal]\n" % ( node, outputMap[node].strip().split(' ')[2].strip()) if ((parRes == "") and (len(list(status.keys())) > 1)): nodeValue = list(status.keys())[0].strip() mixedType = outputMap[nodeValue].strip().split(' ')[1].strip() platformStr = outputMap[nodeValue].strip().split(' ')[2].strip() sshresult = "" if (mixedType == ""): g_OSCheckOpts['A1'][2] = 'Abnormal' parRes += "[%s]\n%s\n" % ( nodeValue, "Failed to obtain platform information.") detail_msg += "[%s]\n%s [Abnormal]\n" % ( nodeValue, "Failed to obtain platform information.") else: for node in list(status.keys()): if ((status[node] == DefaultValue.SUCCESS) and ( outputMap[node].strip().split(' ')[ 1].strip() != mixedType)): g_OSCheckOpts['A1'][2] = 'Abnormal' sshresult = "failed" parRes += "[%s]\n%s\n" % ( node, outputMap[node].strip().split(' ')[2].strip()) detail_msg += "[%s]\n%s [Abnormal]\n" % ( node, outputMap[node].strip().split(' ')[2].strip()) if (sshresult == "failed"): parRes = "[%s]\n%s\n%s" % (nodeValue, platformStr, parRes) if (g_OSCheckOpts['A1'][2] == 'Abnormal'): g_OSCheckOpts['A1'][3] = "\n%s" % parRes else: parRes = "" for node in list(status.keys()): parRes += " [%s]\n %s\n" % ( node, outputMap[node].strip().split(' ')[2].strip()) detail_msg += " [%s]\n %s [Normal]\n" % ( node, outputMap[node].strip().split(' ')[2].strip()) g_OSCheckOpts['A1'][3] = "\n%s" % parRes g_OSCheckOpts['A1'][4] = "\n%s" % detail_msg except Exception as e: g_logger.debug(str(e)) g_logger.debug("Successfully checked OS version.") def performEnvCheck(action_item, failed_mesg, success_mesg, item_num, warning_level, configFile=""): """ action_item : action item failed_mesg : failed message information success_mesg : success message information item_num : item number warning_level : warning level, warning or Abnormal """ ssh_config_tmp = "" outputMap = {} try: if (configFile != ""): cmd = "%s -t %s -X '%s' -l '%s'" % ( Local_CheckOs, action_item, configFile, g_opts.localLog) else: cmd = "%s -t %s -l '%s'" % ( Local_CheckOs, action_item, g_opts.localLog) if action_item == ACTION_CHECK_UNICODE: try: # Generate an empty file as a configuration file ssh_config_tmp = getTmpFile() FileUtil.createFile(ssh_config_tmp) # Execute the ssh command with an empty configuration file when checking the encoding format (status, output, outputMap) = getCmdOutput(cmd, ssh_config_tmp) # Clean up the generated empty configuration file FileUtil.removeFile(ssh_config_tmp) except Exception as e: if os.path.exists(ssh_config_tmp): FileUtil.removeFile(ssh_config_tmp) g_logger.debug( "Execute ssh cmd [%s] with ssh_config exception." % cmd) raise Exception(str(e)) else: (status, output, outputMap) = getCmdOutput(cmd) parRes = "" detail_msg = "" for node in list(status.keys()): if (status[node] != DefaultValue.SUCCESS): g_logger.logExit("[%s]: \n" % node + ErrorCode.GAUSS_516["GAUSS_51632"] % cmd + " Error: \n%s" % outputMap[node].strip()) if (outputMap[node].strip() == ''): raise Exception("[%s]\n%s\n" % (node, "The result is Null")) if ("not same" in outputMap[node].strip()): raise Exception( "[%s]\n%s\n" % (node, outputMap[node].strip())) if ((len(list(status.keys())) > 1)): nodeValue = list(status.keys())[0].strip() keystr = outputMap[nodeValue].strip().split()[1].strip() sshresult = "" if (keystr == ""): g_OSCheckOpts[item_num][2] = '%s' % warning_level parRes += " [%s]\n %s\n" % ( nodeValue, failed_mesg) detail_msg += " [%s]\n %s\n" % ( nodeValue, failed_mesg) else: for node in list(status.keys()): if ((status[node] == DefaultValue.SUCCESS) and (outputMap[node].strip().split()[1].strip() != keystr)): g_OSCheckOpts[item_num][2] = warning_level sshresult = "failed" parRes += " [%s]\n %s\n" % ( node, outputMap[node].strip().split()[1].strip()) detail_msg += " [%s]\n %s [%s]\n" % ( node, outputMap[node].strip().split()[1].strip(), warning_level) else: detail_msg += " [%s]\n %s [%s]\n" % ( node, outputMap[node].strip().split()[1].strip(), "Normal") if (sshresult == "failed"): parRes = " [%s]\n %s\n%s" % ( nodeValue, keystr, parRes) if (g_OSCheckOpts[item_num][2] == warning_level): g_OSCheckOpts[item_num][3] = "\n%s" % parRes keystr = "" else: nodeValue = list(status.keys())[0].strip() keystr = outputMap[nodeValue].strip().split()[1].strip() g_OSCheckOpts[item_num][3] = "\n %s The value is \"%s\"."\ % (success_mesg, keystr) if g_opts.detail_all: if (item_num == "A11") and (keystr == "Null"): g_OSCheckOpts[item_num][4] = "OK" else: g_OSCheckOpts[item_num][4] = "\n%s" % detail_msg except Exception as e: g_logger.debug(str(e)) g_logger.debug("Output: \n%s" % outputMap) g_OSCheckOpts[item_num][2] = warning_level g_OSCheckOpts[item_num][3] = "\n %s" % failed_mesg g_OSCheckOpts[item_num][4] = "\n %s" % failed_mesg def checkKernelVersion(): """ Checking kernel version """ g_logger.debug("Checking kernel version.") performEnvCheck(ACTION_CHECK_KERNEL_VERSION, "Failed to obtain kernel version information.", "The names about all kernel versions are same.", "A2", "Warning") g_logger.debug("Successfully checked kernel version.") def checkUnicode(): """ Checking unicode value """ g_logger.debug("Checking unicode value.") performEnvCheck(ACTION_CHECK_UNICODE, "Failed to obtain unicode value.", "The values of all unicode are same.", "A3", "Abnormal") g_logger.debug("Successfully checked unicode value.") def checkTimeZone(): """ Checking timezone information """ g_logger.debug("Checking timezone information.") performEnvCheck(ACTION_CHECK_TIMEZONE, "Failed to obtain timezone information.", "The informations about all timezones are same.", "A4", "Abnormal") g_logger.debug("Successfully checked timezone information.") def performCheckorSetOS(action_item, flag_str, success_mesg, item_num, warning_level, configFile="", command="", parameters=""): """ action_item : action item flag_str : failed flag string success_mesg : success message information item_num : item number warning_level : warning level, warning or Abnormal parameters : multiple strings of parameters """ try: if command == "": command = Local_CheckOs if (configFile != ""): cmd = "%s -t %s -X '%s' -l '%s' %s" % ( command, action_item, configFile, g_opts.localLog, parameters) else: cmd = "%s -t %s -l '%s' %s" % ( command, action_item, g_opts.localLog, parameters) (status, output, outputMap) = getCmdOutput(cmd) parRes = "" detail_msg = "" for node in list(status.keys()): if (status[node] != DefaultValue.SUCCESS): g_logger.logExit(" [%s]: \n" % node + ErrorCode.GAUSS_516["GAUSS_51632"] % cmd + " Error: \n%s" % outputMap[node].strip()) if (outputMap[node].find(flag_str) >= 0): g_OSCheckOpts[item_num][2] = warning_level parRes += " [%s]\n%s\n" % (node, outputMap[node]) else: detail_msg += " [%s]\n%s\n" % (node, outputMap[node]) if (outputMap[node].find("Warning reason") >= 0 and outputMap[node].find("Abnormal") < 0): if (g_OSCheckOpts[item_num][2] != "Abnormal"): g_OSCheckOpts[item_num][2] = "Warning" parRes += " [%s]\n%s\n" % (node, outputMap[node]) if (parRes != ""): raise Exception("%s" % parRes) if (g_OSCheckOpts[item_num][2] != warning_level): g_OSCheckOpts[item_num][3] = "\n %s" % success_mesg if g_OSCheckOpts[item_num][4] != "OK": g_OSCheckOpts[item_num][4] = formatResault( detail_msg, g_OSCheckOpts[item_num][4]) else: g_OSCheckOpts[item_num][4] = "\n%s" % detail_msg except Exception as e: g_logger.debug(str(e)) if (g_OSCheckOpts[item_num][2] == "Normal"): g_OSCheckOpts[item_num][2] = '%s' % warning_level g_OSCheckOpts[item_num][3] = "\n%s" % str(e) g_OSCheckOpts[item_num][4] = "\n%s" % str(e) def formatResault(result_Str1, result_Str2): """ get add result of to dict """ result = "" result_list1 = result_Str1.strip("\n").split("\n\n") result_list2 = result_Str2.strip("\n").split("\n\n") for nodeInfo1 in result_list1: result += ("\n" + nodeInfo1.split("\n")[0]) result += ("\n" + "\n".join(nodeInfo1.split("\n")[1:])) for nodeInfo2 in result_list2: if nodeInfo1.split("\n")[0].strip() == nodeInfo2.split("\n")[0].strip(): result += ("\n" + "\n".join(nodeInfo2.split("\n")[1:]) + "\n") return result def checkMemoryUsage(): """ Checking swap memory value """ g_logger.debug("Checking swap memory value.") performCheckorSetOS(ACTION_CHECK_SWAP_MEMORY_CONFIGURE, "SwapMemory", "The value about swap memory is correct.", "A5", "Warning") g_logger.debug("Successfully checked swap memory value.") def checkSysCtlParameter(): """ Checking system control parameter value """ g_logger.debug("Checking system control parameter value.") performCheckorSetOS(ACTION_CHECK_SYSCTL_PARAMETER, "Abnormal", "All values about system control parameters are correct.", "A6", "Abnormal", '', Local_Check) g_logger.debug("Successfully checked system control parameter value.") def checkFileSystemConfigure(): """ Checking file system configuration information """ g_logger.debug("Checking file system configuration information.") performCheckorSetOS(ACTION_CHECK_FILESYSTEM_CONFIGURE, "Abnormal", "Both soft nofile and hard nofile are correct.", "A7", "Abnormal", '', Local_Check) g_logger.debug( "Successfully checked file system configuration information.") def checkDiskConfigure(): """ Checking disk configuration value """ g_logger.debug("Checking disk configuration value.") performCheckorSetOS(ACTION_CHECK_DISK_CONFIGURE, "filesystem", "The value about XFS mount parameters is correct.", "A8", "Warning") g_logger.debug("Successfully checked disk configuration value.") def checkBlockDevConfigure(): """ Checking Pre-read block size value """ g_logger.debug("Checking Pre-read block size value.") performCheckorSetOS(ACTION_CHECK_BLOCKDEV_CONFIGURE, "blockdev", "The value about Pre-read block size is correct.", "A9", "Abnormal") g_logger.debug("Successfully checked Pre-read block size value.") def checkLogicalBlock(): """ Checking Logical Block size value """ g_logger.debug("Checking Logical Block size value.") performCheckorSetOS(ACTION_CHECK_LOGICAL_BLOCK, "logical_block_size", "The value about Logical block size is correct.", "A9", "Abnormal") g_logger.debug("Successfully checked Logical block size value.") def checkIOrequestqueue(): """ Checking IO request queue value """ g_logger.debug("Checking IO request queue value.") performCheckorSetOS(ACTION_CHECK_IO_REQUEST, "request", "The value of IO request queue is correct.", "A10", "Abnormal") g_logger.debug("Successfully checked IO request queue value.") def checkMaxAsyIOrequests(): """ Checking Asynchronous IO request queue value """ g_logger.debug("Checking Asynchronous IO request queue value.") performCheckorSetOS(ACTION_CHECK_ASYNCHRONOUS_IO_REQUEST, "aio-max-nr", "The value of Asynchronous IO request queue is correct.", "A10", "Abnormal", g_opts.confFile) g_logger.debug( "Successfully checked Asynchronous IO request queue value.") def checkIOConfigure(): """ Checking IO scheduler value """ g_logger.debug("Checking IO scheduler value.") performCheckorSetOS(ACTION_CHECK_IO_CONFIGURE, "scheduler", "The value of IO scheduler is correct.", "A10", "Abnormal") g_logger.debug("Successfully checked IO scheduler value.") def checkNetworkConfigure(): """ Checking network card configuration """ g_logger.debug("Checking network card configuration.") performEnvCheck(ACTION_CHECK_NETWORK_BOND_MODE, "Failed to obtain the networks bond mode information.", "The all networks bond mode are same.", "A11", "Warning", g_opts.confFile) if (g_OSCheckOpts["A11"][2] == "Warning"): g_OSCheckOpts["A11"][3] += "\n Failed to check the network" \ " bond mode." g_OSCheckOpts["A11"][4] = g_OSCheckOpts["A11"][3] return nodeIp = getLocalIPAddr() localMTU = DefaultValue.checkNetWorkMTU(nodeIp, False) if (str(localMTU).find("Abnormal") >= 0 or localMTU == ""): return cmdInfo = "--hostname=%s " % NetUtil.GetHostIpOrName() if (not g_opts.localMode): cmdInfo += "--MTUvalue=%s " % localMTU if (g_opts.confFile != "" and g_opts.confFile != None): cmdInfo += "--xmlfile=%s " % g_opts.confFile performCheckorSetOS(ACTION_CHECK_NETWORK_CONFIGURE, "Abnormal", "The configuration about network card is correct.", "A11", "Abnormal", g_opts.confFile, "", cmdInfo) g_logger.debug("Successfully checked network configuration.") def getLocalIPAddr(): ''' function: get all ips from configuration file input : NA output: Ips ''' Ips = "" if (g_opts.confFile == ""): localHostIp = DefaultValue.getIpByHostName() Ips = localHostIp else: for node in g_clusterInfo.dbNodes: if (node.name == NetUtil.GetHostIpOrName()): Ips = node.backIps[0] return Ips def checkTimeConsistency(): """ Checking system time consistency """ g_logger.debug("Checking system time consistency.") try: cmd = "%s -t %s -l %s" % ( Local_CheckOs, ACTION_CHECK_TIME_CONSISTENCY, g_opts.localLog) (status, output, outputMap) = getCmdOutput(cmd) parRes = "" detail_msg = "" for node in list(status.keys()): outputMap[node] = outputMap[node].strip().split("\n")[0].strip() for node in list(status.keys()): if (status[node] != DefaultValue.SUCCESS): g_logger.logExit("[%s]: \n" % node + ErrorCode.GAUSS_516["GAUSS_51632"] % cmd + " Error: \n%s" % outputMap[node].strip()) if ((status[node] == DefaultValue.SUCCESS) and (outputMap[node].strip().split(',')[0].strip() == str(False))): g_OSCheckOpts['A12'][2] = 'Warning' parRes += " [%s]\n The NTPD not detected" \ " on machine and local time is \"%s\".\n"\ % (node, outputMap[node].strip().split(',')[1].strip()) if ((parRes == "") and (len(list(status.keys())) > 1)): nodeValue = list(status.keys())[0].strip() keystr = outputMap[nodeValue].strip().split(',')[1].strip() if (keystr == ""): g_OSCheckOpts['A12'][2] = 'Warning' parRes += " [%s]\n %s\n" % ( nodeValue, "Failed to obtain localtime information.") else: baseTime = datetime.strptime(keystr, "%Y-%m-%d %H:%M:%S") startTime = baseTime - timedelta(seconds=DEFAULT_INTERVAL) endTime = baseTime + timedelta(seconds=DEFAULT_INTERVAL) for node in list(status.keys()): if (status[node] == DefaultValue.SUCCESS): tmpstr = outputMap[node].strip().split(',')[1].strip() tmpTime = datetime.strptime(tmpstr, "%Y-%m-%d %H:%M:%S") if (tmpTime < startTime or tmpTime > endTime): g_OSCheckOpts['A12'][2] = 'Warning' parRes += " [%s]\n " \ "The current system time = (%s)\n"\ % (node, tmpstr) detail_msg += " [%s]\n Variable:" \ "'current system time' RealValue:" \ "'%s' ExpectedValue:'%s' " \ "[Warning]\n"\ % (node, tmpstr, baseTime.strftime("%Y-%m-%d %H:%M:%S")) if (g_OSCheckOpts['A12'][2] == 'Warning'): g_OSCheckOpts['A12'][3] = "\n%s" % parRes else: nodeValue = list(status.keys())[0].strip() keystr = outputMap[nodeValue].strip().split(',')[1].strip() g_OSCheckOpts['A12'][3] = "\n The ntpd service is " \ "started, local time is \"%s\"." % keystr g_OSCheckOpts['A12'][4] = "\n%s" % detail_msg except Exception as e: g_logger.debug(str(e)) g_logger.debug("Successfully checked system time consistency.") def checkFirewallService(): """ Checking firewall service """ g_logger.debug("Checking firewall service.") performCheckorSetOS(ACTION_CHECK_FIREWALL_SERVICE, "firewall", "The firewall service is stopped.", "A13", "Warning") g_logger.debug("Successfully checked firewall service.") def checkTHPService(): """ Checking THP service """ g_logger.debug("Checking THP service.") performCheckorSetOS(ACTION_CHECK_THP_SERVICE, "THP", "The THP service is stopped.", "A14", "Abnormal") g_logger.debug("Successfully checked THP service.") def getSetRemoveIPCValue(action_item, flag_str, flag_error, success_mesg, item_num, warning_level, configFile="", command=""): """ get the print information that is from setting removeipc value """ try: if command == "": command = Local_CheckOs if (configFile != ""): cmd = "%s -t %s -X '%s' -l '%s'"\ % (command, action_item, configFile, g_opts.localLog) else: cmd = "%s -t %s -l '%s'" % (command, action_item, g_opts.localLog) (status, output, outputMap) = getCmdOutput(cmd) message = "" parRes = "" for node in list(status.keys()): if (status[node] != DefaultValue.SUCCESS): g_logger.logExit("[%s]: \n" % node + ErrorCode.GAUSS_516["GAUSS_51632"] % cmd + " Error: \n%s" % outputMap[node].strip()) if (outputMap[node].find(flag_error) >= 0): parRes += "[%s]\n%s\n" % (node, outputMap[node]) if (outputMap[node].find(flag_str) >= 0): message += " [%s]\n%s\n" % (node, outputMap[node]) if (parRes != ""): raise Exception("%s" % parRes) if (g_OSCheckOpts[item_num][2] != warning_level): if (message != ""): g_OSCheckOpts[item_num][3] = "\n%s %s" % ( message, success_mesg) else: g_OSCheckOpts[item_num][3] = "\n %s" % success_mesg except Exception as e: g_logger.debug(str(e)) g_OSCheckOpts[item_num][2] = '%s' % warning_level g_OSCheckOpts[item_num][3] = "\n %s" % str(e) def getSetSessionProcess(action_item, flag_str, flag_error, success_mesg, item_num, warning_level, configFile="", command=""): """ get the print information that is from setting session process """ try: if command == "": command = Local_CheckOs if (configFile != ""): cmd = "%s -t %s -X '%s' -l '%s'"\ % (command, action_item, configFile, g_opts.localLog) else: cmd = "%s -t %s -l '%s'" % (command, action_item, g_opts.localLog) (status, output, outputMap) = getCmdOutput(cmd) message = "" parRes = "" for node in list(status.keys()): if (status[node] != DefaultValue.SUCCESS): g_logger.logExit("[%s]: \n" % node + ErrorCode.GAUSS_516["GAUSS_51632"] % cmd + " Error: \n%s" % outputMap[node].strip()) if (outputMap[node].find(flag_error) >= 0): parRes += "[%s]\n%s\n" % (node, outputMap[node]) if (outputMap[node].find(flag_str) >= 0): message += " [%s]\n%s\n" % (node, outputMap[node]) if (parRes != ""): raise Exception("%s" % parRes) if (g_OSCheckOpts[item_num][2] != warning_level): if (message != ""): g_OSCheckOpts[item_num][3] = "\n%s %s" % ( message, success_mesg) else: g_OSCheckOpts[item_num][3] = "\n %s" % success_mesg except Exception as e: g_logger.debug(str(e)) g_OSCheckOpts[item_num][2] = '%s' % warning_level g_OSCheckOpts[item_num][3] = "\n %s" % str(e) def getSetOSPrintInfo(action_item, flag_str, flag_error, success_mesg, item_num, warning_level, configFile="", command=""): """ get the print information that is from setting OS parameters """ try: if command == "": command = Local_CheckOs if (configFile != ""): cmd = "%s -t %s -X '%s' -l '%s'"\ % (command, action_item, configFile, g_opts.localLog) else: cmd = "%s -t %s -l '%s'" % (command, action_item, g_opts.localLog) (status, output, outputMap) = getCmdOutput(cmd) message = "" parRes = "" for node in list(status.keys()): if (status[node] != DefaultValue.SUCCESS): g_logger.logExit("[%s]: \n" % node + ErrorCode.GAUSS_516["GAUSS_51632"] % cmd + " Error: \n%s" % outputMap[node].strip()) if (outputMap[node].find(flag_error) >= 0): parRes += "[%s]\n%s\n" % (node, outputMap[node]) if (outputMap[node].find(flag_str) >= 0): message += " [%s]\n%s\n" % (node, outputMap[node]) if (parRes != ""): raise Exception("%s" % parRes) if (g_OSCheckOpts[item_num][2] != warning_level): if (message != ""): g_OSCheckOpts[item_num][3] = "\n%s %s" % ( message, success_mesg) else: g_OSCheckOpts[item_num][3] = "\n %s" % success_mesg except Exception as e: g_logger.debug(str(e)) g_OSCheckOpts[item_num][2] = '%s' % warning_level g_OSCheckOpts[item_num][3] = "\n %s" % str(e) def setSysCtlParameter(): """ Setting sysctl parameter value """ g_logger.debug("Setting sysctl parameter value.") getSetOSPrintInfo(ACTION_SET_SYSCTL_PARAMETER, "Set", "Failed", "Setting sysctl \ parameter values succeed.", "B1", "Abnormal", g_opts.confFile, Local_Check) g_logger.debug("Successfully setted the sysctl configuration parameters.") def setFileSystemConfigure(): """ Setting file system configuration """ g_logger.debug("Setting file system configuration.") getSetOSPrintInfo(ACTION_SET_FILESYSTEM_CONFIGURE, "Set", "Failed", "Setting soft file \ and hard file parameters succeed.", "B2", "Abnormal", g_opts.confFile, Local_Check) g_logger.debug("Successfully setted file system configuration.") def setBlockDevConfigure(): """ Setting Pre-read block size value """ g_logger.debug("Setting Pre-read block size value.") getSetOSPrintInfo(ACTION_SET_BLOCKDEV_CONFIGURE, "blockdev", "Failed", "Setting Pre-read block size value succeed.", "B3", "Abnormal") g_logger.debug("Successfully setted Pre-read block size value.") def setLogicalBlock(): """ Setting logical block size value """ g_logger.debug("Setting logical block size value.") performCheckorSetOS(ACTION_SET_LOGICAL_BLOCK, "Failed", "Setting logical block size value succeed.", "B3", "Abnormal") g_logger.debug("Successfully setted logical block size value.") def setRemoveIPCValue(): """ Setting removeipc value """ g_logger.debug("Setting RemoveIPC value.") getSetRemoveIPCValue(ACTION_SET_REMOVEIPC_VALUE, "Set", "Failed", "Setting sysctl \ parameter values succeed.", "B7", "Abnormal", g_opts.confFile, Local_CheckOs) g_logger.debug("Sucessfully setted RemoveIPC value.") def setSessionProcess(): """ Setting Session Process """ g_logger.debug("Setting Session Process.") getSetSessionProcess(ACTION_SET_SESSION_PROCESS, "Set", "Failed", "Setting sysctl \ parameter values succeed.", "B8", "Abnormal", g_opts.confFile, Local_CheckOs) g_logger.debug("Sucessfully Setted Session Process.") def setIOConfigure(): """ Setting IO scheduler value """ g_logger.debug("Setting IO scheduler value.") getSetOSPrintInfo(ACTION_SET_IO_CONFIGURE, "scheduler", "Failed", "Setting IO scheduler value succeed.", "B4", "Abnormal") g_logger.debug("Successfully setted IO scheduler value.") def setIOrequestqueue(): """ Setting IO request queue value """ g_logger.debug("Setting IO request queue value.") performCheckorSetOS(ACTION_SET_IO_REQUEST, "failed", "Setting IO request queue value succeed.", "B4", "Abnormal") g_logger.debug("Successfully setted IO request queue value.") def setMaxAsyIOrequests(): """ Setting Maximumasynchronous IO request queue value """ g_logger.debug("Setting Maximumasynchronous IO request queue value.") performCheckorSetOS(ACTION_SET_ASYNCHRONOUS_IO_REQUEST, "failed", "Setting Maximumasynchronous IO request queue value succeed.", "B4", "Abnormal", g_opts.confFile) g_logger.debug( "Successfully setted Maximumasynchronous IO request queue value.") def setNetworkConfigure(): """ Setting network card configuration """ g_logger.debug("Setting network card configuration.") getSetOSPrintInfo(ACTION_SET_NETWORK_CONFIGURE, "Set", "Failed", "Seting network card configuration succeed.", "B5", "Warning", g_opts.confFile) g_logger.debug("Successfully setted network card configuration.") def setTHPService(): """ Setting THP service """ g_logger.debug("Setting THP service.") getSetOSPrintInfo(ACTION_SET_THP_SERVICE, "Set", "Failed", "Setting THP server succeed.", "B6", "Abnormal") g_logger.debug("Sucessfully setted THP service.") def DisplayResultInformation(Item, output): """ display the result information """ if ("A" in g_opts.item_detail) or ("B" in g_opts.item_detail): if (Item in ("A1", "B1")): if (g_opts.detail): print("%s:\n %s: %s %s" % ( g_OSCheckOpts[Item][0], ("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2].ljust(10), g_OSCheckOpts[Item][3].ljust(DEFAULT_INTERVAL)), file=output) elif (g_opts.detail_all): print("%s:\n %s: %s %s" % (g_OSCheckOpts[Item][0], ("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2].ljust(10), g_OSCheckOpts[Item][4].ljust(DEFAULT_INTERVAL)), file=output) else: print("%s:\n %s: %s" % (g_OSCheckOpts[Item][0], ("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2]), file=output) else: if (g_opts.detail): print(" %s: %s %s" % (("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2].ljust(10), g_OSCheckOpts[Item][3].ljust(DEFAULT_INTERVAL)), file=output) elif (g_opts.detail_all): print(" %s: %s %s" % (("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2].ljust(10), g_OSCheckOpts[Item][4].ljust(DEFAULT_INTERVAL)), file=output) else: print(" %s: %s" % (("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2]), file=output) else: orderItems = [] for i in [CHECK_ITEMNUMLIST, SET_ITEMNUMLIST]: bb = [] for j in g_opts.item_detail: if j in i: bb.append(j) tmp = sorted(bb) bb = tmp if (bb != []): orderItems.append(bb[0]) if (Item in orderItems): if (g_opts.detail): print("%s\n %s: %s %s" % (g_OSCheckOpts[Item][0], ("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2].ljust(10), g_OSCheckOpts[Item][3].ljust(DEFAULT_INTERVAL)), file=output) elif (g_opts.detail_all): print("%s\n %s: %s %s" % (g_OSCheckOpts[Item][0], ("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2].ljust(10), g_OSCheckOpts[Item][4].ljust(DEFAULT_INTERVAL)), file=output) else: print("%s\n %s: %s" % (g_OSCheckOpts[Item][0], ("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2]), file=output) else: if (g_opts.detail): print(" %s: %s %s" % (("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2].ljust(10), g_OSCheckOpts[Item][3].ljust(DEFAULT_INTERVAL)), file=output) elif (g_opts.detail_all): print(" %s: %s %s" % (("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2].ljust(10), g_OSCheckOpts[Item][4].ljust(DEFAULT_INTERVAL)), file=output) else: print(" %s: %s" % (("%s%s" % (("%s." % Item).ljust(4), g_OSCheckOpts[Item][1])).ljust(DEFAULT_INTERVAL), g_OSCheckOpts[Item][2]), file=output) def cmp_item(item1, item2): """ sort item """ if (item1[0] < item2[0]): return -1 elif (item1[0] > item2[0]): return 1 else: if (int(item1[1:]) < int(item2[1:])): return -1 elif (int(item1[1:]) > int(item2[1:])): return 1 else: return 0 def checkHostnameList(): """ function: check the self.hostnameList is only local hostname input: NA output:NA """ # get the local hostname global host host = NetUtil.GetHostIpOrName() # if g_opts.hostnameList have only one value, # check it whether or not local hostname if (len(g_opts.hostnameList) == 1): if (g_opts.hostnameList[0] == NetUtil.GetHostIpOrName()): g_opts.localMode = True return try: # check the g_opts.hostnameList values are whether or not local IPs # obtain the all local IPs IPlist = NetUtil.getIpAddressList() IPlist.append(host) for ip in g_opts.hostnameList: if ip not in IPlist: return g_opts.localMode = True except Exception as ex: GaussLog.exitWithError(str(ex)) def getCmdOutput(cmd, ssh_conf=""): """ function: execute the cmd and get the output input: cmd output:status, output, outputMap """ if (g_opts.localMode == True): status = {} outputMap = {} outputCollect = [] (statusStr, output) = subprocess.getstatusoutput(cmd) if (statusStr != 0): status[host] = "Failure" else: status[host] = "Success" outputMap[host] = output else: gp_path = os.path.dirname(os.path.realpath(__file__)) (status, output) = g_sshTool.getSshStatusOutput(cmd, [], "", "%s/../" % gp_path, ssh_config=ssh_conf) outputMap = g_sshTool.parseSshOutput(g_sshTool.hostNames) return (status, output, outputMap) def getTmpFile(): ''' function : generate the check ID which is unique for once checking input : NA output : checkID ''' # Get Time while True: t = time.localtime(time.time()) dateString = time.strftime("%Y%m%d", t) seconds = timedelta(hours=t.tm_hour, minutes=t.tm_min, seconds=t.tm_sec).seconds pidString = str(os.getpid()) tmpFileName = "ssh_config" + "_" + dateString + "_"\ + str(seconds) + "_" + pidString tmpFile = os.path.join("/tmp", tmpFileName) if os.path.exists(tmpFile): time.sleep(1) else: return tmpFile def main(): """ main function """ if (os.getuid() != 0): GaussLog.exitWithError(ErrorCode.GAUSS_501["GAUSS_50104"]) global Local_CheckOs global Local_Check try: parseCommandLine() checkParameter() initGlobals() gpHome = os.path.dirname(os.path.realpath(__file__)) Local_CheckOs = OMCommand.getLocalScript("Local_CheckOS") Local_Check = OMCommand.getLocalScript("Local_Check") except Exception as e: GaussLog.exitWithError(str(e)) if ("A" in g_opts.item_detail): itemList = CHECK_ITEMNUMLIST elif ("B" in g_opts.item_detail): itemList = SET_ITEMNUMLIST else: sortList = sorted(g_opts.item_detail) itemList = sortList fp = None dirName = "%s/gspylib/etc/conf" % os.path.dirname( os.path.realpath(__file__)) configFile = "%s/check_list.conf" % dirName try: if (DefaultValue.checkInList(['A6', 'A7', 'A11', 'B1', 'B2', 'B5'], itemList) and (os.path.isfile(configFile) != True)): g_logger.logExit(ErrorCode.GAUSS_502["GAUSS_50201"] % configFile) if ((g_opts.localMode != True) and DefaultValue.checkInList(['A6', 'A7', 'A11', 'B1', 'B2', 'B5'], itemList)): g_sshTool.scpFiles(configFile, dirName, [], "", "%s/../" % gpHome) except Exception as ex: g_logger.logExit(str(ex)) try: output = sys.stdout if (g_opts.outputfile != ""): basepath = os.path.dirname(g_opts.outputfile) if (not os.path.isdir(basepath)): os.makedirs(basepath, ConstantsBase.KEY_DIRECTORY_PERMISSION) FileUtil.createFileInSafeMode(g_opts.outputfile) fp = open(g_opts.outputfile, "w") output = fp g_logger.log("Performing operation system check/set." " Output the result to the file %s." % g_opts.outputfile) for item in itemList: if (g_opts.set == False): doCheckOS(item) else: doSetOS(item) DisplayResultInformation(item, output) if (fp): fp.flush() fp.close() if g_opts.outputfile != "": os.chmod(g_opts.outputfile, ConstantsBase.KEY_FILE_PERMISSION) g_logger.log("Operation system check/set is completed.") except Exception as ex: if fp: fp.flush() fp.close() g_logger.logExit(ErrorCode.GAUSS_502["GAUSS_50205"] % g_opts.outputfile + "Error: %s" % str(ex)) totalNum = 0 abnormalNum = 0 warningNum = 0 for key in itemList: totalNum += 1 if (g_OSCheckOpts[key][2] == "Abnormal"): abnormalNum += 1 elif (g_OSCheckOpts[key][2] == "Warning"): warningNum += 1 if (g_opts.set): g_logger.log("NOTICE: MTU value and some warning items can NOT be set." " Please do it manually.") g_logger.log("Total numbers:%d. Abnormal numbers:%d. Warning numbers:%d." % (totalNum, abnormalNum, warningNum)) if (abnormalNum > 0): if (g_opts.set == False): g_logger.log("Do checking operation finished. Result: Abnormal.") else: g_logger.log("Do setting operation finished. Result: Abnormal.") g_logger.closeLog() sys.exit(0) # the main entry for this script if __name__ == '__main__': main()