玩了hostmonitor,老外写的很好。但是不符合国情,只有邮件适合发送。

今天用python 写一个自动发现ip,ping失败报警的程序。(微信和邮件报警)

以前用python写的发微信,发邮件直接导入即可。

# -*- coding: utf-8 -*-
# ping for Windows import os
import sys
import socket
import struct
import select
import time
import ConfigParser
import weixin
import mail class getcfg(object):
def __init__(self,filename):
self.filename=filename
self.cfg=ConfigParser.ConfigParser()
self.cfg.read(self.filename)
#self.allip=self.cfg.items('allip')
self.retry=self.cfg.get('rule','retry')
self.timeout=self.cfg.get('rule','timeout')
self.reload=self.cfg.get('rule','next_check')
self.scan=self.cfg.items('scan_network')
self.mailto=self.cfg.items('mail','mail_to') #发送邮件报警
def sendmessage(self,failip):
weixin.sendMessage('@all','ping %s failed.'% failip)
for key,value in self.mailto:
mail.send(value,"ping %s failed." % failip,'python ping fail') #判断要扫描ip
def scan_network(self):
self.scan.sort()
allip=self.cfg.items('allip')
i=0
while i < len(self.scan):
ipbegin=int(self.scan[i][1].split('.')[-1])
ipend=int(self.scan[i+1][1])+1
for x in range(ipbegin,ipend):
ipvalue=self.scan[i][1].split('.')[0]+'.'+self.scan[i][1].split('.')[1]+'.'+self.scan[i][1].split('.')[2]+'.'+str(x)
ip_dict=[]
for k,v in allip:
ip_dict.append(v)
if ipvalue in ip_dict:
pass
else:
#执行扫描
self.to_ping(ipvalue,int(self.timeout))
i=i+2 #执行扫描
def to_ping(self,ip_addr,timeout):
print 'scan ip ' + ip_addr,
try:
delay = ping(self.filename).ping_once(ip_addr, timeout)
if delay == None:
print 'failed. (timeout within %s second.)' % timeout
else:
print 'get reply in %0.4f ms' % (delay * 1000)
self.scan_resule(ip_addr)
except socket.gaierror, e:
print "failed. (socket error: '%s')" % e[1] #判断扫描结果,如果有新扫描到的ip则保存到配置文件
def scan_resule(self,ip_addr):
allip=self.cfg.items('allip')
ip_dict=[]
for k,v in allip:
ip_dict.append(v)
if ip_addr in ip_dict:
pass
else:
self.cfg_write(ip_addr) #保存扫描到的ip到配置文件
def cfg_write(self,ipvalue):
ipkey='auto_'+str(time.time())
self.cfg.set('allip',ipkey,ipvalue)
self.cfg.write(open('ping_monitor.txt','w')) #去执行ping类
def to_ping(self):
allip=self.cfg.items('allip')
for k,v in allip:
if len(v) >0:
ping(self.filename).icmp_ping(v,int(self.timeout),int(self.retry)) #下次执行扫描时间
def next_check(self):
while True:
self.to_ping()
print('------------------------------------------------------------')
nextcheck=0
while nextcheck < int(self.reload):
sys.stdout.write('next check %s second\r' % (int(self.reload)-nextcheck))
sys.stdout.flush()
time.sleep(1)
nextcheck=nextcheck+1
self.scan_network()
print('------------------------------------------------------------') class ping(object):
def __init__(self,filename):
self.ICMP_ECHO_REQUEST = 8
self.filename=filename def receive_ping(self,my_socket, ID, timeout):
start_time = timeout
while True:
start_select = time.clock()
what_ready = select.select([my_socket], [], [], start_time)
how_long = (time.clock() - start_select)
if what_ready[0] == []: #timeout
return time_received = time.clock()
rec_packet, addr = my_socket.recvfrom(1024)
icmp_header = rec_packet[20 : 28]
ip_type, code, checksum, packet_ID, sequence = struct.unpack("bbHHh", icmp_header)
if ip_type != 8 and packet_ID == ID: # ip_type should be 0
byte_in_double = struct.calcsize("d")
time_sent = struct.unpack("d", rec_packet[28 : 28 + byte_in_double])[0]
return time_received - time_sent start_time = start_time - how_long
if start_time <= 0:
return def get_checksum(self,source):
checksum = 0
count = (len(source) / 2) * 2
i = 0
while i < count:
temp = ord(source[i + 1]) * 256 + ord(source[i]) # 256 = 2^8
checksum = checksum + temp
checksum = checksum & 0xffffffff # 4,294,967,296 (2^32)
i = i + 2 if i < len(source):
checksum = checksum + ord(source[len(source) - 1])
checksum = checksum & 0xffffffff # 32-bit to 16-bit
checksum = (checksum >> 16) + (checksum & 0xffff)
checksum = checksum + (checksum >> 16)
answer = ~checksum
answer = answer & 0xffff # why? ans[9:16 1:8]
answer = answer >> 8 | (answer << 8 & 0xff00)
return answer def send_ping(self,my_socket, ip_addr, ID):
ip = socket.gethostbyname(ip_addr) my_checksum = 0 header = struct.pack('bbHHh', self.ICMP_ECHO_REQUEST, 0, my_checksum, ID, 1)
byte_in_double = struct.calcsize("d") # C type: double
data = (192 - byte_in_double) * "P" # any char is OK, any length is OK
data = struct.pack("d", time.clock()) + data my_checksum = self.get_checksum(header + data) header = struct.pack("bbHHh", self.ICMP_ECHO_REQUEST, 0, socket.htons(my_checksum), ID, 1)
packet = header + data
my_socket.sendto(packet, (ip, 80)) # it seems that 0~65535 is OK (port?) def ping_once(self,ip_addr, timeout):
icmp = socket.getprotobyname('icmp')
try:
my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
except socket.error:
raise my_ID = os.getpid() & 0xFFFF self.send_ping(my_socket, ip_addr, my_ID)
delay = self.receive_ping(my_socket, my_ID, timeout) my_socket.close()
return delay def icmp_ping(self,ip_addr,timeout,count):
number=1
for i in range(count):
print 'ping ' + ip_addr,
try:
delay = self.ping_once(ip_addr, timeout)
if delay == None:
print 'failed. (timeout within %s second.)' % timeout
if number==count:
print('The request has failed %s times,Email alerts are being sent' % count)
getcfg(self.filename).sendmessage(ip_addr)
else:
print 'get reply in %0.4f ms' % (delay * 1000)
break
except socket.gaierror, e:
print "failed. (socket error: '%s')" % e[1]
break
number=number+1 if __name__ == '__main__':
weixin=weixin.WeChat()
mail=mail.sendmail()
cfgname='ping_monitor.txt'
ping(cfgname)
pingcfg=getcfg(cfgname)
pingcfg.next_check()

 

配置文件

[rule]
retry = 4
timeout = 1
next_check = 300
#单位都是秒
[scan_network]
3paragraph_begin = 10.1.3.198
3paragraph_end = 202
2paragraph_begin = 10.1.2.1
2paragraph_end = 10 [mail]
mailto1=guoyabin@ccln.gov.cn
mailto2=lzt417@126.com [allip]
#这里会自动把扫描到的ip写入

  

 

python2写ping监控,自动发现ip的更多相关文章

  1. zabbix监控自动发现监控tomcat(V1)

    背景说明: 由于zabbix监控使用自带的模版,只能监控主机上只有1个tomcat的场景适合,虽然网上很多朋友都是在每个监控项上面添加一个空格来解决问题.但是个人感觉这种方法还是蛮麻烦的,所以写一篇使 ...

  2. zabbix的日常监控-自动发现端口并监测(服务器开启的所有端口或监控指定端口)(十三)

    动批量检查agent开放的端口 注:此方法给监控磁盘IO(即十二)篇过程一样: 注释:如果服务器上的应用都是固定的,不会随机产生的都可以使用自动发现端口来监控:  如果服务器会随机出现端口且每次启动程 ...

  3. zabbix添加自定义监控(自动发现)遇到的问题

    问题:zabbix添加自动发现端口,提示Value should be a JSON object [root@localhost zabbix_agentd.d]# zabbix_get -s 19 ...

  4. 自动化监控Zabbix之主机自动发现

    创建思路 首先说下自动发现强大的功能,它到底可以帮助我们完成什么工作: 快速发现并添加主机 简单的管理 随着环境的改变而快速搭建监控系统 自动发现基于网络发现功能,而网络发现又基于以下信息: IP地址 ...

  5. zabbix之Low-level discovery(自动发现)

    功能: 自动发现挂载点并自动监控 自动发现网卡并自动监控 创建自动发现挂载点并监控 功能 假如要在monitor_linux模板中创建自动发现挂载点的功能 配置-->模板-->选择模板-- ...

  6. 机房ping监控 smokeping+prometheus+grafana(续) 自动获取各省省会可用IP

    一.前言 1.之前的文章中介绍了如何使用smokeping监控全国各省的网络情况:https://www.cnblogs.com/MrVolleyball/p/10062231.html 2.由于之前 ...

  7. zabbix自动发现与自动注册、自定义监控

    一.自动发现与自动注册在上面的介绍中,我们演示了手动添加一台主机的方法,虽然简单,但是当要添加的主机非常多时,也将变得非常繁琐,那么有没有一种方法,可以实现主机的批量添加呢,这样就会极大的提高运维效率 ...

  8. 添加zabbix自动发现(监控多tomcat实例)

    说明 何为自动发现?首先我们监控多tomcat实例,如果一个个实例地添加或许可以完成当前需求.但是日后随着实例的增多,再手动一个个去添加就十分不方便了.这时候需要自动发现这个功能,来帮助我们自动添加监 ...

  9. 使用lld自动发现监控多实例redis

    zabbix 可以通过常见的手段监控到各种服务,通过编写脚本来获取返回值并将获取到的值通过图形来展现出来,包括(系统.服务.业务)层面.可是有些时候在一些不固定的场合监控一些不固定的服务就比较麻烦.例 ...

随机推荐

  1. 你管这叫代理模式(Proxy Pattern)

    代理模式   代理模式即给一个真实类提供一个代理类,该代理类代替真实类完成其功能,一般还可在代理类上添加一些真实类不具有的附加功能,通俗来讲代理模式就是我们生活中常见的中介,代理模式又可分为静态代理和 ...

  2. [C语言基础] 数组与指针之间的引用

    通过指针引用数组,通过数组引用指针,你搞明白了么?通过下面3种情形来了解一下数组和指针 Case 1. unsigned char arry[10]; unsigned char *ptr; unsi ...

  3. 【采坑小计】prometheus的remote write协议遇到的问题

    没有读懂源码以前,无脑试错总是效率很低的! 1.thanos receiver报store locally for endpoint : conflict 接口返回的日志: store locally ...

  4. 如何根据经纬度计算地面上某点在XYZ空间直角坐标系中的坐标

    如何根据经纬度计算地面上某点在XYZ空间直角坐标系中的坐标 /** * @param r: number 到地心的距离 * @param lon: number 经度 * @param lat: nu ...

  5. IDEA2017 maven Spark HelloWorld项目(本地断点调试)

    作为windows下的spark开发环境 1.应用安装 首先安装好idea2017 java8 scalaJDK spark hadoop(注意scala和spark的版本要匹配) 2.打开idea, ...

  6. k8s通过Service访问Pod

    如何创建服务 1.创建Deployment #启动三个pod,运行httpd镜像,label是run:mcw-httpd,Seveice将会根据这个label挑选PodapiVersion: apps ...

  7. 领域驱动设计-CQRS

    CQRS 代表命令查询职责分离.这是我第一次听到Greg Young描述的模式.其核心概念是,您可以使用与用于读取信息的模型不同的模型来更新信息.在某些情况下,这种分离可能很有价值,但请注意,对于大多 ...

  8. Ldap主从复制搭建

    LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写, LDAP协议的特点 读取速度远高于写入速度. 对查询做了优化,读取速度优于普通关系数据 ...

  9. 不难懂-----redux

    一.flux的缺陷 因为dispatcher和Store可以有多个互相管理起来特别麻烦 二.什么是redux 其实redux就是Flux的一种进阶实现.它是一个应用数据流框架,主要作用应用状态的管理 ...

  10. 如何保存并复制python虚拟环境

    关于虚拟环境的一些基础概念学习了本期视频 保存 以我的一个虚拟环境示例: 在要保存的虚拟环境下使用: pip freeze > requirements.txt 复制 pip install - ...