#!/usr/bin/python #encoding=utf-8 # -*-coding:utf-8 -*- import os, sys, string import MySQLdb import xml.dom.minidom import xml.etree.ElementTree as ET import time, datetime from xml.etree.ElementTree import ElementTree from xml.etree.ElementTree import Element from xml.etree.ElementTree import SubElement from xml.etree.ElementTree import dump from xml.etree.ElementTree import Comment from xml.etree.ElementTree import tostring reload(sys) sys.setdefaultencoding('utf-8') filename="CAS-check-result.xml" CAS =ElementTree() purOrder =Element("CASCheck") CAS._setroot(purOrder) print "H3C CAS-Checking Start." def getTime(): time.localtime(time.time()) currentTime = '' currentTime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) return currentTime def exeSql(sql): cursor.execute(sql) return cursor.fetchone() def indent(elem,level=0): i ="\n"+level*" " #print elem; if len(elem): if not elem.text or not elem.text.strip(): elem.text = i + " " for e in elem: #print e indent(e,level+1) if not e.tail or not e.tail.strip(): e.tail =i if level and (not elem.tail or not elem.tail.strip()): elem.tail =i return elem #CVM主機的版本信息,全局有效 versionCVM = '' versionCVMBig = '' versionCVMSmall = '' ##################################查詢CAS版本是否知足巡檢要求,開始################################## lines = 0 cmdTmp = 'find /etc/ -name h3c_cas_cvk-version' textlist = os.popen(cmdTmp).readlines() lines = len(textlist) if (lines > 0): cmd = 'cat /etc/h3c_cas_cvk-version' else: cmdTmp = 'find /etc/ -name cas_cvk-version' textlist = os.popen(cmdTmp).readlines() lines = 0 lines = len(textlist) if(lines > 0): cmd = 'cat /etc/cas_cvk-version' else: #XML內容編寫 checkName = '查詢巡檢工具訪問的主機是否爲CVM主機'.decode('utf-8') suggest = '確保巡檢工具訪問的主機爲CVM主機'.decode('utf-8') itemXML = Element("CVM",{'name':checkName, 'suggest':suggest}) result = '異常'.encode('utf-8') desc = '巡檢工具訪問的主機是不CVM主機'.encode('utf-8') SubElement(itemXML, 'host', {'result':result, 'desc':desc}) #生成XML內容 purOrder.append(itemXML) indent(purOrder) CAS.write(filename,"utf-8",True) print "H3C CAS-Checking failed for the host is not CVM." #退出巡檢 exit() #XML文件中的檢查項目,以及建議說明 checkName = '查詢CAS版本是否知足巡檢要求'.encode('utf-8') suggest = '確保CAS3.0版本知足巡檢要求,要求版本至少爲E0301'.encode('utf-8') itemXML = Element("versionCAS",{'name':checkName, 'suggest':suggest}) textlist = os.popen(cmd).readlines() tmpText = textlist[0] #查詢CVM主機的版本信息: findIdex = tmpText.find('.') if findIdex > -1: #獲取CAS大版本信息 versionCVMBig = tmpText[findIdex-1:findIdex+2] #獲取小版本信息 tmpVersionSmall = tmpText[findIdex+3:] findIdex = tmpVersionSmall.find(' ') if findIdex > -1: versionCVMSmall = tmpVersionSmall[:findIdex] versionCVM = versionCVMBig + ' (' + versionCVMSmall + ')' if(float(versionCVMBig) >= 3.0): #XML內容編寫 versionCAS = versionCVM result = '正常'.encode('utf-8') desc = 'CAS版本知足巡檢要求'.encode('utf-8') SubElement(itemXML, 'version', {'versionCAS':versionCAS, 'result':result, 'desc':desc}) #生成XML內容 purOrder.append(itemXML) else: #XML內容編寫 versionCAS = versionCVM result = '異常'.encode('utf-8') desc = 'CAS版本沒法知足巡檢要求'.encode('utf-8') SubElement(itemXML, 'version', {'versionCAS':versionCAS, 'result':result, 'desc':desc}) #生成XML內容 purOrder.append(itemXML) indent(purOrder) CAS.write(filename,"utf-8",True) print "H3C CAS-Checking failed for the CAS version is wrong." #退出巡檢 exit() else: #XML內容編寫 versionCAS = '' result = '異常'.encode('utf-8') desc = '沒法查詢到CAS版本信息'.encode('utf-8') SubElement(itemXML, 'version', {'versionCAS':versionCAS, 'result':result, 'desc':desc}) #生成XML內容 purOrder.append(itemXML) indent(purOrder) CAS.write(filename,"utf-8",True) print "H3C CAS-Checking failed for the host has no CAS version file." #退出巡檢 exit() ##################################查詢CAS版本是否知足巡檢要求,結束################################## ##################################檢查是否爲CVM主機,開始################################## #XML文件中的檢查項目,以及建議說明 checkName = '查詢巡檢工具訪問的主機是否爲CVM主機'.decode('utf-8') suggest = '確保巡檢工具訪問的主機爲CVM主機'.decode('utf-8') itemXML = Element("CVM",{'name':checkName, 'suggest':suggest}) #0:表示Tomcat服務未運行;1:表示Tomcat服務正常運行 isTomcat = 0 #0:表示主機未部署CVM軟件包cas.war;1:表示主機部署了CVM軟件包cas.war isCVM = 0 #當主機安裝了CVM軟件包,而且Tomcat服務正常運行,則表示該主機爲CVM主機 isCVMHost = 0 ###########查詢主機是否部署了CVM的軟件包cas.war,開始########### if (float(versionCVMBig) < 3.0): cmd = 'find /var/lib/tomcat6/webapps -name cas.war' else: #CAS3.0升級到了tomcat8服務 cmd = 'find /var/lib/tomcat8/webapps -name cas.war' #執行查詢命令 textlist = os.popen(cmd).readlines() lines = len(textlist) if (lines > 0): #分析查詢結果 tmpText = textlist[0] findIdex = tmpText.find('cas.war') if findIdex > -1: isCVM = 1 #部署了CVM軟件包cas.war else: isCVM = 0 #未部署CVM軟件包cas.war else: isCVM = 0 #未部署CVM軟件包cas.war ###########查詢主機是否部署了CVM的軟件包cas.war,結束########### ###########查詢Tomcat服務是否正常運行,開始########### if (float(versionCVMBig) < 3.0): cmd = 'service tomcat6 status' else: #CAS3.0升級到了tomcat8服務 cmd = 'service tomcat8 status' #執行查詢命令 textlist = os.popen(cmd).readlines() lines = len(textlist) if (lines > 0): #分析查詢結果 tmpText = textlist[0] findIdex = tmpText.find('is running') if findIdex > -1: isTomcat = 1 #Tomcat服務正常運行 else: isTomcat = 0 #Tomcat服務未運行 else: isTomcat = 0 #Tomcat服務未運行 ###########查詢Tomcat服務是否正常運行,結束########### #若是是CVM主機,則繼續巡檢,不然退出巡檢工做 if (isCVM == 1 and isTomcat == 1): isCVMHost = 1 else: isCVMHost = 0 if (isCVMHost == 1): #XML內容編寫 result = '正常'.encode('utf-8') desc = '巡檢工具訪問的主機是CVM主機'.encode('utf-8') SubElement(itemXML, 'host', {'result':result, 'desc':desc}) #生成XML內容 purOrder.append(itemXML) else: #XML內容編寫 result = '異常'.encode('utf-8') desc = '巡檢工具訪問的主機是不CVM主機,請檢查配置是否正確'.encode('utf-8') SubElement(itemXML, 'host', {'result':result, 'desc':desc}) #生成XML內容 purOrder.append(itemXML) indent(purOrder) CAS.write(filename,"utf-8",True) print "H3C CAS-Checking failed for the host is not CVM or not Master CVM." #退出巡檢 exit() ##################################檢查是否爲CVM主機,結束################################## try: conn = MySQLdb.connect(host="localhost",user="root",passwd="1q2w3e",db="vservice",charset="utf8") except Exception, e: print e sys.exit() cursor =conn.cursor() ##################################查詢CAS版本是否知足巡檢要求,結束################################## checkNum = 1 ##################################集羣高可靠性配置,開始################################## print "num=%s, %s: Check Cluster's HA conf. Starting" % (checkNum, getTime()) #XML文件中的檢查項目,以及建議說明 checkName = '檢查集羣高可靠性(HA)功能'.encode('utf-8') level = '重要'.encode('utf-8') suggest = '建議開啓集羣高可靠性(HA)功能'.encode('utf-8') itemXML = Element("clusterHA",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select cluster.NAME from TBL_CLUSTER cluster where cluster.ENABLE_HA = 0" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #XML內容編寫 clusterName = row[0] state = '未開啓'.encode('utf-8') SubElement(itemXML, 'Cluster', {'index':str(index), 'clusterName':clusterName, 'state':state}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check Cluster's HA conf. Successful" % (checkNum, getTime()) checkNum += 1 ##################################集羣高可靠性配置,結束################################## ##################################計算資源DRS配置,開始################################## print "num=%s, %s: Check Cluster's Computer DRS conf. Starting" % (checkNum, getTime()) #XML文件中的檢查項目,以及建議說明 checkName = '檢查集羣計算資源DRS功能'.encode('utf-8') level = '重要'.encode('utf-8') suggest = '建議開啓集羣計算資源DRS功能'.encode('utf-8') itemXML = Element("clusterDRS",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select cluster.NAME from TBL_CLUSTER cluster where cluster.ENABLE_LB = 0" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #XML內容編寫 clusterName = row[0] state = '未開啓'.encode('utf-8') SubElement(itemXML, 'Cluster', {'index':str(index), 'clusterName':clusterName, 'state':state}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check Cluster's Computer DRS conf. Successful" % (checkNum, getTime()) checkNum += 1 ##################################計算資源DRS配置,結束################################## ##################################查詢CVK版本是否與CVM版本一致,開始################################## print "num=%s, %s: Check 'the version of CVK host is equal with CVM host'. Starting" % (checkNum, getTime()) #XML文件中的檢查項目,以及建議說明 checkName = '檢查CVK主機和CVM主機的CAS版本是否一致'.encode('utf-8') level = '重要'.encode('utf-8') suggest = 'CVK主機和CVM主機的CAS版本必須保持一致'.encode('utf-8') itemXML = Element("version",{'name':checkName, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.CVK_VERSION from TBL_HOST host" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #判斷CVK的版本是否於CVM一致 if row[1] != versionCVM: #XML內容編寫 hostName = row[0] versionCVK = row[1] SubElement(itemXML, 'Host', {'index':str(index), 'hostName':hostName, 'versionCVK':versionCVK, 'versionCVM':versionCVM}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'the version of CVK host is equal with CVM host'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################查詢CVK版本是否與CVM版本一致,結束################################## ##################################主機狀態,開始################################## print "num=%s, %s: Check 'the host status'. Starting" % (checkNum, getTime()) checkName = '檢查主機狀態是否正常'.encode('utf-8') level = '重要'.encode('utf-8') suggest = '確保全部主機狀態正常'.encode('utf-8') itemXML = Element("hostState",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.STATUS, host.MAINTAIN from TBL_HOST host" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #主機處於「不正常」狀態 if row[1] == 0: #XML內容編寫 hostName = row[0] hostState = '不正常'.encode('utf-8') SubElement(itemXML, 'Host', {'index':str(index), 'hostName':hostName, 'state':hostState}) index += 1 #主機處於運行,可是進入了維護模式 elif row[1] == 1: if row[2] == 1: #XML內容編寫 hostName = row[0] hostState = '維護模式'.encode('utf-8') SubElement(itemXML, 'Host', {'index':str(index), 'hostName':hostName, 'state':hostState}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'the host status'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################主機狀態,結束################################## ##################################NTP配置,開始################################## print "num=%s, %s: Check 'the NTP config'. Starting" % (checkNum, getTime()) checkName = '檢查NTP服務器配置'.encode('utf-8') level = '重要'.encode('utf-8') suggest = '建議配置主備NTP服務器'.encode('utf-8') itemXML = Element("NTPServer",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select parameter.VALUE from TBL_PARAMETER parameter where parameter.NAME = 'ntp.server'" #查詢數據庫 cursor.execute(sql) while (True): row = cursor.fetchone() if row == None: break MasterNTPServer = '' if row[0] == None: #XML內容編寫 ntpstate = '未配置'.encode('utf-8') SubElement(itemXML, 'masterNTPServer', {'state':ntpState}) else: MasterNTPServer = str(row[0]) #定義數據庫查詢SQL語句 sql = "select parameter.VALUE from TBL_PARAMETER parameter where parameter.NAME = 'ntp.standbyserver'" #查詢數據庫 cursor.execute(sql) while (True): row = cursor.fetchone() if row == None: break StandbyNTPServer = '' if row[0] == None: #XML內容編寫 ntpState = '未配置'.encode('utf-8') SubElement(itemXML, 'stangbyNTPServer', {'state':ntpState}) else: StandbyNTPServer = str(row[0]) #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'the NTP config'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################NTP配置:,結束################################## ##################################主機時間差別對比,開始################################## print "num=%s, %s: Check 'the system time diff between CVM host and CVK host'. Starting" % (checkNum, getTime()) checkName = '檢查CVK和CVM主機的時間差'.encode('utf-8') level = '重要'.encode('utf-8') suggest = 'CVK和CVM主機的系統時間須要保持一致'.encode('utf-8') itemXML = Element("hostTime",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR from TBL_HOST host where host.STATUS = 1" #查詢數據庫 cursor.execute(sql) numRows = int(cursor.rowcount) hostNames = [''] * numRows dateCVK = [''] * numRows dateCVM = datetime.datetime.now() dateCVMformat = dateCVM.strftime('%Y-%m-%d %H:%M:%S') timeCVM = time.mktime(dateCVM.timetuple()) Num = 0 while (True): row = cursor.fetchone() if row == None: break hostNames[Num] = row[0] #經過date命令查詢主機下的系統時間 cmd = "ssh %s 'date -R'" % (row[1]) textlist = os.popen(cmd).readlines() tmpDate = str(textlist[0]) dateCVK[Num] = tmpDate[:-1] Num += 1 index = 1 Num = 0 while Num < numRows: dateTmp = datetime.datetime.strptime(dateCVK[Num], '%a, %d %b %Y %H:%M:%S +0800') timeCVK = time.mktime(dateTmp.timetuple()) if timeCVM >= timeCVK: diffTime = timeCVM - timeCVK else: diffTime = timeCVK - timeCVM if diffTime >= 60: #XML內容編寫 hostName = hostNames[Num] SubElement(itemXML, 'SysTime', {'index':str(index), 'hostName':hostName, 'timeCVK':str(dateTmp), 'timeCVM':str(dateCVMformat)}) index += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'the system time diff between CVM host and CVK host'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################主機時間差別對比,結束################################## ##################################主機系統時間和物理時間差別對比,開始################################## print "num=%s, %s: Check 'the time diff between System and Hardware'. Starting" % (checkNum, getTime()) checkName = '檢查主機系統時間和物理時鐘的時間差'.encode('utf-8') level = '重要'.encode('utf-8') suggest = '主機系統時間和物理時鐘須要保持一致'.encode('utf-8') itemXML = Element("hostHWTime",{'name':checkName, 'level':level, 'suggest':suggest}) #獲取CVM主機名稱 cmd = 'hostname' textlist = os.popen(cmd).readlines() hostNameTemp = textlist[0] hostNameCVM = hostNameTemp[:-1] #查詢CVM主機是否被加入到主機池 sql = "select host.NAME, host.IPADDR from TBL_HOST host where host.NAME = '%s'" % (hostNameCVM) cursor.execute(sql) numRows = int(cursor.rowcount) #若是CVM主機沒有加入主機池,則查詢CVM主機的系統時間和物理時鐘 if (numRows == 0): #查詢CVM主機的系統時間和物理時鐘 dateCVM_SYS = datetime.datetime.now() dateSystemFormat = dateCVM_SYS.strftime('%Y-%m-%d %H:%M:%S') timeCVM_SYS = time.mktime(dateCVM.timetuple()) #查詢物理時鐘及處理 cmd = "hwclock" textlist = os.popen(cmd).readlines() tmpTime_HW_CHAR = textlist[0] index = 1 findIdex = tmpTime_HW_CHAR.find('CST') if findIdex > -1: time_HW_CHAR = tmpTime_HW_CHAR[:findIdex - 1] dateCVM_HW = datetime.datetime.strptime(time_HW_CHAR, '%a %d %b %Y %I:%M:%S %p') timeCVM_HW = time.mktime(dateCVM_HW.timetuple()) if timeCVM_SYS >= timeCVM_HW: diffTime = timeCVM_SYS - timeCVM_HW else: diffTime = timeCVM_HW - timeCVM_SYS if diffTime >= 60: #XML內容編寫 SubElement(itemXML, 'HWTime', {'index':str(index), 'hostName':hostNameCVM, 'timeSystem':str(dateSystemFormat), 'timeHW':str(dateCVM_HW)}) index += 1 #############################查詢CVK主機的系統時間和物理時鐘是否一致 #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR from TBL_HOST host where host.STATUS = 1" #查詢數據庫 cursor.execute(sql) while (True): row = cursor.fetchone() if row == None: break #經過date命令查詢主機下的系統時間 cmd = "ssh %s 'date -R'" % (row[1]) textlist = os.popen(cmd).readlines() tmpTime_SYS_CHAR = str(textlist[0]) time_SYS_CHAR = tmpTime_SYS_CHAR[:-1] dateCVK_SYS = datetime.datetime.strptime(time_SYS_CHAR, '%a, %d %b %Y %H:%M:%S +0800') timeCVK_SYS = time.mktime(dateCVK_SYS.timetuple()) #查詢物理時鐘及處理 cmd = "hwclock" textlist = os.popen(cmd).readlines() tmpTime_HW_CHAR = textlist[0] findIdex = tmpTime_HW_CHAR.find('CST') if findIdex > -1: time_HW_CHAR = tmpTime_HW_CHAR[:findIdex - 1] dateCVK_HW = datetime.datetime.strptime(time_HW_CHAR, '%a %d %b %Y %I:%M:%S %p') timeCVK_HW = time.mktime(dateCVK_HW.timetuple()) if timeCVK_SYS >= timeCVK_HW: diffTime = timeCVK_SYS - timeCVK_HW else: diffTime = timeCVK_HW - timeCVK_SYS if diffTime >= 60: #XML內容編寫 hostName = row[0] SubElement(itemXML, 'HWTime', {'index':str(index), 'hostName':hostName, 'timeSystem':str(dateCVK_SYS), 'timeHW':str(dateCVK_HW)}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'the time diff between System and Hardware'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################主機系統時間和物理時間差別對比,結束################################## ##################################主機CPU利用率信息,開始################################## print "num=%s, %s: Check 'CPU use of the host'. Starting" % (checkNum, getTime()) checkName = '檢查主機CPU利用率'.encode('utf-8') level = '緊急'.encode('utf-8') suggest = '建議主機CPU利用率不要超過80%'.encode('utf-8') itemXML = Element("useHostCPU",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, hostDetail.CPU_RATE, max(hostDetail.TIME) from TBL_HOST_CPU_MEM_DETAIL hostDetail, TBL_HOST host where hostDetail.HOST_ID = host.ID and host.STATUS = 1 group by hostDetail.HOST_ID" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #若是主機的CPU利用率超過閾值,則顯示 if (row[1] >= 80): #XML內容編寫 hostName = row[0] useCPU = str(row[1]) + '%' SubElement(itemXML, 'CPU', {'index':str(index), 'hostName':hostName, 'useCPU':useCPU}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'CPU use of the host'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################主機CPU利用率信息,結束################################## ##################################主機MEM利用率信息,開始################################## print "num=%s, %s: Check 'Memory use of the host'. Starting" % (checkNum, getTime()) checkName = '檢查主機內存利用率'.encode('utf-8') level = '緊急'.encode('utf-8') suggest = '建議主機內存利用率不要超過80%'.encode('utf-8') itemXML = Element("useHostMem",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, hostDetail.MEMORY_RATE, max(hostDetail.TIME) from TBL_HOST_CPU_MEM_DETAIL hostDetail, TBL_HOST host where hostDetail.HOST_ID = host.ID and host.STATUS = 1 group by hostDetail.HOST_ID" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #若是主機的內存利用率超過閾值,則顯示 if (row[1] >= 80): #XML內容編寫 hostName = row[0] useCPU = str(row[1]) + '%' SubElement(itemXML, 'Memory', {'index':str(index), 'hostName':hostName, 'useMem':useCPU}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'Memory use of the host'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################主機MEM利用率信息,結束################################## ##################################主機分區利用率信息,開始################################## print "num=%s, %s: Check 'Partition use of the host'. Starting" % (checkNum, getTime()) checkName = '檢查主機分區利用率'.encode('utf-8') level = '緊急'.encode('utf-8') suggest = '建議主機分區利用率不要超過80%'.encode('utf-8') itemXML = Element("useHostPartition",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.ID from TBL_HOST host where host.STATUS = 1" #查詢數據庫 cursor.execute(sql) numRows = int(cursor.rowcount) hostName = [''] * numRows hostID = [''] * numRows Num = 0 while (True): row = cursor.fetchone() if row == None: break hostName[Num] = row[0] hostID[Num] = row[1] Num += 1 index = 1 Num = 0 while Num < numRows: #定義數據庫查詢SQL語句 sql = "select host.NAME, p.PARTITION_NAME, p.PARTITION_TYPE, p.MOUNTED_DIR, max(p.LAST_UPDATE_TIME), p.SIZE, p.USED from TBL_HOST_PARTITION_DETAIL p, TBL_HOST host where host.ID = p.HOST_ID and p.HOST_ID = %s and p.LAST_UPDATE_TIME >= (select max(p.LAST_UPDATE_TIME) from TBL_HOST_PARTITION_DETAIL p where p.HOST_ID = %s) group by p.HOST_ID, p.MOUNTED_DIR" % (hostID[Num], hostID[Num]) #查詢數據庫 cursor.execute(sql) while (True): row = cursor.fetchone() if row == None: break #若是主機下的分區利用率超過閾值,則顯示 if ((row[6]/row[5])*100 >= 80): #XML內容編寫 hostName = row[0] deviceName = row[1] fileSystemType = row[2] mountPoint = row[3] usePartition = "%.2f" % (float(row[6])/float(row[5]) * 100) SubElement(itemXML, 'Partition', {'index':str(index), 'hostName':hostName, 'deviceName':deviceName, 'fileSystemType':fileSystemType, 'mountPoint':mountPoint, 'usePartition':str(usePartition)+'%'}) index += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'Partition use of the host'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################主機分區利用率信息,結束################################## ##################################虛擬交換機狀態,開始################################## print "num=%s, %s: Check 'vSwitch status'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬交換機狀態'.encode('utf-8') level = '重要'.encode('utf-8') suggest = '確保虛擬交換機狀態正常'.encode('utf-8') itemXML = Element("vSwitchState",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, vswitch.NAME from TBL_VSWITCH vswitch, TBL_HOST host where vswitch.HOST_ID = host.ID and host.STATUS = 1 order by host.ID" #查詢數據庫 cursor.execute(sql) index = 1 Num = 0 while (True): row = cursor.fetchone() if row == None: break #查詢虛擬交換機狀態 cmd = "ssh %s 'ip link | grep %s'" % (row[1], row[2]) textlist = os.popen(cmd).readlines() tmpSwitch = str(textlist[0]) findIdex = tmpSwitch.find('UP') if (findIdex == -1): #XML內容編寫 hostName = row[0] vSwitchName = row[2] vSwitchState = '不活動'.encode('utf-8') SubElement(itemXML, 'vSwitch', {'index':str(index), 'hostName':hostName, 'vSwitchName':vSwitchName, 'vSwitchState':vSwitchState}) index += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'vSwitch status'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬交換機狀態,結束################################## ##################################主機下只有一個管理虛擬交換機,開始################################## print "num=%s, %s: Check 'the host has a manager vswitch'. Starting" % (checkNum, getTime()) checkName = '檢查主機是否只有管理虛擬交換機'.encode('utf-8') level = '重要'.encode('utf-8') suggest = '管理、存儲和業務虛擬交換機不能合併使用'.encode('utf-8') itemXML = Element("vSwitchState",{'name':checkName, 'level':level, 'suggest':suggest}) #查詢主機名稱 sql = "select host.ID, host.NAME from TBL_HOST host order by host.ID" #查詢數據庫 cursor.execute(sql) numHostRows = int(cursor.rowcount) hostID = [''] * numHostRows hostName = [''] * numHostRows ii = 0 while (True): row = cursor.fetchone() if row == None: break hostID[ii] = row[0] hostName[ii] = row[1] ii += 1 #查詢主機下的虛擬交換機名稱 index = 1 numHost = 0 while numHost < numHostRows: #查詢虛擬交換機名稱 sql = "select vswitch.NAME from TBL_VSWITCH vswitch where vswitch.HOST_ID = %s order by vswitch.NAME" % (hostID[numHost]) #查詢數據庫 cursor.execute(sql) numVSwitch = int(cursor.rowcount) if numVSwitch == 1: row = cursor.fetchone() #XML內容編寫 hostName = hostName[numHost] vSwitchName = row[0] num = 1 SubElement(itemXML, 'vSwitch', {'index':str(index), 'hostName':hostName, 'vSwitchNums':'1', 'vSwitchName':vSwitchName}) index += 1 numHost += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'the host has a manager vswitch'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################主機下只有一個管理虛擬交換機,結束################################## ##################################虛擬交換機的網卡狀態,開始################################## print "num=%s, %s: Check 'Eth status of the vSwitch'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬交換機的網卡狀態'.encode('utf-8') level = '重要'.encode('utf-8') suggest = '確保虛擬交換機綁定的物理網卡狀態正常'.encode('utf-8') itemXML = Element("vSwitchEth",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, host.STATUS, vswitch.NAME, vswitch_pnic.PNIC from TBL_VSWITCH vswitch, TBL_VSWITCH_PNIC vswitch_pnic, TBL_HOST host where vswitch.HOST_ID = host.ID and vswitch.ID = vswitch_pnic.VSWITCH_ID" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #若是主機未正常運行,則繼續查詢下一臺主機 if (row[2] != 1): continue eths = row[4] #判斷虛擬交換機是否作都網卡綁定 findIdex = eths.find('eth') if findIdex == -1: continue for eth in eths.split(','): cmd = "ssh %s 'ethtool %s'" % (row[1], eth) textEth = os.popen(cmd).readlines() lines = len(textEth) #查詢狀態異常的網卡 findIdex = textEth[lines-1].find('Link detected: no') if findIdex > -1: #XML內容編寫 hostName = row[0] vSwitchName = row[3] ethName = eth ethState = '不活動'.encode('utf-8') SubElement(itemXML, 'Eth', {'index':str(index), 'hostName':hostName, 'vswitchName':vSwitchName, 'ethName':ethName, 'ethState':ethState}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'Eth status of the vSwitch'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬交換機的網卡狀態,結束################################## ##################################虛擬交換機鏈路冗餘配置,開始################################## print "num=%s, %s: Check 'Eth bond of the vSwitch'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬交換機的鏈路冗餘狀態'.encode('utf-8') level = '重要'.encode('utf-8') suggest = '建議虛擬交換機綁定多個物理網卡,提升鏈路冗餘性'.encode('utf-8') itemXML = Element("vSwitchEthBond",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, vswitch.NAME, vswitch_pnic.PNIC from TBL_VSWITCH vswitch, TBL_VSWITCH_PNIC vswitch_pnic, TBL_HOST host where vswitch.HOST_ID = host.ID and vswitch.ID = vswitch_pnic.VSWITCH_ID order by host.NAME, vswitch.NAME" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break eths = row[2] #判斷虛擬交換機是否作都網卡綁定 findIdex = eths.find('eth') if findIdex > -1: findIdex = eths.find(',') if findIdex == -1: #XML內容編寫 hostName = row[0] vSwitchName = row[1] ethName = row[2] SubElement(itemXML, 'vSwitch', {'index':str(index), 'hostName':hostName, 'vSwitchName':vSwitchName, 'ethName':ethName}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'Eth bond of the vSwitch'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬交換機鏈路冗餘配置,結束################################## ##################################集羣下CVK主機的虛擬交換機名稱是否一致,開始################################## print "num=%s, %s: Check 'the host's vSwitch name of cluster is equal'. Starting" % (checkNum, getTime()) checkName = '檢查集羣下CVK主機的虛擬交換機名稱是否一致'.encode('utf-8') level = '緊急'.encode('utf-8') suggest = '確保集羣下CVK主機的虛擬交換機名稱保持一致'.encode('utf-8') itemXML = Element("vSwitchDiff",{'name':checkName, 'level':level, 'suggest':suggest}) #查詢集羣名 sql = "select cluster.ID, cluster.NAME from TBL_CLUSTER cluster" #查詢數據庫 cursor.execute(sql) numClusterRows = int(cursor.rowcount) clusterName = [''] * numClusterRows clusterID = [''] * numClusterRows #查詢集羣ID和集羣名稱 Num = 0 while (True): row = cursor.fetchone() if row == None: break clusterID[Num] = row[0] clusterName[Num] = row[1] Num += 1 #查詢各個集羣下CVK主機的虛擬交換機名稱 index = 1 numCluster = 0 while numCluster < numClusterRows: #查詢集羣下的主機名稱 sql = "select host.ID, host.NAME from TBL_HOST host where host.CLUSTER_ID = %s order by host.ID" % (clusterID[numCluster]) #查詢數據庫 cursor.execute(sql) numHostRows = int(cursor.rowcount) hostID = [''] * numHostRows hostName = [''] * numHostRows ii = 0 while (True): row = cursor.fetchone() if row == None: break hostID[ii] = row[0] hostName[ii] = row[1] ii += 1 #查詢主機下的虛擬交換機名稱 numHost = 0 vswitchName = [''] * numHostRows while numHost < numHostRows: #查詢虛擬交換機名稱 sql = "select vswitch.NAME from TBL_VSWITCH vswitch where vswitch.HOST_ID = %s order by vswitch.NAME" % (hostID[numHost]) #查詢數據庫 cursor.execute(sql) i = 0 while (True): row = cursor.fetchone() if row == None: break if i == 0: vswitchName[numHost] = row[0] i = 1 else: vswitchName[numHost] = vswitchName[numHost] + ',' + row[0] #print ' ', clusterName[numCluster], hostName[numHost], vswitchName[numHost] numHost += 1 #比較主機間的虛擬交換機名稱是否一致 i = 0 while i < numHostRows: j = i + 1 while j < numHostRows: if vswitchName[j] != vswitchName[i]: #print ' ', clusterName[numCluster], hostName[i], vswitchName[i] #print ' ', clusterName[numCluster], hostName[j], vswitchName[j] #XML內容編寫 clusterNameTmp = clusterName[numCluster] hostName01 = hostName[i] vswitchName01 = vswitchName[i] hostName02 = hostName[j] vswitchName02 = vswitchName[j] groupXML = SubElement(itemXML, 'Group', {'index':str(index), 'clusterName':clusterNameTmp, 'hostName01':hostName01, 'hostName02':hostName02}) SubElement(groupXML, "vSwitch",{'hostName':hostName01, 'vswitchName':vswitchName01}) SubElement(groupXML, "vSwitch",{'hostName':hostName02, 'vswitchName':vswitchName02}) index += 1 j += 1 i += 1 numCluster += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'the host's vSwitch name of cluster is equal'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################集羣下CVK主機的虛擬交換機名稱是否一致,結束################################## ##################################主機的存儲池狀態,開始################################## print "num=%s, %s: Check 'StoragePool status'. Starting" % (checkNum, getTime()) checkName = '檢查存儲池狀態'.encode('utf-8') level = '緊急'.encode('utf-8') suggest = '確保存儲池狀態正常'.encode('utf-8') itemXML = Element("StoragePoolState",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, host.HOST_USER, host.PW, host.STATUS from TBL_HOST host where host.STATUS = 1" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #經過'virsh pool-list'命令查詢主機下的全部存儲池的名稱和狀態信息 cmd = "ssh %s 'virsh pool-list --all'" % (row[1]) textlist = os.popen(cmd).readlines() lines = len(textlist) line = 2 poolName = ' ' while line < lines - 1: #查詢存儲池狀態是否爲「不活動」 findIdex = textlist[line].find('inactive') if findIdex > -1: #查詢存儲池名稱 findIdex = textlist[line].find(' ') if findIdex > -1: tmpPoolName = textlist[line] poolName = tmpPoolName[:findIdex] #XML內容編寫 hostName = row[0] storagePoolName = poolName storagePoolState = '不活動'.encode('utf-8') SubElement(itemXML, 'StoragePool', {'index':str(index), 'hostName':hostName, 'storagePoolName':storagePoolName, 'storagePoolState':storagePoolState}) index += 1 else: line += 1 continue line += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'StoragePool status'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################主機的存儲池狀態,結束################################## ##################################主機的存儲池利用率,開始################################## print "num=%s, %s: Check 'StoragePool use'. Starting" % (checkNum, getTime()) checkName = '檢查存儲池利用率'.encode('utf-8') level = '緊急'.encode('utf-8') suggest = '確保存儲池利用率不超過80%'.encode('utf-8') itemXML = Element("StoragePoolUse",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, host.HOST_USER, host.PW, host.STATUS from TBL_HOST host where host.STATUS = 1" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #經過'virsh pool-list'命令查詢主機下的全部存儲池的名稱和狀態信息 cmd = "ssh %s 'virsh pool-list --all'" % (row[1]) textlist = os.popen(cmd).readlines() lines = len(textlist) line = 2 poolState = 0 poolName = ' ' while line < lines - 1: #查詢存儲池狀態是否爲「不活動」 findIdex = textlist[line].find('inactive') if findIdex > -1: line += 1 continue else: #查詢存儲池狀態是否爲「活動」 findIdex = textlist[line].find('active') if findIdex > -1: poolState = 1 else: line += 1 continue #查詢存儲池名稱 findIdex = textlist[line].find(' ') if findIdex > -1: tmpPoolName = textlist[line] poolName = tmpPoolName[:findIdex] else: line += 1 continue #print "poolName=%s, PoolState=%s" % (poolName) #經過'virsh pool-list'命令查詢主機下的全部存儲池的名稱和狀態信息 cmd = "ssh %s 'virsh pool-dumpxml %s'" % (row[0], poolName) textPools = os.popen(cmd).readlines() poolLines = len(textPools) poolLine = 0 textPool = '' while poolLine < poolLines: textPool += textPools[poolLine] poolLine += 1 root = ET.fromstring(textPool) type = root.get('type') #查詢存儲池總容量 for child in root.findall('capacity'): capacity = int(child.text) #查詢存儲池已分配容量 for child in root.findall('allocation'): allocation = int(child.text) #查詢存儲池路徑 for elem in root.iterfind('target/path'): path = elem.text if (capacity == 0): storagePoolUsed = 0 else: storagePoolUsed = "%.2f" % (float(allocation)/float(capacity) * 100) if (float(storagePoolUsed) >= 80): #XML內容編寫 hostName = row[0] storagePoolName = poolName storagePoolPath = path useStoragePool = str(storagePoolUsed) + '%' SubElement(itemXML, 'StoragePool', {'index':str(index), 'hostName':hostName, 'storagePoolName':storagePoolName, 'path':storagePoolPath, 'useStoragePool':useStoragePool}) index += 1 line += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'StoragePool use'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################主機的存儲池利用率,結束################################## ##################################主機共享文件系統掛載信息,開始################################## print "num=%s, %s: Check 'Sharefile mount'. Starting" % (checkNum, getTime()) checkName = '檢查共享文件系統掛載'.encode('utf-8') level = '通常'.encode('utf-8') suggest = '建議一個共享文件系統僅被一個集羣下的主機掛載'.encode('utf-8') itemXML = Element("SharefileMount",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select sharefile.NAME, sharefile.ID from TBL_SHARE_FILE_SYSTEM sharefile" #查詢數據庫 cursor.execute(sql) numRows = int(cursor.rowcount) shareFileNames = [''] * numRows shareFileID = [''] * numRows Num = 0 while (True): row = cursor.fetchone() if row == None: break shareFileNames[Num] = row[0] shareFileID[Num] = row[1] Num += 1 #定義數據庫查詢SQL語句 index = 1 Num = 0 while Num < numRows: sql = "select cluster.NAME from TBL_STORAGE_POOL_CONFIG config, TBL_HOST host, TBL_CLUSTER cluster where config.HOST_ID = host.ID and host.CLUSTER_ID = cluster.ID and config.SHARE_FILE_SYSTEM_ID = %s group by cluster.NAME" % (shareFileID[Num]) #查詢數據庫 cursor.execute(sql) numClusters = int(cursor.rowcount) if numClusters > 1: #XML內容編寫 shareFileName = shareFileNames[Num] sharefileXML = SubElement(itemXML, 'Sharefile', {'index':str(index), 'sharefileName':shareFileName}) while (True): row = cursor.fetchone() if row == None: break #print ' ', shareFileNames[Num], row[0] #XML內容編寫 clusterName = row[0] SubElement(sharefileXML, 'Cluster', {'clusterName':clusterName}) index += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'Sharefile mount'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################主機共享文件系統掛載信息,結束################################## ##################################集羣下未掛載共享文件系統的主機信息,開始################################## print "num=%s, %s: Check 'Sharefile mount of Cluster'host'. Starting" % (checkNum, getTime()) checkName = '檢查集羣下主機掛載共享文件系統信息'.encode('utf-8') level = '重要'.encode('utf-8') suggest = '確保共享文件系統被集羣下的全部主機掛載'.encode('utf-8') itemXML = Element("clusterMount",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select sharefile.NAME, sharefile.ID from TBL_SHARE_FILE_SYSTEM sharefile" #查詢數據庫 cursor.execute(sql) numRows = int(cursor.rowcount) shareFileNames = [''] * numRows shareFileID = [''] * numRows Num = 0 while (True): row = cursor.fetchone() if row == None: break shareFileNames[Num] = row[0] shareFileID[Num] = row[1] Num += 1 #定義數據庫查詢SQL語句 index = 1 Num = 0 while Num < numRows: sql = "select cluster.NAME, cluster.ID from TBL_STORAGE_POOL_CONFIG config, TBL_HOST host, TBL_CLUSTER cluster where config.HOST_ID = host.ID and host.CLUSTER_ID = cluster.ID and config.SHARE_FILE_SYSTEM_ID = %s group by cluster.NAME" % (shareFileID[Num]) #查詢數據庫 cursor.execute(sql) numClusters = int(cursor.rowcount) clusterNames = [''] * numClusters clusterIDs = [''] * numClusters ii = 0 while (True): row = cursor.fetchone() if row == None: break clusterNames[ii] = row[0] clusterIDs[ii] = row[1] #print shareFileNames[Num], row[0] ii += 1 ii = 0 while ii < numClusters: sql = "select host.NAME from TBL_HOST host where host.CLUSTER_ID = %s and host.ID not in (select host.ID from TBL_STORAGE_POOL_CONFIG config, TBL_HOST host, TBL_CLUSTER cluster where config.HOST_ID = host.ID and host.CLUSTER_ID = cluster.ID and config.SHARE_FILE_SYSTEM_ID = %s and cluster.ID = %s)" % (clusterIDs[ii], shareFileID[Num], clusterIDs[ii]) #查詢數據庫 cursor.execute(sql) #用來判斷是否輸出共享文件系統和集羣信息 hostDetect = 0 while (True): row = cursor.fetchone() if row == None: break if (hostDetect == 0): #XML內容編寫 shareFileName = shareFileNames[Num] clusterName = clusterNames[ii] sharefileXML = SubElement(itemXML, 'Sharefile', {'index':str(index), 'sharefileName':shareFileName, 'clusterName':clusterName}) hostDetect = 1 index += 1 #XML內容編寫 hostName = row[0] SubElement(sharefileXML, 'Host', {'hostName':hostName}) ii += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'Sharefile mount of Cluster'host'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################集羣下未掛載共享文件系統的主機信息,結束################################## ##################################虛擬機配置文件,開始################################## print "num=%s, %s: Check 'VM config'. Starting" % (checkNum, getTime()) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, host.HOST_USER, host.PW, vm.DOMAIN_NAME, vm.AUTO_MIGRATE, vm.HA_MANAGE, vm.AUTO_BOOTING from TBL_HOST host, TBL_DOMAIN vm where vm.HOST_ID = host.ID and host.STATUS = 1 order by host.NAME" #查詢數據庫 cursor.execute(sql) numVMS = int(cursor.rowcount) vmNames = [''] * numVMS hostNames = [''] * numVMS cpuModes = [''] * numVMS vmHAs = [''] * numVMS vmBlueHAs = [''] * numVMS vmAutoMigrates = [0] * numVMS vmTimeSyncs = [0] * numVMS vmAutoBootings = [0] * numVMS Num = 0 while (True): row = cursor.fetchone() if row == None: break hostNames[Num] = row[0] vmNames[Num] = row[4] vmAutoMigrates[Num] = row[5] vmHAs[Num] = row[6] vmAutoBootings[Num] = row[7] #經過'virsh dumpxml'命令虛擬機配置文件信息 cmd = "ssh %s 'virsh dumpxml %s'" % (row[1], row[4]) textVMs = os.popen(cmd).readlines() VMXMLLines = len(textVMs) VMXMLLine = 0 textVMXML = '' while VMXMLLine < VMXMLLines: textVMXML += textVMs[VMXMLLine] VMXMLLine += 1 #print textVMXML root = ET.fromstring(textVMXML) #查詢時間同步 for child in root.findall('timesync'): vmTimeSyncs[Num] = int(child.text) #查詢藍屏HA for child in root.findall('osha'): vmBlueHAs[Num] = int(child.text) #查詢CPU工做模式 for child in root.findall('cpu'): cpuModes[Num] = child.get('mode') Num += 1 #print ' ', hostNames[Num], vmNames[Num], vmAutoMigrates[Num], vmHAs[Num], vmTimeSyncs[Num], vmBlueHAs[Num], cpuModes[Num] #XML文件中的檢查項目說明 checkName = '檢查虛擬機的CPU模式配置'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "建議虛擬機的CPU模式使用'兼容模式',提高虛擬機遷移兼容性".encode('utf-8') itemXML = Element("VMCPUMode",{'name':checkName, 'level':level, 'suggest':suggest}) index = 1 Num = 0 while Num < numVMS: if (cpuModes[Num] == 'host-model'): #print ' ', hostNames[Num], vmNames[Num], cpuModes[Num] #XML內容編寫 VMName = vmNames[Num] hostName = hostNames[Num] cpuMode = '主機匹配模式'.encode('utf-8') SubElement(itemXML, 'VM', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'CPUMode':cpuMode}) index += 1 elif (cpuModes[Num] == 'host-passthrough'): #XML內容編寫 VMName = vmNames[Num] hostName = hostNames[Num] cpuMode = '直通模式'.encode('utf-8') SubElement(itemXML, 'VM', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'CPUMode':cpuMode}) index += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) #XML文件中的檢查項目說明 checkName = '檢查虛擬機的自動遷移功能配置'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "建議虛擬機開啓自動遷移功能,不然在觸發DRS功能時虛擬機沒法遷移".encode('utf-8') itemXML = Element("VMAutoMirgate",{'name':checkName, 'level':level, 'suggest':suggest}) index = 1 Num = 0 while Num < numVMS: if (vmAutoMigrates[Num] == 0): #print ' ', hostNames[Num], vmNames[Num], vmAutoMigrates[Num] #XML內容編寫 VMName = vmNames[Num] hostName = hostNames[Num] AutoMigrate = '關閉'.encode('utf-8') SubElement(itemXML, 'VM', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'AutoMigrate':AutoMigrate}) index += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) checkNum += 1 #XML文件中的檢查項目說明 checkName = '檢查虛擬機的HA(高可靠性)功能配置'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "建議開啓虛擬機的HA(高可靠性)功能配置,不然在觸發HA功能時虛擬機沒法遷移到其餘正常CVK主機".encode('utf-8') itemXML = Element("VMHA",{'name':checkName, 'level':level, 'suggest':suggest}) index = 1 Num = 0 while Num < numVMS: if (vmHAs[Num] == 0): #print ' ', hostNames[Num], vmNames[Num], vmHAs[Num] #XML內容編寫 VMName = vmNames[Num] hostName = hostNames[Num] HA = '關閉'.encode('utf-8') SubElement(itemXML, 'VM', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'HA':HA}) index += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) #XML文件中的檢查項目說明 checkName = '檢查虛擬機的時鐘同步功能配置'.encode('utf-8') level = '通常'.encode('utf-8') suggest = "建議開啓虛擬機的時鐘同步功能,使虛擬機和CVK的時鐘保持一致".encode('utf-8') itemXML = Element("VMtimeSyncs",{'name':checkName, 'level':level, 'suggest':suggest}) index = 1 Num = 0 while Num < numVMS: if (vmTimeSyncs[Num] == 0): #print ' ', hostNames[Num], vmNames[Num], vmTimeSyncs[Num] #XML內容編寫 VMName = vmNames[Num] hostName = hostNames[Num] timeSyncs = '關閉'.encode('utf-8') SubElement(itemXML, 'VM', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'timeSyncs':timeSyncs}) index += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) #XML文件中的檢查項目說明 checkName = '檢查虛擬機的藍屏HA功能配置'.encode('utf-8') level = '通常'.encode('utf-8') suggest = "建議開啓虛擬機的藍屏HA功能".encode('utf-8') itemXML = Element("VMBlueHA",{'name':checkName, 'level':level, 'suggest':suggest}) index = 1 Num = 0 while Num < numVMS: if (vmBlueHAs[Num] == 0): #print ' ', hostNames[Num], vmNames[Num], vmBlueHAs[Num] #XML內容編寫 VMName = vmNames[Num] hostName = hostNames[Num] blueHA = '關閉'.encode('utf-8') SubElement(itemXML, 'VM', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'blueHA':blueHA}) index += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) #XML文件中的檢查項目說明 checkName = '檢查虛擬機的自動啓動功能配置'.encode('utf-8') level = '通常'.encode('utf-8') suggest = "建議開啓虛擬機的自動啓動功能".encode('utf-8') itemXML = Element("VMAutoBooting",{'name':checkName, 'level':level, 'suggest':suggest}) index = 1 Num = 0 while Num < numVMS: if (vmAutoBootings[Num] == 0): #print ' ', hostNames[Num], vmNames[Num], vmAutoBootings[Num] #XML內容編寫 VMName = vmNames[Num] hostName = hostNames[Num] autoBooting = '關閉'.encode('utf-8') SubElement(itemXML, 'VM', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'autoBooting':autoBooting}) index += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM config'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機配置文件,結束################################## ##################################虛擬機網卡,開始################################## print "num=%s, %s: Check 'VM eth'. Starting" % (checkNum, getTime()) #XML文件中的檢查項目說明 checkName = '檢查虛擬機的網卡類型'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "建議虛擬機使用'高速網卡(virtio)'".encode('utf-8') itemXML = Element("ethType",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, host.HOST_USER, host.PW, vm.DOMAIN_NAME from TBL_HOST host, TBL_DOMAIN vm where vm.HOST_ID = host.ID and host.STATUS = 1 order by host.NAME" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #經過'virsh dumpxml'命令虛擬機配置文件信息 cmd = "ssh %s 'virsh dumpxml %s'" % (row[1], row[4]) textVMs = os.popen(cmd).readlines() VMXMLLines = len(textVMs) VMXMLLine = 0 textVMXML = '' while VMXMLLine < VMXMLLines: textVMXML += textVMs[VMXMLLine] VMXMLLine += 1 #print textVMXML macAddress = '' vwitchName = '' netType = '' root = ET.fromstring(textVMXML) #查詢設備型號 for elem in root.iterfind('devices/interface'): fileType = elem.get('type') if(fileType == 'bridge'): for child in elem.findall('mac'): macAddress = child.get('address') for child in elem.findall('source'): vwitchName = child.get('bridge') for child in elem.findall('model'): netType = child.get('type') if (netType != 'virtio'): #print ' ', row[0], row[4], macAddress, vwitchName, netType VMName = row[4] hostName = row[0] if (netType == 'rtl8139'): ethType = '普通網卡'.encode('utf-8') elif (netType == 'e1000'): ethType = 'Intel e1000網卡'.encode('utf-8') #XML內容編寫 SubElement(itemXML, 'eth', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'vwitchName':vwitchName, 'macAddress':macAddress, 'ethType':ethType}) index += 1 else: continue #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM eth'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機網卡,結束################################## ##################################虛擬機網卡加速,開始################################## print "num=%s, %s: Check 'VM eth speed'. Starting" % (checkNum, getTime()) #XML文件中的檢查項目說明 checkName = '檢查虛擬機網卡的內核加速功能'.encode('utf-8') level = '通常'.encode('utf-8') suggest = "建議開啓虛擬機網卡的內核加速功能".encode('utf-8') itemXML = Element("ethSpeedAdd",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, host.HOST_USER, host.PW, vm.DOMAIN_NAME from TBL_HOST host, TBL_DOMAIN vm where vm.HOST_ID = host.ID and host.STATUS = 1 order by host.NAME" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #經過'virsh dumpxml'命令虛擬機配置文件信息 cmd = "ssh %s 'virsh dumpxml %s'" % (row[1], row[4]) textVMs = os.popen(cmd).readlines() VMXMLLines = len(textVMs) VMXMLLine = 0 textVMXML = '' while VMXMLLine < VMXMLLines: textVMXML += textVMs[VMXMLLine] VMXMLLine += 1 #print textVMXML macAddress = '' vwitchName = '' netType = '' vhost = '' root = ET.fromstring(textVMXML) #查詢設備型號 for elem in root.iterfind('devices/interface'): fileType = elem.get('type') if(fileType == 'bridge'): for child in elem.findall('mac'): macAddress = child.get('address') for child in elem.findall('source'): vwitchName = child.get('bridge') for child in elem.findall('driver'): vhost = child.get('name') for child in elem.findall('model'): netType = child.get('type') if ((netType == 'virtio') and (vhost != 'vhost')): #print ' ', row[0], row[4], macAddress, vwitchName, vhost #XML內容編寫 VMName = row[4] hostName = row[0] speed = '未開啓'.encode('utf-8') SubElement(itemXML, 'eth', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'vwitchName':vwitchName, 'macAddress':macAddress, 'vhost':speed}) index += 1 else: continue #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM eth speed'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機網卡加速,結束################################## ##################################虛擬機磁盤緩存,開始################################## print "num=%s, %s: Check 'VM disk buffer'. Starting" % (checkNum, getTime()) #XML文件中的檢查項目說明 checkName = '檢查虛擬機磁盤的緩存模式配置'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "建議虛擬機磁盤的緩存模式爲'直接讀寫',以提高數據的安全性".encode('utf-8') itemXML = Element("diskCacheMode",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, host.HOST_USER, host.PW, vm.DOMAIN_NAME from TBL_HOST host, TBL_DOMAIN vm where vm.HOST_ID = host.ID and host.STATUS = 1 order by host.NAME" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #經過'virsh dumpxml'命令虛擬機配置文件信息 cmd = "ssh %s 'virsh dumpxml %s'" % (row[1], row[4]) textVMs = os.popen(cmd).readlines() VMXMLLines = len(textVMs) VMXMLLine = 0 textVMXML = '' while VMXMLLine < VMXMLLines: textVMXML += textVMs[VMXMLLine] VMXMLLine += 1 #print textVMXML root = ET.fromstring(textVMXML) #查詢磁盤緩存 for elem in root.iterfind('devices/disk'): fileType = elem.get('type') device = elem.get('device') if((fileType == 'file') and (device == 'disk')): for child in elem.findall('source'): filePath = child.get('file') for child in elem.findall('driver'): diskCache = child.get('cache') if (diskCache != 'directsync'): #print ' ', row[0], row[4], filePath, diskCache #XML內容編寫 VMName = row[4] hostName = row[0] if (diskCache == 'writeback'): cacheMode = '二級虛擬緩存(writeback)'.encode('utf-8') elif (diskCache == 'writethrough'): cacheMode = '一級物理緩存(writethrough)'.encode('utf-8') elif (diskCache == 'none'): cacheMode = '一級虛擬緩存(none)'.encode('utf-8') SubElement(itemXML, 'disk', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'diskPath':filePath, 'diskCacheMode':cacheMode}) index += 1 else: continue #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM disk buffer'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機磁盤緩存,結束################################## ##################################虛擬機磁盤總線,開始################################## print "num=%s, %s: Check 'VM disk bus'. Starting" % (checkNum, getTime()) #XML文件中的檢查項目說明 checkName = '檢查虛擬機磁盤的總線類型配置'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "建議虛擬機磁盤的總線類型爲'高速磁盤',以提高虛擬機磁盤的性能".encode('utf-8') itemXML = Element("diskBusType",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, host.HOST_USER, host.PW, vm.DOMAIN_NAME, vm.AUTO_MIGRATE, vm.HA_MANAGE from TBL_HOST host, TBL_DOMAIN vm where vm.HOST_ID = host.ID and host.STATUS = 1 order by host.NAME" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #經過'virsh dumpxml'命令虛擬機配置文件信息 cmd = "ssh %s 'virsh dumpxml %s'" % (row[1], row[4]) textVMs = os.popen(cmd).readlines() VMXMLLines = len(textVMs) VMXMLLine = 0 textVMXML = '' while VMXMLLine < VMXMLLines: textVMXML += textVMs[VMXMLLine] VMXMLLine += 1 #print textVMXML root = ET.fromstring(textVMXML) #查詢磁盤總線 for elem in root.iterfind('devices/disk'): fileType = elem.get('type') device = elem.get('device') if((fileType == 'file') and (device == 'disk')): for child in elem.findall('source'): filePath = child.get('file') for child in elem.findall('target'): diskBus = child.get('bus') for child in elem.findall('address'): controllerID = child.get('controller') if diskBus == 'scsi': for controller in root.iterfind('devices/controller'): if (controller.get('type') == diskBus) and (controller.get('index') == controllerID): model = controller.get('model') if (diskBus != 'virtio'): if (diskBus == 'scsi') and (model != 'virtio-scsi'): #print ' ', row[0], row[4], filePath, diskBus, model #XML內容編寫 VMName = row[4] hostName = row[0] if (diskBus == 'ide'): diskBusType = 'IDE 硬盤'.encode('utf-8') elif (diskBus == 'usb'): diskBusType = 'USB 硬盤'.encode('utf-8') elif (diskBus == 'scsi'): diskBusType = 'SCSI 硬盤'.encode('utf-8') else: diskBusType = diskBus SubElement(itemXML, 'disk', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'diskPath':filePath, 'diskBusType':diskBusType}) index += 1 else: #print ' ', row[0], row[4], filePath, diskBus #XML內容編寫 VMName = row[4] hostName = row[0] if (diskBus == 'ide'): diskBusType = 'IDE 硬盤'.encode('utf-8') elif (diskBus == 'usb'): diskBusType = 'USB 硬盤'.encode('utf-8') elif (diskBus == 'scsi'): diskBusType = 'SCSI 硬盤'.encode('utf-8') else: diskBusType = diskBus SubElement(itemXML, 'disk', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'diskPath':filePath, 'diskBusType':diskBusType}) index += 1 else: continue #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM disk bus'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機磁盤總線,結束################################## ##################################虛擬機磁盤文件是否在共享存儲中,開始################################## print "num=%s, %s: Check 'VM disk file is in share storage'. Starting" % (checkNum, getTime()) #XML文件中的檢查項目說明 checkName = '檢查虛擬機磁盤文件是否存放共享存儲中'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "建議虛擬機磁盤文件存放在共享存儲中,不然觸發HA時虛擬機沒法正常遷移".encode('utf-8') itemXML = Element("diskPath",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, host.HOST_USER, host.PW, volume.DOMAIN_NAME, volume.FILE_NAME, volume.POOL_PATH from TBL_STORAGE_VOLUME volume, TBL_HOST host where host.STATUS = 1 and volume.HOST_ID = host.ID order by host.NAME" #查詢數據庫 cursor.execute(sql) index = 1 hostName = '' while (True): row = cursor.fetchone() if row == None: break if hostName != row[0]: hostName = row[0] #經過'virsh pool-list'命令查詢主機下的全部存儲池的名稱和狀態信息 cmd = "ssh %s 'virsh pool-list --all'" % (row[1]) textlist = os.popen(cmd).readlines() lines = len(textlist) line = 2 Num = 0 poolNums = lines - 3 poolNames = [''] * poolNums poolPaths = [''] * poolNums poolTypes = [''] * poolNums while line < lines - 1: #查詢存儲池名稱 findIdex = textlist[line].find(' ') if findIdex > -1: tmpPoolName = textlist[line] poolNames[Num] = tmpPoolName[:findIdex] else: line += 1 continue #經過'virsh pool-dumpxml'命令查詢主機下的全部存儲池的名稱和狀態信息 cmd = "ssh %s 'virsh pool-dumpxml %s'" % (row[1], poolNames[Num]) textPools = os.popen(cmd).readlines() poolLines = len(textPools) poolLine = 0 textPool = '' while poolLine < poolLines: textPool += textPools[poolLine] poolLine += 1 root = ET.fromstring(textPool) poolTypes[Num] = root.get('type') #查詢存儲池路徑 for elem in root.iterfind('target/path'): poolPaths[Num] = elem.text #print ' ' + row[0], poolNames[Num], poolTypes[Num], poolPaths[Num] Num += 1 line += 1 Num = 0 while Num < poolNums: if row[6] == poolPaths[Num]: if (poolTypes[Num] == 'dir') or (poolTypes[Num] == 'cifs'): #print ' ' + row[0], row[4], row[5], row[6], poolPaths[Num], poolTypes[Num] #XML內容編寫 VMName = row[4] hostNameTmp = row[0] diskPath = row[5] poolName = poolNames[Num] poolPath = poolPaths[Num] if (poolTypes[Num] == 'dir'): poolType = '本地文件目錄'.encode('utf-8') elif (poolTypes[Num] == 'cifs'): poolType = 'Windows系統共享目錄'.encode('utf-8') SubElement(itemXML, 'disk', {'index':str(index), 'VMName':VMName, 'hostName':hostNameTmp, 'diskPath':diskPath, 'poolName':poolName, 'poolType':poolType, 'poolPath':poolPath}) index += 1 Num += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM disk file is in share storage'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機磁盤文件是否在共享存儲中,結束################################## ##################################虛擬機光驅,開始################################## print "num=%s, %s: Check 'VM CDROM mount'. Starting" % (checkNum, getTime()) #XML文件中的檢查項目說明 checkName = '檢查虛擬機光驅是否未卸載ISO文件'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "確保虛擬機光驅未掛載ISO文件".encode('utf-8') itemXML = Element("cdromMount",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, host.HOST_USER, host.PW, vm.DOMAIN_NAME from TBL_HOST host, TBL_DOMAIN vm where vm.HOST_ID = host.ID and host.STATUS = 1 order by host.NAME" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #經過'virsh dumpxml'命令虛擬機配置文件信息 cmd = "ssh %s 'virsh dumpxml %s'" % (row[1], row[4]) textVMs = os.popen(cmd).readlines() VMXMLLines = len(textVMs) VMXMLLine = 0 textVMXML = '' while VMXMLLine < VMXMLLines: textVMXML += textVMs[VMXMLLine] VMXMLLine += 1 #print textVMXML root = ET.fromstring(textVMXML) #查詢磁盤總線 for elem in root.iterfind('devices/disk'): fileType = elem.get('type') device = elem.get('device') if((fileType == 'file') and (device == 'cdrom')): filePath = '' for child in elem.findall('source'): filePath = child.get('file') for child in elem.findall('target'): dev = child.get('dev') if (filePath != ''): #print ' ', row[0], row[4], device, filePath #XML內容編寫 VMName = row[4] hostName = row[0] deviceName = 'cdrom ' + dev SubElement(itemXML, 'cdrom', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'deviceName':deviceName, 'filePath':filePath}) index += 1 else: continue #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM CDROM mount'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機光驅,結束################################## ##################################虛擬機軟驅,開始################################## print "num=%s, %s: Check 'VM floppy mount'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬機是否未使用軟驅設備'.encode('utf-8') level = '通常'.encode('utf-8') suggest = "確保虛擬機未使用軟驅設備".encode('utf-8') itemXML = Element("floppyMount",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select host.NAME, host.IPADDR, host.HOST_USER, host.PW, vm.DOMAIN_NAME from TBL_HOST host, TBL_DOMAIN vm where vm.HOST_ID = host.ID and host.STATUS = 1 order by host.NAME" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #經過'virsh dumpxml'命令虛擬機配置文件信息 cmd = "ssh %s 'virsh dumpxml %s'" % (row[1], row[4]) textVMs = os.popen(cmd).readlines() VMXMLLines = len(textVMs) VMXMLLine = 0 textVMXML = '' while VMXMLLine < VMXMLLines: textVMXML += textVMs[VMXMLLine] VMXMLLine += 1 #print textVMXML root = ET.fromstring(textVMXML) #查詢磁盤總線 for elem in root.iterfind('devices/disk'): fileType = elem.get('type') device = elem.get('device') if((fileType == 'file') and (device == 'floppy')): filePath = '' for child in elem.findall('source'): filePath = child.get('file') for child in elem.findall('target'): dev = child.get('dev') #print ' ', row[0], row[4], filePath #XML內容編寫 VMName = row[4] hostName = row[0] deviceName = 'floppy ' + dev SubElement(itemXML, 'floppy', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'deviceName':deviceName, 'filePath':filePath}) index += 1 else: continue #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM floppy mount'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機軟驅,結束################################## ##################################虛擬機狀態,開始################################## print "num=%s, %s: Check 'VM status'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬機狀態'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "確保虛擬機處於正常的運行狀態".encode('utf-8') itemXML = Element("VMState",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select vm.DOMAIN_NAME, host.NAME, vm.STATUS from TBL_DOMAIN vm, TBL_HOST host where vm.HOST_ID = host.ID and vm.STATUS <> 2 and host.STATUS = 1 order by host.NAME" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #print ' ', row[0], row[1], row[2] #XML內容編寫 VMName = row[0] hostName = row[1] if (row[2] == 3): VMState = '關閉'.encode('utf-8') elif (row[2] == 4): VMState = '暫停'.encode('utf-8') SubElement(itemXML, 'VM', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'VMState':VMState}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM status'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機狀態,結束################################## ##################################虛擬機CASTools狀態,開始################################## print "num=%s, %s: Check 'VM CAStools status'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬機CASTools工具狀態'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "確保虛擬機安裝CASTools工具,而且運行正常".encode('utf-8') itemXML = Element("CASTools",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select vm.DOMAIN_NAME, host.NAME, vm.CASTOOLS_STATUS from TBL_DOMAIN vm, TBL_HOST host where vm.HOST_ID = host.ID and vm.STATUS = 2 and host.STATUS = 1 order by host.NAME" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break if row[2] != 1: #print ' ', row[0], row[1], row[2] #XML內容編寫 VMName = row[0] hostName = row[1] CASToolState = '' if (row[2] == None): CASToolState = '未運行'.encode('utf-8') elif (row[2] == 0): CASToolState = '未運行'.encode('utf-8') else: CASToolState = str(row[2]) SubElement(itemXML, 'VM', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'CASToolState':CASToolState}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM CAStools status'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機CASTools狀態,結束################################## ##################################虛擬機CPU利用率,開始################################## print "num=%s, %s: Check 'VM CPU use'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬機CPU利用率'.encode('utf-8') level = '緊急'.encode('utf-8') suggest = "確保虛擬機CPU利用率不超過80%".encode('utf-8') itemXML = Element("useVMCPU",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select vm.DOMAIN_NAME, host.NAME, VMDetail.CPU_RATE, max(VMDetail.TIME) from TBL_DOMAIN_CPU_DETAIL VMDetail, TBL_DOMAIN vm, TBL_HOST host where VMDetail.DOMAIN_ID = vm.ID and host.ID = vm.HOST_ID and vm.STATUS = 2 group by host.ID, vm.ID" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break if row[2] >= 80: #print ' ', row[0], row[1], row[2] #XML內容編寫 VMName = row[0] hostName = row[1] useVMCPU = str(row[2]) + '%' SubElement(itemXML, 'CPU', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'useCPU':useVMCPU}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM CPU use'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機CPU利用率,結束################################## ##################################虛擬機MEM利用率,開始################################## print "num=%s, %s: Check 'VM Memory use'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬機內存利用率'.encode('utf-8') level = '緊急'.encode('utf-8') suggest = "確保虛擬機內存利用率不超過80%".encode('utf-8') itemXML = Element("useVMMem",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select vm.DOMAIN_NAME, host.NAME, VMDetail.MEMORY, max(VMDetail.TIME) from TBL_DOMAIN_CPU_DETAIL VMDetail, TBL_DOMAIN vm, TBL_HOST host where VMDetail.DOMAIN_ID = vm.ID and host.ID = vm.HOST_ID and vm.STATUS = 2 group by host.ID, vm.ID" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break if row[2] >= 80: #print ' ', row[0], row[1], row[2] #XML內容編寫 VMName = row[0] hostName = row[1] useVMMem = str(row[2]) + '%' SubElement(itemXML, 'Memory', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'useMem':useVMMem}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM Memory use'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機MEM利用率,結束################################## ##################################虛擬機磁盤利用率,開始################################## print "num=%s, %s: Check 'VM Disk use'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬機磁盤利用率'.encode('utf-8') level = '緊急'.encode('utf-8') suggest = "確保虛擬機磁盤利用率不超過80%".encode('utf-8') itemXML = Element("useVMDisk",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select vm.DOMAIN_NAME, host.NAME, vmDisk.DEV_NAME, vmDisk.UTILIZATION, max(vmDisk.TIME) from TBL_DOMAIN_DISK_UTILIZATION_STAT vmDisk, TBL_DOMAIN vm, TBL_HOST host where vmDisk.DOMAIN_ID = vm.ID and host.ID = vm.HOST_ID group by host.ID, vm.ID, vmDisk.DEV_NAME" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break if row[3] >= 80: #print ' ', row[0], row[1], row[2], row[3] #XML內容編寫 VMName = row[0] hostName = row[1] diskName = row[2] useDisk = str(row[3]) + '%' SubElement(itemXML, 'Disk', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'diskName':diskName, 'useDisk':useDisk}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM Disk use'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機磁盤利用率,結束################################## ##################################虛擬機磁盤分區利用率,開始################################## print "num=%s, %s: Check 'VM Disk Partition use'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬機磁盤分區利用率'.encode('utf-8') level = '緊急'.encode('utf-8') suggest = "確保虛擬機磁盤分區利用率不超過80%".encode('utf-8') itemXML = Element("useVMPartition",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select vm.DOMAIN_NAME, host.NAME, vmPartition.PARTITION_NAME, vmPartition.UTILIZATION, max(vmPartition.LAST_UPDATE_TIME) from TBL_DOMAIN_PARTITION_DETAIL vmPartition, TBL_DOMAIN vm, TBL_HOST host where vmPartition.DOMAIN_ID = vm.ID and host.ID = vm.HOST_ID group by host.ID, vm.ID, vmPartition.PARTITION_NAME" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break if row[3] >= 80: #print ' ', row[0], row[1], row[2], row[3] #XML內容編寫 VMName = row[0] hostName = row[1] partitionName = row[2] usePartition = str(row[3]) + '%' SubElement(itemXML, 'Partition', {'index':str(index), 'VMName':VMName, 'hostName':hostName, 'partitionName':partitionName, 'usePartition':usePartition}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM Disk Partition use'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機磁盤分區利用率,結束################################## ##################################虛擬機回收站,開始################################## print "num=%s, %s: Check 'VM Recycle'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬機回收站配置'.encode('utf-8') level = '通常'.encode('utf-8') suggest = "建議虛擬機回收站不自動回收虛擬機".encode('utf-8') itemXML = Element("Recycle",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select parameter.VALUE from TBL_PARAMETER parameter where parameter.NAME = 'vm.tombstone.lifetime'" #查詢數據庫 cursor.execute(sql) while (True): row = cursor.fetchone() if row == None: break if int(row[0]) > 0: #print ' ' + 'suggest is 0' #XML內容編寫 lifetime = str(row[0]) SubElement(itemXML, 'Recycle', {'lifetime':lifetime}) #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM Recycle'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬機回收站,結束################################## ##################################回收站中的虛擬機,開始################################## print "num=%s, %s: Check 'VM in Recycle'. Starting" % (checkNum, getTime()) checkName = '檢查回收站中的虛擬機'.encode('utf-8') level = '通常'.encode('utf-8') suggest = "建議清理回收站中的虛擬機".encode('utf-8') itemXML = Element("RecycleVM",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select vm.TITLE, vm.DOMAIN_NAME from TBL_DOMAIN vm where vm.ENABLE = 3" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #print ' ' + row[1] #XML內容編寫 VMName = row[1] SubElement(itemXML, 'VM', {'index':str(index), 'VMName':VMName}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'VM in Recycle'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################回收站中的虛擬機,結束################################## ##################################虛擬共享存儲配置,開始################################## print "num=%s, %s: Check 'virtula share storage'. Starting" % (checkNum, getTime()) checkName = '檢查虛擬共享存儲功能配置'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "建議虛擬共享存儲僅做爲測試使用,實際生產環境不運行".encode('utf-8') itemXML = Element("VirtualStorage",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select parameter.VALUE from TBL_PARAMETER parameter where parameter.NAME = 'share.system.enable'" #查詢數據庫 cursor.execute(sql) while (True): row = cursor.fetchone() if row == None: break if int(row[0]) == 1: #print ' ' + 'Open the Virtual Share Storage' #XML內容編寫 state = '開啓'.encode('utf-8') SubElement(itemXML, 'Storage', {'state':state}) #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'virtula share storage'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################虛擬共享存儲配置,結束################################## ##################################CVM定時備份狀態,開始################################## print "num=%s, %s: Check 'CVM backup' Status. Starting" % (checkNum, getTime()) checkName = '檢查CVM定時備份功能狀態'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "建議開啓CVM定時備份".encode('utf-8') itemXML = Element("CVMBackupState",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select back.STATE from TBL_BACKUP_CVM_STRATEGY back" #查詢數據庫 cursor.execute(sql) while (True): row = cursor.fetchone() if row == None: break if int(row[0]) == 0: #XML內容編寫 state = '未開啓CVM定時備份功能'.encode('utf-8') SubElement(itemXML, 'backupState', {'state':state}) #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'CVM backup' Status. Successful" % (checkNum, getTime()) checkNum += 1 ##################################CVM定時備份狀態,結束################################## ##################################CVM備份的備份方式,開始################################## print "num=%s, %s: Check 'CVM backup' type. Starting" % (checkNum, getTime()) checkName = '檢查CVM定時備份的備份方式'.encode('utf-8') level = '通常'.encode('utf-8') suggest = "建議使用遠程存儲方式備份,不要使用主機本地目錄備份".encode('utf-8') itemXML = Element("CVMBackupType",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select back.STATE, back.STORE_MODE from TBL_BACKUP_CVM_STRATEGY back" #查詢數據庫 cursor.execute(sql) while (True): row = cursor.fetchone() if row == None: break if (int(row[0]) == 1) and (int(row[1]) == 0): #print 'check the CVM Remote Backup' #XML內容編寫 backupPath = '主機本地目錄備份'.encode('utf-8') SubElement(itemXML, 'backupType', {'type':backupPath}) #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'CVM backup' type. Successful" % (checkNum, getTime()) checkNum += 1 ##################################CVM數據備份的備份方式,結束################################## ##################################查詢最30天內的操做日誌信息,開始################################## print "num=%s, %s: Check 'Operation log'. Starting" % (checkNum, getTime()) checkName = '查詢最近30天內的系統操做信息'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "建議CAS系統沒有無異常操做信息".encode('utf-8') itemXML = Element("EventCAS",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select operlog.USER_NAME, operlog.DESCRIPTION, operlog.RESULT, operlog.FAILURE_REASON from TBL_OPERLOG operlog where date_sub(curdate(), INTERVAL 30 DAY) <= date(`OPER_TIME`) and operlog.USER_NAME = '$SYSTEM' and operlog.RESULT = 1 order by operlog.OPER_TIME limit 0, 50" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #XML內容編寫 operName = row[0] operDesc = row[1].encode('utf-8') if (row[2] == 1): operResult = '失敗'.encode('utf-8') if (row[3] == None): operReason = '' else: operReason = row[3].encode('utf-8') SubElement(itemXML, 'Operate', {'index':str(index), 'name':operName, 'operDesc':str(operDesc), 'operResult':operResult, 'operReason':operReason}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'Operation log'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################查詢最近7天內的緊急和重要100條告警信息,結束################################## ##################################查詢最近7天內的緊急和重要100條告警信息,開始################################## print "num=%s, %s: Check 'Warnning log'. Starting" % (checkNum, getTime()) checkName = '查詢最近7天內的緊急和重要告警信息'.encode('utf-8') level = '重要'.encode('utf-8') suggest = "建議CAS系統沒有緊急和重要告警信息".encode('utf-8') itemXML = Element("EventCAS",{'name':checkName, 'level':level, 'suggest':suggest}) #定義數據庫查詢SQL語句 sql = "select event.EVENT_NAME, event.EVENT_LEVEL, event.EVENT_DESC, event.EVENT_SRC, event.EVENT_TIME from TBL_EVENT event where event.EVENT_LEVEL <= 2 and event.STATE = 2 and date_sub(curdate(), INTERVAL 7 DAY) <= date(`EVENT_TIME`) order by event.EVENT_TIME desc limit 0, 50" #查詢數據庫 cursor.execute(sql) index = 1 while (True): row = cursor.fetchone() if row == None: break #XML內容編寫 eventName = row[0].encode('utf-8') if (row[1] == 1): eventLevel = '緊急告警'.encode('utf-8') elif (row[1] == 2): eventLevel = '重要告警'.encode('utf-8') eventDesc = row[2].encode('utf-8') eventSrc = row[3].encode('utf-8') eventTime = row[4] SubElement(itemXML, 'Event', {'index':str(index), 'name':eventName, 'eventLevel':str(eventLevel), 'eventDesc':eventDesc, 'eventSrc':eventSrc, 'eventTime':str(eventTime)}) index += 1 #生成XML內容 purOrder.append(itemXML) print "num=%s, %s: Check 'Warnning log'. Successful" % (checkNum, getTime()) checkNum += 1 ##################################查詢最近7天內的緊急和重要100條告警信息,結束################################## cursor.close() conn.close() indent(purOrder) CAS.write(filename,"utf-8",True) print "H3C CAS-Checking Successful." #退出巡檢 exit()