python icmp\dns\http监控网络各个节点状态,并记录日志
配置文件如下:支持多节点:
{
"dns":[{"domainname":"www.baidu.com","dnsserver":"114.114.114.114"}],
"icmp":[{"ip_address":"114.114.114.114"},{"ip_address":"172.17.1.1"},{"ip_address":"192.168.101.1"},{"ip_address":"192.168.9.1"}],
"http":[{"url":"www.baidu.com","title":"百度"}]
}
# 读取配置文件,配置文件,每个监控类型允许多个监控节点,函数返回包含多个节点的列表
def read_config():
try:
file = open("config.json")
config = file.read()
file.close()
config = json.loads(config) http = config["http"]
icmp = config["icmp"]
dns = config["dns"] return http,icmp,dns
except Exception:
print("read config error")
write_logs("read config error")
return None
# 用来写result结果,只有网络异常的时候才会输出
def write_resules(filename,results):
try :
file = open(filename,"a")
file.write(time.asctime(time.localtime(time.time())) + " : " + results + "\n")
file.close()
except Exception:
print(time.asctime(time.localtime(time.time())) + "write results is error")
# 写日志文件,方便在出现错误的时候判断错误原因,只有在出错的时候才会输出
def write_logs(logs):
try :
file = open("logs.txt","a")
file.write(time.asctime(time.localtime(time.time())) + " : " + logs + "\n")
file.close()
except Exception:
print(time.asctime(time.localtime(time.time())) + "write log is error")
# 调用requests发送数据包
def send_http_packet(url):
# requests.packages.urllib3.disable_warnings()
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
headers = {'User-Agent': user_agent}
url = "http://" + url
try:
response = requests.get(url, headers)
response_html = response.content.decode()
return response_html
except Exception:
print('send http packet error,error')
write_logs('send http packet error,error')
return None
# 使用bs4解析获取到的数据,并和给出的网页标题对比
def check_http(url,title):
response_html = send_http_packet(url)
if response_html != None and title != None :
soup = bs4.BeautifulSoup(response_html, 'lxml')
html_title = soup.title.text
if title in html_title:
return True
else:
write_logs("title not same ,web title is : " + html_title)
return False
else:
print('html or title is None')
return False
# 发送数ping数据包
def send_icmp_packet(ip_address):
try:
response_packet = sr1(IP(dst=ip_address)/ICMP(),timeout=2,verbose = False)
return response_packet
except Exception:
print('send icmp packet error,error')
write_logs('send icmp packet error,error')
return None
# 检查icmp数据包有没有正常恢复
def check_icmp(ip_address):
response_packet = send_icmp_packet(ip_address)
if response_packet != None:
return True
else:
return False
# 发送DNS请求
def send_dns_packet(domainname,dnsserver):
i = IP(dst=dnsserver)
u = UDP(dport = 53)
d = DNS(rd=1)
d.qd = DNSQR(qname = domainname , qtype = "A" ,qclass = "IN")
dns_request_packet = i/u/d try:
dns_response_packet = sr1(dns_request_packet,timeout=2,verbose = False)
return dns_response_packet
except Exception:
print("send dns packet error ")
write_logs('send icmp packet error,error')
return None
# 检查DNS请求是否正常返回
def check_dns(domainname,dnsserver):
dns_response_packet = send_dns_packet(domainname,dnsserver) if dns_response_packet != None:
return True
else:
return False
# 为了方便多线程调用,每个监控类型都设置一个启动程序
def start_http(url, title):
while True:
if check_http(url, title) :
print("http True : " + url + "," + title)
else:
print("http False : " + url + "," + title)
write_resules("http_results.txt","http False : " + url + "," + title)
time.sleep(2)
# 为了方便多线程调用,每个监控类型都设置一个启动程序
def start_icmp(ip_address):
while True:
if check_icmp(ip_address) :
print("icmp True : " + ip_address)
else:
print("icmp False : " + ip_address)
write_resules("icmp_results.txt","icmp False : " + ip_address)
time.sleep(2)
# 为了方便多线程调用,每个监控类型都设置一个启动程序
def start_dns(domainname,dnsserver):
while True:
if check_dns(domainname,dnsserver) :
print("dns True : " + domainname + "," + dnsserver)
else:
print("dns False : " + domainname + "," + dnsserver)
write_resules("dns_results.txt","dns False : " + domainname + "," +dnsserver)
time.sleep(2)
# 主函数
def main():
http,icmp,dns= read_config() # 循环取出http监控节点,每个节点启动一个线程
for h in http:
url = h["url"]
title = h["title"]
moniter_http = threading.Thread(target=start_http,args=(url, title))
moniter_http.start() # 循环取出icmp监控节点,每个节点启动一个线程
for i in icmp:
ip_address = i["ip_address"]
moniter_icmp = threading.Thread(target=start_icmp,args=(ip_address,))
moniter_icmp.start() # 循环取出dns监控节点,每个节点启动一个线程
for d in dns:
domainname = d["domainname"]
dnsserver = d["dnsserver"]
moniter_dns = threading.Thread(target=start_dns,args=(domainname,dnsserver))
moniter_dns.start()
if __name__ == '__main__':
main()
python icmp\dns\http监控网络各个节点状态,并记录日志的更多相关文章
- 运用Ntop监控网络流量(视频Demo)
运用Ntop监控网络流量 ____网络流量反映了网络的运行状态,是判别网络运行是否正常的关键数据,在实际的网络中,如果对网络流量控制得不好或发生网络拥塞,将会导致网络吞吐量下降.网络性能降低.通过流量 ...
- Ntop监控网络流量
运用Ntop监控网络流量 ____ 网络流量反映了网络的运行状态,是判别网络运行是否正常的关键数据,在实际的网络中,如果对网络流量控制得不好或发生网络拥塞,将会导致网络吞吐量下降. 网络性能降低.通过 ...
- Linux服务器上监控网络带宽的18个常用命令nload, iftop,iptraf-ng, nethogs, vnstat. nagios,运用Ntop监控网络流量
Linux服务器上监控网络带宽的18个常用命令 本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量 ...
- C# 利用性能计数器监控网络状态
本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态.并能够直观的展现出来 涉及到的知识点: PerformanceCounter,表示 Windows NT 性能计数器 ...
- python基础教程总结13——网络编程,
1.网络设计模块 1.1 socket模块 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. 1)服务器监听:是服务器端套接 ...
- 用python进行服务器的监控
用python进行服务器的监控 在linux服务器中,一切皆为文件,就是说,服务器运行的个中信息,其实是可以从某些文件中查询得到的:百度后,你会知道,在Linux系统中,有一个/proc的虚拟文件系统 ...
- 【python之路35】网络编程之socket相关
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- zabbix监控网络的出入口流量
首先我们登录到zabbix 点击配置---->模板-->Template OS Linux 下的监控项 点击右上角的添加监控项目 我们的服务器是在Ucloud上的,我们的网卡名称为eth0 ...
随机推荐
- 一份非常完整的MySQL规范
一.数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名 ...
- 学习Identity Server 4的预备知识 (误删, 重补)
我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...
- MySQL自定义函数与存储过程
1.前置条件 MySQL数据库中存在表user_info,其结构和数据如下: mysql> desc user_info; +-----------+----------+------+---- ...
- 强化学习(三)用动态规划(DP)求解
在强化学习(二)马尔科夫决策过程(MDP)中,我们讨论了用马尔科夫假设来简化强化学习模型的复杂度,这一篇我们在马尔科夫假设和贝尔曼方程的基础上讨论使用动态规划(Dynamic Programming, ...
- merge和rebase的区别
前言 我从用git就一直用rebase,但是新的公司需要用merge命令,我不是很明白,所以查了一些资料,总结了下面的内容,如果有什么不妥的地方,还望指正,我一定虚心学习. merge和rebase ...
- C#属性标记Order执行顺序备忘录
部分Attribute有实现IOrderedFilter,其执行顺序机制例子: /// <summary> /// 密码修改 /// </summary> /// <pa ...
- [转]Blue Prism Login Agent 使用指导手册
本文转自:https://cloud.tencent.com/developer/news/83035 咳!咳!咳! 第一篇RPA技术文,还是贼拉鸡冻.各位大侠要多多支持啊 1.Login Agent ...
- C# 曲线上的点(一) 获取指定横坐标对应的纵坐标值
获取直线上的点,很容易,那曲线呢?二阶贝塞尔.三阶贝塞尔.多段混合曲线,如何获取指定横坐标对应的纵坐标? 如下图形: 实现方案 曲线上的点集 Geometry提供了一个函数GetFlattenedPa ...
- C#--深入理解类型
今日无事,回顾了一下C#基础知识,颇有收获,就自己的理解,写了这篇文章,如有不对,欢迎指正. C#中的类型可以分为两类:值类型与引用类型,如下图所示. 值类型通常被分配到线程的堆栈上,而引用类型则被分 ...
- 简简单单的Vue3(插件开发,路由系统,状态管理)
既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 插件 路由(vue-router) 状态管理模式(Vuex) 那在上篇文章,我们讲了, ...