xml

#!/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()
相關文章
相關標籤/搜索