Python3 实现简易ping监控并发送报警邮件

Python3 实现简易ping监控并发动报警邮件

1、实现原理通过ping命令结果获取丢包率和延时情况,当丢包率和延时达到预设值时,将结果作为邮件内容,并发送邮件

2、邮件是用smtplib和email实现发送的

3、目前脚本有个小问题就是:我打开文件,循环读,当读第一行时,我执行ping,获取结果,把结果写到一个文件里,同时判断是否达到预设值,如果达到,就把结果加到邮件内容,就这样一直循环,当把文件读完,然后关闭这两个文件,再发送邮件。总学得有点问题,应该将结果存到一个列表,一次性写入。算了就先这样玩吧。

代码如下:

# -*- coding:utf-8 -*-

__author__   = ‘GuoZhaoHui‘
__version__  = ‘0.0.3‘
__datetime__ = ‘2016-12-30 03:30:00‘

import os
import subprocess
import smtplib
import sys
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE,formatdate
from email import encoders

# server[‘name‘], server[‘user‘], server[‘passwd‘]
def send_mail(server, fro, to, subject="", text="", files=[]):
    assert type(server) == dict
    assert type(to) == list
    assert type(files) == list

    msg = MIMEMultipart()
    msg[‘From‘] = fro                # 邮件的发件人
    msg[‘Subject‘] = subject         # 邮件的主题
    msg[‘To‘] = COMMASPACE.join(to)  # COMMASPACE==‘, ‘ 收件人可以是多个,to是一个列表
    msg[‘Date‘] = formatdate(localtime=True) # 发送时间
    msg.attach(MIMEText(text,‘plain‘,‘utf-8‘))

    for file in files:          # 添加附件可以是多个,files是一个列表,可以为空
        part = MIMEBase(‘application‘, ‘octet-stream‘) #‘octet-stream‘: binary data
        with open(file,‘rb‘) as f:
            part.set_payload(f.read())
        encoders.encode_base64(part)
        part.add_header(‘Content-Disposition‘, ‘attachment; filename="%s"‘ % os.path.basename(file))
        msg.attach(part)

    smtp = smtplib.SMTP()
    smtp.connect(server[‘name‘]) # connect有两个参数,第一个为邮件服务器,第二个为端口,默认是25
    smtp.login(server[‘user‘], server[‘passwd‘]) # 用户名,密码
    smtp.sendmail(fro, to, msg.as_string()) # 发件人,收件人,发送信息
    smtp.close()  # 关闭连接

def ping_test(src,dest):
    ping = subprocess.Popen(‘/bin/ping -i 0.2 -c 4 -q -I ‘ + src + ‘ ‘ + dest,
                            shell=True,
                            stderr=subprocess.PIPE,
                            stdout=subprocess.PIPE) # 执行命令
    res,err = ping.communicate()
    if err: sys.exit(err.decode().strip(‘\n‘))
    pres = list(res.decode().split(‘\n‘))
    loss = pres[3].split()[5]  # 获取丢包率
    try:
        rtt = pres[4].split(‘/‘)[4] # 获取rtt avg值
    except IndexError:
        rtt = ""
    return loss,rtt

def ping_res(file,revfile):
    with open(file, ‘r‘, encoding=‘utf-8‘) as f:
        with open(revfile, ‘w‘, encoding=‘utf-8‘) as f1:
            textmail = text = ‘%-15s %-15s %-15s %-5s %-5s \n‘ % (‘host‘,‘src‘,‘dest‘,‘loss‘,‘rtt‘)
            f1.write(text)
            for line in f:
                host = line.split()[0]
                src = line.split()[1]
                dest = line.split()[2]
                try:
                    threshold = line.split()[3]
                except IndexError: # 默认延时报警阀值
                    threshold = 100
                loss, rtt = ping_test(src, dest)
                text = ‘%-15s %-15s %-15s %-5s %-5s \n‘ % (host, src, dest, loss, rtt)
                f1.write(text)
                # 判断丢包率和延时是不是达到预设值
                if float(loss.strip(‘%‘)) > 10 or float(rtt) > float(threshold):
                    textmail += text
    return textmail

if __name__ == ‘__main__‘:
    try:
        file = ‘/root/ping_test/ping_test.cfg‘ # 配置文件,格式(空格隔开):主机名,源地址,目标地址,延时阀值(默认是100)
        revfile = ‘/root/ping_test/ping_test.rev‘ # 结果文件
        textmail = ping_res(file,revfile) # 邮件内容
        # print(textmail)
        server = {‘name‘:‘mail.netpas.co‘,
                  ‘user‘:‘guozhaohui‘,
                  ‘passwd‘:‘‘}
        fro = ‘[email protected]‘
        to = [‘[email protected]‘]
        subject = ‘ping_test‘
        if len(textmail.split(‘\n‘)) == 2 : sys.exit() # 当只有一行时退出程序不发送邮件
        send_mail(server,fro,to,subject,textmail)
    except smtplib.SMTPAuthenticationError:
        sys.exit("Mail Authentication Failed")
    except KeyboardInterrupt:
        sys.exit(249)
    except Exception as e:
        sys.exit(e)

github地址:https://github.com/babyshen/Python/blob/master/monitor.py

时间: 2024-12-15 17:51:39

Python3 实现简易ping监控并发送报警邮件的相关文章

使用Zabbix服务端本地邮箱账号发送报警邮件的部署记录

邮件报警有两种情况:1)Zabbix服务端只是单纯的发送报警邮件到指定邮箱,发送报警邮件的这个邮箱账号是Zabbix服务端的本地邮箱账号(例如:[email protected]),只能发送,不能接收外部邮件.2)使用一个可以在互联网上正常收发邮件的邮箱账号(例如:[email protected]),通过在Zabbix服务端中设置,使其能够发送报警邮件到指定邮箱.上面第2中使用外部邮箱发送报警邮件之前已经介绍了:分布式监控系统Zabbix-3.0.3-完整安装记录(5)-邮件报警部署.下面说下

linux服务器发送报警邮件

由于公司业务需要,领导要求发送报警邮件,在我的认知中应该是有两种,一种是将服务器搭建为邮件服务器,这种可以使用postfix或者sendmail等,但是配置相对比较复杂,对运维人员水平要求也比较高.其实完全没有必要这么做.这就说到我们的第二种方法了,可以调用第三方邮件服务器.我们公司有自己的邮件服务器,所以直接新建了个账户,然后在这台需要发送的服务器上进行配置就可以了.服务器是centos6.8的系统.配置是在/etc/mail.rc这个文件中配置的.主要有以下几个配置项需要调整 [[email

定时监控所有服务器的端口,如果挂起,发送报警邮件

功能:1:ping所有网内机器的IP地址,如果不通,发送报警 2:检测网内所有机器的服务端口,如果不通,发送报警 #!/bin/bash ##读取IP列表,测试ip的某个端口## while read ip1do ping -c 2 $ip1 >> /dev/null 2>&1 if [ $? -eq 0 ]; then echo "************************"echo "ping $ip1 ,ok" elseecho

python脚本发送报警邮件

最近在搞把nagios报警邮箱换到163.sina这种免费邮箱上边,之前用过msmtp搞过也可以发送邮件,现在估计是他们系统都升级了,只能使用TSL加密连接,而msmtp怎么配置都配不通,无奈只能转移战术,正好最近在学习Python,也不知道从哪瞄到过有个email的模块,所以准备试试自己搞个脚本. (新手,无编程基础,希望多多指教) -----2016.1.4 修改---- 前提: 更改nagios/etc/object/command.cfg里发送邮件的command配置,例如我这样: # 

Centos 6.5 服务器下面配置邮件客户端 发送报警邮件

以Centos 系统为例,确保服务器可以正常连接外网 Centos 6.5 下面默认 安装 postfix 查看 rpm -qa | grep postfix postfix-2.6.6-2.2.el6_1.x86_64 配置邮件客户端 set [email protected] set smtp=smtp.163.com set [email protected] set smtp-auth-password=UserPassword set smtp-auth=login 发送测试邮件  e

关于zabbix发送报警邮件25端口不通问题的解决方案

写这篇文章的目的不是别的,今年在阿里云的centos7上安装了zabbix3以上版本,我可以直接说明不是zabbix最新版本,安装路上根据之前总结文档一顿操作,ok,一切正常,zabbix服务器正常启动,界面也正常,直至报警调试自带mail报警,发现并没有收到邮件. 于是手动测试邮件发送,发现失败了,....失败了.然后各种百度找资料,一瞬间发现很多文档,最多的就说阿里云禁用了邮件服务器的25端口,而mail默认走25.            既然发现问题,那就是解决问题,于是各种尝试改配置文件

编写监控脚本,监控集群内所有服务存活状态,内存、磁盘剩余率检测,异常则发送报警邮件

发送邮件Python程序 #!/usr/bin/python # -*- coding: UTF-8 -*- import sys import smtplib import email.mime.multipart import email.mime.text server = 'smtp.163.com' port = '25' def sendmail(server,port,user,pwd,msg): smtp = smtplib.SMTP() smtp.connect(server,

zabbix生产场景配置发送报警邮件

创建发送邮件的脚本: [[email protected] ~]# cd /usr/lib/zabbix/alertscripts/ [[email protected] alertscripts]# cat email.sh #!/bin/bash email_File=/tmp/email.log #在/tmp目录里面创建email.log文件 function main(){         echo"$3" >$email_File #把邮件内容传入到email.log文

监控服务器ssh登录,并发送报警邮件

最近想监控下云主机的ssh登录情况,所以开始写ssh登录报警监控.实现方式并不难. 一:邮箱申请开启SMTP 在邮箱中选择“设置”----->“账户” 在如下图处开启POP3/SMTP服务,并生成授权码. 二:修改相关参数 登录要进行ssh登录监控的服务器,在/etc/ssh创建"sshrc"文件: #!/bin/bash #获取登录者的用户名 user=$USER #获取登录者的IP地址 ip=${SSH_CLIENT%% *} #获取登录的时间 time=$(date +%F