python3.6 监控服务器在线,离线自动发送邮件

手上有几台服务器,如果服务器出问题希望能及时通知到人,考虑了一下,写了一个小工具来用,主要功能就是根据服务器IP,ping一下服务器,确认服务器在线,如果服务器不在线则自动发送邮件通知。由于时间问题没有用到.sh的文件进行处理,效率不是太高,只适合少量服务器使用。

后续可以考虑做个web页面来显示服务器在线情况,这样比较直观一点。

# -*- coding=utf-8 -*-
import os
import sys
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

class server:
    def __init__(self):
        self.iplist = list()
        self.my_sender = '' #发件人邮箱账号
        self.my_pass = '' #发件人邮箱密码,POP3的密码
        self.my_user = '' #收件人邮箱账号
        self.down_ip = '不在线服务器\n'
        self.up_ip = '在线服务器\n'

    def read_ip(self):
        f = open(r'server_ip.txt') #放入服务器IP 一行一个ip
        self.lines = f.readlines()
        
    def mail(self):
        try:
            msg = MIMEText(self.down_ip,'plain','utf-8')
            msg['From'] = formataddr(["manunkind",self.my_sender])
            msg['To'] = formataddr(["manunkind",self.my_user])       
            msg['Subject'] = "server down" 
            server = smtplib.SMTP_SSL("smtp.qq.com", 465)
            server.login(self.my_sender, self.my_pass)
            server.sendmail(self.my_sender,[self.my_user,],msg.as_string())
            server.quit()
            print("Mail sent successfully")
        except Exception:  
            print("Mail delivery failed")
        
    def ping_server(self):
        for ip in self.lines:
            if '.'in ip:
                backinfo = os.system('ping -n 5  -w 30  %s'%ip)
                if backinfo:
                    self.down_ip = self.down_ip + ip
                else:
                    self.up_ip = self.up_ip + ip
            else:
                print('\n开始检查'+ip)
                self.down_ip = '\n'+ self.down_ip+ip
                self.up_ip = '\n'+ self.up_ip+ip
        if '.' in self.down_ip:
            self.mail()
        print(self.up_ip)
                
if __name__ == '__main__':
    sIP = server()
    sIP.read_ip()
    sIP.ping_server()

你可能感兴趣的:(随便玩玩)