VMtools异常检测发邮件通知

测试环境:

vSphere环境,或VMware Workstation 环境。

虚拟环境内有 “xp1”,”xp3” 两台XP类型主机,xp1状态为开机时的高级选项菜单,

XP3 在蓝屏状态,

 

先用 cmd /c start /min ntsd -c q -pn winlogon.exe 1>nul 2>nul  让其中一台XP 蓝屏。

另一台不安装 tools.

 

 

 

 

 

 

 

 

 

 

 

 

只是 提示,可以通过打印 看出有问题的主机。

 

 

 

 

如果要 发邮件提醒 管理员,可以 调用sendMail.py脚本,调用参数如下。

可以把邮件内容,换成要发送的内容。

 

 

 

 

 

发送 邮件结果

 

 

 

$TextUtf8 = New-Object -typename System.Text.UTF8Encoding
$EsxiHost = "192.168.16.130"
$EsxiUser = "administrator@vsphere.local"
$EsxiPassWd = "vCenterPassWd"
#提醒或发送邮件时间间隔为 检查周期(次数) 乘以 检查时间
$G_TimeSeconds = 5    #多少秒检查一次为一周期
$G_ErrorTimes = 3    #多少周期 后发消息(邮件、短信)提醒管理员
$ConnIgnore = Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -confirm:$false
$ConnectVIServer = Connect-VIServer -Server $EsxiHost -username $EsxiUser -Password $EsxiPassWd

#创建一个存放问题主机的数组
$ErrorHostArr = New-Object -TypeName System.Collections.ArrayList
#例如外主机
$ExceptErrorHostArr = "Except_VM_Name",""

#错误主机类
class VMHost{
    $Name
    $ErrorTimes = 1
    $CreateTime 
    [void] AddTime(){
        $this.ErrorTimes++
        $this.CreateTime =Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
    }
}


function ErrorAddByName($vmName)
{
    $ErrorHostArr | foreach{
        if ($_.Name -eq $vmName) {
        $_.ErrorTimes ++
        $_.CreateTime =Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
        }
    }
}

function ExistErrHostByName($vmName)
{
    [bool]$Result=$False
    foreach ($t in $ErrorHostArr)
    {
        if ($t.Name -eq $vmName) {
            $Result = $True
            Break
        }
    }
    return $Result
}

function IsExcept($vmName)
{
    [bool]$Result=$False
    foreach ($n in $ExceptErrorHostArr)
    {
        if ($n -eq $vmName) {
            $Result = $True
            Break
        }
    }
    return $Result
}

while(1 -eq 1){    
    $ErrorHosts = get-vm | where {$_.PowerState -eq "PoweredOn" -and $_.extensiondata.guest.ToolsStatus -ne "toolsOk"}
    if($ErrorHosts.count -gt 0){
        foreach ($t in $ErrorHosts)
        {
            if (IsExcept($t.Name)) {
                Continue
            }
            $IsExist = ExistErrHostByName($t.Name)
            if($IsExist){
                ErrorAddByName($t.Name)
            }else {
                $AddErrHost = $ErrorHostArr.Add((new-object VMHost -Property @{'Name'=$t.Name;'CreateTime'=Get-Date -Format 'yyyy-MM-dd HH:mm:ss'}))
            }
        }
    }
    cls
    $SendErrorHostArr = New-Object -TypeName System.Collections.ArrayList   
    Write-Host "有问题虚拟机名称"      " 检测周期"    " 时间"
    $ErrorHostArr | foreach{
        if($_.ErrorTimes -gt $G_ErrorTimes){
            $temp = $SendErrorHostArr.Add(($_.Name))
            $_.ErrorTimes = 0
        }
        Write-Host $_.Name "    " $_.ErrorTimes"    " $_.CreateTime
    }
    $SendMsg = ""
    foreach ($t in $SendErrorHostArr)    {
        $SendMsg = $SendMsg  + $t +","        
    }
    if($SendMsg -ne "" ){
        $msg=$SendMsg.Substring(0,$SendMsg.Length-1)
        Write-Host ""
        $title = @"
发送邮件 故障主机:
"@
        #打印问题主机
        Write-Host $title  $msg 

        #发送邮件给问题主机
        #python .\sendMail.py "-Utest@163.com" "-Ppassword" "-Dsmtp.163.com" "-R['jieshou1@gmail.com','jieshou2@hotmail.com']" "-C'cahosong1@qq.com'" "-S'misong@21cn.com'" "-T$title" "-B$msg"
    }    
    Start-Sleep -Seconds $G_TimeSeconds
}

 

 

 

# coding: utf-8
import sys
import os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from smtplib import SMTP
from email.header import Header

def getParsStr(_str):
    return _str[2:len(_str)]

def sendMail(_argv):
    smtp = smtplib.SMTP()
    userName=""
    passWd=""
    hostDomain=""    #smtp.163.com
    jieShouZhe =list()
    chaoSongzhe =list()
    miSongzhe =list()
    title = ""
    fuJian = ""    #写入附件的绝对路径
    zhengWen = ""
    for i in range(1, len(_argv)):
        if _argv[i].startswith('-U'):
            userName = getParsStr(_argv[i])
        if _argv[i].startswith('-P'):
            passWd = getParsStr(_argv[i])
        if _argv[i].startswith('-D'):
            hostDomain = getParsStr(_argv[i])
        if _argv[i].startswith('-R'):
            jieShouZhe= getParsStr(_argv[i])
            if len(jieShouZhe) >0:
                jieShouZhe = jieShouZhe.replace("\"","").replace("\'","").replace("[","").replace("]","").split(",")
        if _argv[i].startswith('-C'):
            chaoSongzhe = getParsStr(_argv[i])
            if len(chaoSongzhe) >0:
                chaoSongzhe= chaoSongzhe.replace("\"","").replace("\'","").replace("[","").replace("]","").split(",")
        if _argv[i].startswith('-S'):
            miSongzhe = getParsStr(_argv[i])
            if len(miSongzhe) >0:
                miSongzhe= miSongzhe.replace("\"","").replace("\'","").replace("[","").replace("]","").split(",")
        if _argv[i].startswith('-T'):
            title = getParsStr(_argv[i])
        if _argv[i].startswith('-F'):
            fuJian = getParsStr(_argv[i])
        if _argv[i].startswith('-B'):
            zhengWen = getParsStr(_argv[i])

    email_client = smtplib.SMTP(hostDomain,25)   #远程主机拒接连接 请使用smtplib.SMTP_SSL()
    email_client.login(userName, passWd)  
    msg = MIMEText(zhengWen, 'plain', 'utf-8')
    msg['Subject'] = Header(title, 'utf-8')
    msg['From'] = userName
    msg['To'] = ','.join(jieShouZhe)
    msg['Cc'] = ','.join(chaoSongzhe)
    msg['Bcc'] =','.join(miSongzhe)
    email_client.sendmail(userName,jieShouZhe+chaoSongzhe+miSongzhe+[userName],msg.as_string())
    email_client.quit()

def getHelp(_argv):
    if len(_argv)<=1:
        print("""   *** 注意 所有参数不可出现空格 ***
-U 发件者邮箱用户名 eg.463259624@qq.com
-P 发件者邮箱密码
-D 发件者邮箱服务器 eg.smtp.163.com
-R 接收者邮箱,可设置多个格式为['xx@xx.com','yy@yy.com']
-C 抄送者邮箱,可设置多个格式为['xx@xx.com','yy@yy.com']
-S 密送者邮箱,可设置多个格式为['xx@xx.com','yy@yy.com']
-T 邮件标题
-F 附件绝对路径 eg.d:\\test.txt ,(未实现)
-B 邮件内容

实例:
  1). sendMail.py -Utest@test.com -Pmima -Dsmtp.163.com -R'ShouJianZhe@test.com' -T标题 -B邮件内容
  2). sendMail.py -Utest@test.com -Pmima -Dsmtp.163.com -R['ShouJianZhe1@test.com','ShouJianZhe2@test.com'] -C'ChaoSongzhe@test.com' -S['MiSongzhe@test.com'] -T标题 -B邮件内容
            """)

if __name__ == '__main__':
    if len(sys.argv)<=1:
        getHelp(sys.argv)
    else:
        sendMail(sys.argv)

 

posted @ 2019-10-08 14:05  likehc  阅读(468)  评论(0编辑  收藏  举报