监控外网IP网络的可用性及丢包率实现不重复发送报警邮件

重点内容
1.通过ping 来检测的网络的可用性
2.使用threading模块处理字典中的多个IP网络探测
3.为了使第二次检测故障IP,不重复发送邮件,使用redis中的列表保存已网络故障IP,当故障恢复时从redis列表中删除该故障IP

代码:

import threading
import os
import re
import smtplib
from email.mime.text import MIMEText
import redis

def send_mail(to_list, subject, content, format='plain'):
	    # 发件邮箱服务器地址
	    mail_host = 'smtp.exmail.qq.com'
	    # 邮箱用户名
	    mail_user = '发件人邮箱'
	    # 邮箱密码
	    mail_pass = 'password'
	    mail_postfix = 'exmail.qq.com'
	    me = mail_user + "<" + mail_user + "@" + mail_postfix + ">"
	    msg = MIMEText(content,format,'utf-8')
	    msg['Subject'] = subject
	    msg['From'] = me
	    msg['to'] = to_list
	    msg['Accept-Language'] = 'zh-CN'
	    msg['Accept-Charset'] = 'ISO-8859-1,utf-8'
	    try:
	        s = smtplib.SMTP()
	        s.connect(mail_host)
	        s.login(mail_user, mail_pass)
	        s.sendmail(me, to_list, msg.as_string())
	        s.close()
	        return True
	    except Exception, e:
	        print str(e)
	        return False

def ip_ping(name,ip):
	obj = re.compile(r"packets transmitted, (.*?) packet loss", re.M | re.I)
    result = os.popen('ping  -w 3 %s' % ip)
    ret = result.read()
    rs = redis.Redis(host="10.5.189.192", password="password", db=0, port=6379)
    t_tupe = obj.search(ret).groups()
    loss_precent = int(t_tupe[0].split(",")[1].strip("%"))
    print("%s:\n%s" % (name, ret))
    print("loss_precent:%d" % loss_precent)
    if loss_precent == 0:
         ret_list = rs.lrange("monitor", 0, -1)
         if ip in ret_list:
             send_mail('收件人邮箱', '【已恢复】%s服务网络故障IP:%s丢包率%s%%' % (name, ip, loss_precent), 'IP:%s' % (ip))
             rs.lrem("monitor", "%s" % ip)
    elif loss_precent > 70:
         if ip not in ret_list:
            rs.lpush("monitor", "%s" % ip)
            print("主机:%s,IP:%s,丢包率%s%%" %(name,ip,loss_precent))
            send_mail('收件人邮箱','%s服务网络故障IP:%s丢包率%s%%' %(name,ip,loss_precent),'IP:%s' %(ip))

if __name__ == "__main__":
    d = {
        "test1": "106.75.20.3",
        "test2": "106.75.9.185",
    }
    L = []
    for k in d:
        t = threading.Thread(target=ip_ping, args=(k, d[k]))
        L.append(t)
        t.start()
    [t.join() for t in L]

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值