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

简介:

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

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

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

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


代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# -*- coding:utf-8 -*-
 
__author__    =  'babyshen'
__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 ]
                 threshold  =  line.split()[ 3 if  len (line.split())  = =  4  else  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.baidu.com' ,
                   'user' : 'xxxx' ,
                   'passwd' :xxoo''}
         fro  =  'xxxxx'
         to  =  [ 'ooooo' ]
         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

升级版本已实现命令行参数和守护进程模式

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



本文转自 baby神 51CTO博客,原文链接:http://blog.51cto.com/babyshen/1887791,如需转载请自行联系原作者

相关文章
|
27天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
57 20
|
5月前
|
前端开发 JavaScript Java
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
本文介绍了一个结合SpringBoot和Python的实用功能,旨在监控iPhone 15的库存状态并通过邮件提醒用户。系统采用SpringBoot监听苹果官网API,解析JSON数据判断是否有货,并展示最近的库存记录。此外,还能自动触发Selenium+Python脚本实现自动化购买。文中详细介绍了技术栈、接口分析、邮件配置及自动化脚本的设置方法。该项目不仅适用于熟悉后端开发的人员,也适合回顾Layui和Jquery等前端技术。
62 0
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
|
1月前
|
安全 API 文件存储
Yagmail邮件发送库:如何用Python实现自动化邮件营销?
本文详细介绍了如何使用Yagmail库实现自动化邮件营销。Yagmail是一个简洁强大的Python库,能简化邮件发送流程,支持文本、HTML邮件及附件发送,适用于数字营销场景。文章涵盖了Yagmail的基本使用、高级功能、案例分析及最佳实践,帮助读者轻松上手。
45 4
|
2月前
|
开发者 Python
使用Python实现自动化邮件通知:当长时程序运行结束时
本文介绍了如何使用Python实现自动化邮件通知功能,当长时间运行的程序完成后自动发送邮件通知。主要内容包括:项目背景、设置SMTP服务、编写邮件发送函数、连接SMTP服务器、发送邮件及异常处理等步骤。通过这些步骤,可以有效提高工作效率,避免长时间等待程序结果。
88 9
|
4月前
|
机器学习/深度学习 监控 TensorFlow
使用Python实现深度学习模型:智能宠物监控与管理
使用Python实现深度学习模型:智能宠物监控与管理
119 0
|
4月前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
62 1
|
4月前
|
监控 网络协议 数据库连接
Python3 监控端口:使用 socket 库
Python3 监控端口:使用 socket 库
60 0
|
4月前
|
监控 网络协议 数据库连接
Python3 监控端口:使用 socket 库
Python3 监控端口:使用 socket 库
65 0
|
5月前
|
数据采集 运维 监控
自动化运维:用Python打造简易监控系统
【8月更文挑战第31天】在追求高效的IT世界里,自动化运维不再是奢侈品而是必需品。本文将通过一个Python示例,展示如何构建一个简单的系统监控工具。从数据采集到警报触发,我们将一步步解锁自动化的秘密,让你的服务器管理变得轻松而高效。
|
6月前
|
监控 网络协议 网络安全
SMTP操作使用详解并通过python进行smtp邮件发送示例
SMTP操作使用详解并通过python进行smtp邮件发送示例
187 3

热门文章

最新文章