1. 程式人生 > >Python測試環境巡檢工具

Python測試環境巡檢工具

Python測試環境巡檢

測試過程中,由於測試環境機器較多且全都是在虛擬機器上做的,經常會有某些機器掛掉導致站點訪問出錯的問題,手動去一個一個Ping實在是麻煩,於是用Python寫了一個小指令碼,來批量Ping測試。 實現思路:

一、設計要求:

1.目標機器的IP可配置 2.可以一次性Ping多臺機器 3.Ping測試的結果可查詢 4.如果有Ping不通的機器,可以主動郵件通知

二、設計思路:

1.將需要測試的IP放在一個Txt文字檔案中,所有目標機器的IP手動維護在這個檔案中 2.將Ping測試的結果放在一個Txt檔案中,包括IP,測試結果等 3.主程式要實現,Ping測試和郵件傳送兩個主要方法

三、程式碼實現:

1.新建一個Ping資料夾,該檔案目錄下建立一個host.txt檔案,用來維護待測IP 2.新建ping.py,程式碼如下:
import os
import sendMail

def getIpStatus():
    hasFail = False
    try:
        Host = open("host.txt", "r")        
        Result = open("result.txt", "w")
        Result.write("測試環境巡檢結果:\n")

        for line in Host.readlines():
            line = line.strip("\n")
            if "#" in line:
                Result.write(line +"\n")
            else:
                res = os.system("ping " + line)
                if res == 0:
                    print(line +" 可用...")
                    Result.write(line + " 可用...\n")
                else:
                    print(line +" 不可用...")
                    Result.write(line + " 不可用...\n")
                    hasFail = True
        Host.close()
        Result.close()
    except:
        print("Host檔案讀取失敗...")

    if hasFail:
        print("有機器無法ping通!")
        return (True)

if __name__ == '__main__':
    if getIpStatus():
        sendMail.sendMail()
        
3.新建sendMail.py實現郵件傳送功能
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

def sendMail():
    mail_host="******"  #設定郵件伺服器
    mail_user="******"    #使用者名稱
    mail_pass="******"   #口令 

    sender = '******'   #傳送郵件的郵箱
    receivers = [******]  # 接收郵件的郵箱,可設定為你的QQ郵箱或者其他郵箱,多個郵箱用,分隔開來

#建立一個帶附件的例項
    message = MIMEMultipart()
    message['From'] = "******"  #郵件傳送人
    message['To'] =  "******"   #郵件接收人
    subject = '測試環境巡檢結果'  #郵件主題
    message['Subject'] = Header(subject, 'utf-8')   

#郵件正文內容
    message.attach(MIMEText('測試環境巡檢有機器未能ping通,詳細結果見附件……', 'plain', 'utf-8'))

# 構造附件1,傳送附件檔案
    att1 = MIMEText(open("result.txt", 'rb').read(), 'base64', 'utf-8')
    att1["Content-Type"] = 'application/octet-stream'
# 這裡的filename可以任意寫,寫什麼名字,郵件中顯示什麼名字
    att1["Content-Disposition"] = 'attachment; filename="Result.txt"'
    message.attach(att1)

    try:
        smtpObj = smtplib.SMTP() 
        smtpObj.connect(mail_host, 25)    # 25 為 SMTP 埠號
        smtpObj.login(mail_user,mail_pass)  
        smtpObj.sendmail(sender, receivers, message.as_string())
        print ("郵件傳送成功")
    except smtplib.SMTPException:
        print ("Error: 無法傳送郵件")
4.執行結果截圖: 5.注意事項: 5.1Windows系統和Linux系統對於換行符的規定不一樣,按照換行符進行切割的時候,需要特殊處理 5.2 Linux中中文編碼需要特殊處理,具體方法是在中文字元前加“U” 5.3 os.system-ping方法返回的是Ping命令是否有執行結果,對於本來就不存在的IP,也會有返回值,所以結果可能也是通的,需要注意。如果要相容這個問題,可以使用正則匹配命令返回內容的方法進行處理,我這裡是知道具體的機器IP的,所以處理相對簡單 5.4 郵件伺服器的配置,可上對應郵件提供商網站查詢 Done!