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 可以通过常见的手段监控到各种服务,通过编写脚本来获取返回值并将获取到的值通过图形来展现出来,包括(系统.服务.业务)层面.可是有些时候在一些不固定的场合监控一些不固定的服务就比较麻烦.例 ...
随机推荐
- 1.配置桥接,并抓包验证 2.实现免密登录 3.修改登录端口: 22-》2222 4.不允许root用户远程登录 5.创建用户sshuser1,并设置密码,且只允许sshuser1远程ssh登录
1.配置桥接: 抓包时如果有ens160的ICMP,说明我们的桥接搭建成功通过桥接访问到了ens160(这里忘加图片了) (1)创建一个桥接设备和会话 (2)添加设备和会话到桥接设备上 (3)启动从 ...
- 【reverse】逆向3 寻找地址
[reverse]逆向3 寻找地址 寻址公式一:[立即数] 读取内存的值: mov eax,dword prt ds:[0x13FFC4] 将内存编号为0x13FFC4.0x13FFC5.0x13FF ...
- 【分享】thanos receiver的grafana报表配置
具体的部署是:用prometheus抓取thanos receiver的10909端口,然后grafana再请求这个prometheus 具体的JSON配置请见最后 本文的一些监控配置,参考了这篇文章 ...
- 【记录一个问题】神坑,自定义一个golang的error类型,居然运行崩溃了
2020-05-20 18:20补充: 感谢yif同学提供指导,出现错误并且打印大量信息的原因是函数递归调用导致栈溢出. 而导致递归调用的关键代码是%v 类型实现了error的interface %v ...
- 学习OAuth 2.0
认识OAuth 2.0 OAuth 2.0 是行业标准的授权协议. OAuth 2.0 专注于客户端开发人员的简单性,同时为 Web 应用程序.桌面应用程序.移动设备提供特定的授权流程. 应用场景 有 ...
- Go 面向对象之结构体
#### Go 面向对象之结构体最近有四天没更新公众号,有一些事情耽误了,生活就是这样,总会一些事情让人措不及防; ***山浓水浅,坐看流年***1. Go 也支持面向对象编程(OOP) 但是它和传统 ...
- chapter2 线性回归实现
1 导入包 import numpy as np 2 初始化模型参数 ### 初始化模型参数 def initialize_params(dims): w = np.zeros((dims, 1)) ...
- JVM诊断及工具笔记(2)使用arthas定位哪里执行了System#gc()
笔者是汽车之家实时计算平台的一名小伙伴.负责flink平台,数据湖及kafka平台的设计与开发.平时擅长做平台设计,定位及解决各种疑难杂症.第二篇文章,讲的点依旧很小,但是这次图多!!! 在这里感谢支 ...
- Working hard to know your neighbor's margins:Local descriptor learning loss论文笔记
Abstract 论文提出了一种新的训练方法,受到了 Lowe's matching criterion for SIFT的启发.这种新的loss,要比负责的正则方法更好.把这个新的loss方法结合L ...
- 常见线程池 newFixedThreadPool 的简单使用
package com.aaa.threaddemo; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurr ...