python2写ping监控,自动发现ip
玩了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的更多相关文章
- zabbix监控自动发现监控tomcat(V1)
背景说明: 由于zabbix监控使用自带的模版,只能监控主机上只有1个tomcat的场景适合,虽然网上很多朋友都是在每个监控项上面添加一个空格来解决问题.但是个人感觉这种方法还是蛮麻烦的,所以写一篇使 ...
- zabbix的日常监控-自动发现端口并监测(服务器开启的所有端口或监控指定端口)(十三)
动批量检查agent开放的端口 注:此方法给监控磁盘IO(即十二)篇过程一样: 注释:如果服务器上的应用都是固定的,不会随机产生的都可以使用自动发现端口来监控: 如果服务器会随机出现端口且每次启动程 ...
- zabbix添加自定义监控(自动发现)遇到的问题
问题:zabbix添加自动发现端口,提示Value should be a JSON object [root@localhost zabbix_agentd.d]# zabbix_get -s 19 ...
- 自动化监控Zabbix之主机自动发现
创建思路 首先说下自动发现强大的功能,它到底可以帮助我们完成什么工作: 快速发现并添加主机 简单的管理 随着环境的改变而快速搭建监控系统 自动发现基于网络发现功能,而网络发现又基于以下信息: IP地址 ...
- zabbix之Low-level discovery(自动发现)
功能: 自动发现挂载点并自动监控 自动发现网卡并自动监控 创建自动发现挂载点并监控 功能 假如要在monitor_linux模板中创建自动发现挂载点的功能 配置-->模板-->选择模板-- ...
- 机房ping监控 smokeping+prometheus+grafana(续) 自动获取各省省会可用IP
一.前言 1.之前的文章中介绍了如何使用smokeping监控全国各省的网络情况:https://www.cnblogs.com/MrVolleyball/p/10062231.html 2.由于之前 ...
- zabbix自动发现与自动注册、自定义监控
一.自动发现与自动注册在上面的介绍中,我们演示了手动添加一台主机的方法,虽然简单,但是当要添加的主机非常多时,也将变得非常繁琐,那么有没有一种方法,可以实现主机的批量添加呢,这样就会极大的提高运维效率 ...
- 添加zabbix自动发现(监控多tomcat实例)
说明 何为自动发现?首先我们监控多tomcat实例,如果一个个实例地添加或许可以完成当前需求.但是日后随着实例的增多,再手动一个个去添加就十分不方便了.这时候需要自动发现这个功能,来帮助我们自动添加监 ...
- 使用lld自动发现监控多实例redis
zabbix 可以通过常见的手段监控到各种服务,通过编写脚本来获取返回值并将获取到的值通过图形来展现出来,包括(系统.服务.业务)层面.可是有些时候在一些不固定的场合监控一些不固定的服务就比较麻烦.例 ...
随机推荐
- 常用Cron表达式范例
描述 表达式 每隔5秒执行一次 */5 * * * * ? 每隔1分钟执行一次 0 */1 * * * ? 每天23点执行一次 0 0 23 * * ? 每天凌晨1点执行一次 0 0 1 * * ? ...
- CSS-选择器的使用
* 默认选择器,这个符号能匹配所有样式,所以如果没有额外定义就默认为这个样式,一般用于消除页面与浏览器的内外边距 <style> *{ padding:0; // 所有标签默认消除内边距 ...
- linux 安装 Logtash 同步mysql数据到Elasticsearch
官网下载Logtash 离线安装包 下载地址 https://www.elastic.co/cn/downloads/logstash 需要注意版本与es 对应 新建配置文件 新建文件夹 mkdir ...
- TeXstudio在右边显示预览
打开预览界面后: 点击查看(View) 选择最后一个:窗口/内嵌(Windowed/Embedded) 就可以了
- cobbler最小化安装centos8
centos8 已经发布了GA版本,迫不及待的想尝鲜了,然后现实总是那么残酷,一直安装失败,具体安装步骤如下: 假设cobbler已配置完成. 1.下载centos8 iso镜像 wget http: ...
- 如何快速将数据用逗号隔开——巧用EXCEL
问题是这样的,下图是爬虫获得的数据,注意该数据存储在CSV格式的EXCEL表格中,单元格中的数据每四个代表一个点的经纬度,但是很明显它现在的这个形式是没法利用的, 因此需要对数据进行挖掘,提取出经纬度 ...
- plsql 普通游标
-- ①普通游标:操作步骤 边敲边想 学无止境 /* 游标:指针:内存中的一块数据缓冲区,上下文: 将查询到的结果集缓存起来,便于进行逐行定位处理. 使用完成后要及时关闭: 操作步骤? 1.定义游标 ...
- Halcon视觉入门芯片识别
Halcon视觉入门芯片识别 需求 有如下图的一个摆盘,摆盘的方格中摆放芯片,一个格子中只放一个,我们需要知道每个方格中是否有芯片去指导我们将芯片放到空的方格中. 分析 通过图片分析得出 我们感兴趣的 ...
- AT2347 [ARC070C] NarrowRectangles
首先不难看出一个暴力的 \(dp\) 解法,考虑令 \(dp_{i, j}\) 表示考虑完前 \(i\) 个矩形,第 \(i\) 个矩形左端点在 \(j\) 时所需要的最小花费. 不难有转移: \[d ...
- 16进制字符串和byte数组进行相互转换\将10进制转换为任意进制
16进制字符串和byte数组进行相互转换 简介 1个byte对应8个bit,16进制使用4个bit,所以一个byte转成16进制,占用两位. JAVA代码 private static final c ...