版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
这里的代码是监控区域内的所有IP地址,故障数量达到某个值后就触发告警
import os
import time
import re
import subprocess
import threading
from queue import Queue
ip_queue = Queue()
abnormal_num = 0
call_num = 1
name = os.path.split('C:/Users/Administrator/Desktop/zone')[-1] # 获取文件名用于告警通知是哪个zone的网络故障
with open('C:/Users/Administrator/Desktop/zone', 'r') as z_ip:
for line in z_ip:
z_file = line.strip()
ip_queue.put(z_file)
def zone(name):
while not ip_queue.empty():
ip = ip_queue.get()
status1 = subprocess.Popen('ping -n 5 {}'.format(ip), stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True)
res1 = str(status1.stdout.read(), encoding='gbk')
regex1 = re.findall(r'\w*%\w*', res1)[0] # 获取丢包率,百分比
loss1 = int(re.findall(r'\d*', regex1)[0]) # 获取丢包率数字
if loss1 >= 80:
time.sleep(10)
status2 = subprocess.Popen('ping -n 5 {}'.format(ip), stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True)
res2 = str(status2.stdout.read(), encoding='gbk')
print(res2) # ping输出值
regex2 = re.findall(r'\w*%\w*', res2)[0] # 获取丢包率,百分比
loss2 = int(re.findall(r'\d*', regex2)[0]) # 获取丢包率数字
print('loss {}%'.format(loss2))
if loss2 >= 80:
global abnormal_num, call_num
abnormal_num += 1
down_time = time.strftime("%Y-%m-%d %H:%M:%S")
print('down time: [{}]; zone: {}; ip: {}; abnormal num: {}'.format(down_time, name, ip, abnormal_num))
if abnormal_num >= 3 and call_num == 1:
call_num += 1 # 设置只触发一次告警
send_sms('down {}'.format(name)) # 这里就可以调用你编写的告警函数,我的代码未贴出来
if __name__ == '__main__':
for t in range(10):
z_th = threading.Thread(target=zone, args=(name,))
z_th.start()