多平台统一管理软件接口,如何实现多平台统一管理软件接口
346
2022-09-11
【逗老师带你学IT】PRTG监控系统配合树莓派采集企业内部无线网络质量
@TOC
本文介绍了一种,如何通过树莓派采集企业内部无线网络质量,将树莓派变成无线探针,并在PRTG网络监控平台上进行显示的方法。
可以监控我们感兴趣的无线网络的各项指标,包括
无线丢包ping测试最大、最小,平均,抖动设备温度无线信道无线协商速率无线连接质量射频信号功率
实现原理
树莓派运行了基于Debian的Linux系统。通过iwconfig,ping,ifconfig,iproute等linux常见命令获取设备当前的网络连接情况,并通过Python格式化数据后,转换成PRTG系统可以识别的XML格式的数据文件。
部署方法
一、树莓派无线网络连接
目前的树莓派常见的有Raspberry Pi 4,3+,3三个主要流行的版本。具体支持的无线情况如下: 型号 |
支持的无线频段 |
---|---|
Raspberry Pi 4B | 5Ghz+2.4GHz |
Raspberry Pi 3B+ | 5Ghz+2.4GHz |
Raspberry Pi 3B | Only 2.4GHz |
由于4B的各版本目前刚刚发布,大批量部署性价比不合适。3B版本不支持5G。这样看来的话,使用3B+版本+POE模块其实刚刚好。树莓派无线网络连接比较简单,编辑
/etc/wpa_supplicant/wpa_supplicant.conf
该文件记录了树莓派WIFI的相关配置
network={ ssid="无线网络名字" psk="无线密码" key_mgmt=WPA-PSK }
配置完成之后重启网络服务
service networking restart
由于我们的目标是这个树莓派不管插在任何一个网口上,甚至是不连接有线直接通过无线连接上报采集的数据,因此需要同时启用eth和wlan网口,并配置缺省路由的优先级,eth缺省路由优先级较高。编辑文件
cat /etc/network/interfaces
auto eth0 iface eth0 inet dhcp metric 10 #eth0的metric为10 ,如果存在eth0为下一跳的缺省路由,优选此条缺省路由。 allow-hotplug wlan0 auto wlan0 iface wlan0 inet dhcp metric 100 #wlan的metric跳数配置比eth0高 pre-up wpa_supplicant -B w -D wext -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf post-down killall -q wpa_supplicant #关联WPA_Supplicat文件
配置完成后,重启网络服务,重启无线网卡接口。嫌麻烦的的可以直接重启设备。
service networking restart ifdown wlan0 ifup eth0
二、编写shell脚本
#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
cd /home/pi
if [ -f checkresult.txt ]; then
#echo "remove old checkresult.txt file ... "
rm -f checkresult.txt
fi
if [ -f $HOSTNAME-WIFI_Check_result.txt ]; then
#echo "$HOSTNAME-WIFI_Check_result.txt file ... "
rm -f $HOSTNAME-WIFI_Check_result.txt
fi
if [ -f IP-WIFI-Check-$HOSTNAME.txt ]; then
#echo IP-WIFI-Check-$HOSTNAME.txt file ... "
rm -f IP-WIFI-Check-$HOSTNAME.txt
fi
#删除可能存在的历史文件
wlangwip=$(route | grep wlan0 | grep default)
wlangwip=${wlangwip##*default}
wlangwip=${wlangwip%%0.0.0.0*}
#这一顿骚操作,是为了获取目前无线网络的网关IP地址
#我们尽可能的保证这个脚本的普适性,因此需要自动获取当前无线网络的网关IP
# route | grep wlan0 | grep default like this:
#default 10.0.192.1 0.0.0.0 UG 100 0 0 wlan0
# ↑就是为了获取这个字段
#-------------------------------------------------------------------
ping -c 200 -i 0.1 $wlangwip >> checkresult.txt
#100ms间隔快速ping网关IP,结果写入checkresult.txt文件
iwconfig wlan0 >> checkresult.txt
#iwconfig命令是无线网卡的状态,将状态写入checkresult.txt文件
#-------------------------------------------------------------------
echo '
三、编写Python
encoding=utf-8
import re
import os
import sys
import datetime
#-------------------------------------------------------------------
#定义一个读文件的函数,读取之前shell脚本生成的checkresult文件
def read_file_as_str(file_path):
# 判断路径文件存在
if not os.path.isfile(file_path):
raise TypeError(file_path + " does not exist")
all_the_text = open(file_path).read()
# print type(all_the_text)
return all_the_text
#-------------------------------------------------------------------
#定义一个按照关键字查找关键字前后固定长度的函数
def find_str_as_keyword(str_all,keyword,start,end):
start=int(start)
end=int(end)
len_start=str_all.find(keyword)+start
len_end=str_all.find(keyword)+end
#print len_start
#print len_end
echo_str=str_all[len_start:len_end]
return echo_str
#-------------------------------------------------------------------
#定义一个按照两个关键字查找关键字之间内容的函数
def between_str_as_keyword(str_all,keyword1,keyword2,keyword1_start=0,keyword2_end=0):
keyword1_start=int(keyword1_start)
keyword2_end=int(keyword2_end)
len_start=str_all.find(keyword1)+keyword1_start
len_end=str_all.find(keyword2)+keyword2_end
#print len_start
#print len_end
echo_str=str_all[len_start:len_end]
return echo_str
#-------------------------------------------------------------------
def main(input_file_path,output_file_path,hostname):
checkresult=read_file_as_str(input_file_path)
#注意:
#搜索结果=find_str_as_keyword(待搜索字符串,关键字,搜索结果起始长度,搜索结束长度)
#搜索keyword保证不能重复,尽可能搜索长的关键字
#起始和结束长度从keyword第一个字符串算起,且包含keyword本身长度
#packetloss=find_str_as_keyword(checkresult,"packet loss",-3,11)
packetloss=between_str_as_keyword(checkresult,"received,","% packet loss",10)
#注意丢包率长度会变-使用between函数查找区间
minavgmaxmdev=between_str_as_keyword(checkresult,"min/avg/max/mdev","wlan0",19,-1)
PingMin=minavgmaxmdev[0:minavgmaxmdev.find("/")]
minavgmaxmdev=minavgmaxmdev[minavgmaxmdev.find("/")+1:]
PingAvg=minavgmaxmdev[0:minavgmaxmdev.find("/")]
minavgmaxmdev=minavgmaxmdev[minavgmaxmdev.find("/")+1:]
PingMax=minavgmaxmdev[0:minavgmaxmdev.find("/")]
minavgmaxmdev=minavgmaxmdev[minavgmaxmdev.find("/")+1:]
PingMdev=minavgmaxmdev[0:minavgmaxmdev.find(" ms")]
#抖动值字符串多次截取/与/之间的内容,原文格式类似于:2.103/9.325/29.067/8.392 ms
totaltime=between_str_as_keyword(checkresult,"loss, time","rtt min/",11,-3)
#注意总时间字符串长度会变-使用between函数查找区间
AccessPoint=find_str_as_keyword(checkresult,"Access Point:",14,31)
Frequency=between_str_as_keyword(checkresult,"Frequency:"," GHz",10)
#注意信道选择字符串长度会变-使用between函数查找区间
BitRate=between_str_as_keyword(checkresult,"Bit Rate="," Mb/s Tx-Power",9)
#注意连接速率长度会变
LinkQuality=between_str_as_keyword(checkresult,"Link Quality=","/70 Signal level",13)
#注意连接质量长度--可能--会变
Signallevel=between_str_as_keyword(checkresult,"Signal level=","Rx invalid",13,-17)
WlanGWIP=between_str_as_keyword(checkresult,"--- "," ping statistics ---",4)
DeviceTemp=between_str_as_keyword(checkresult,"
下面是XML文档生成的代码,先看一下,之后我们详细讲解PRTG的XML文件字段届时
#-------------------------------------------------------------------
#下面这一大段是生成xml文件的函数
def write_file_as_path(file_path,write_packetloss,write_PingMin,write_PingAvg,write_PingMax,write_PingMdev,write_totaltime,write_AccessPoint,write_Frequency,write_BitRate,write_LinkQuality,write_Signallevel,write_hostname,write_WlanGWIP,write_DeviceTemp,write_Eth0_IP,write_WLAN_IP):
f=open(file_path,'w')
#with open(file_path,'w',encoding='gbk') as f:
f.write('\n')
f.write('
四、PRTG系统配置
在PRTG探针所在的操作系统里编写如下脚本。由于树莓派送过来的XML文件的命名格式都是:主机名-WIFI_Check_result.txt所以我们的BAT脚本可以通过%1传入的参数来打印对应主机名设备的上报信息
@echo off chcp 65001 type "C:\00-tftp\%1-WIFI_Check_result.txt"
保存到
C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML
五、树莓派shell脚本配置定时执行
定时执行配置很简单
crontab -e
打开定时任务执行列表,在最后添加上一句
*/1 * * * * sh /home/pi/checknetwork.sh
脚本地址就是我们刚才写好的shell脚本。注意,crontab运行脚本的时候是不带系统变量的,所以我们之前的脚本里已经提前写了PATH变量。
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
当然还有一种办法,你再写个脚本,来调这个脚本。比如随便在root目录下写个脚本,就写一句话,调用checknetwork.sh。这样也可以避免PATH不同步的情况。
#!/bin/bash /home/pi/checknetwork.sh
进阶提高
看到这里,基本功能都实现了,但是接下来我们还有一些高阶的应用
一、多个树莓派自动更新脚本
对于网内所有的树莓派,如果shell脚本或者python程序出现迭代更新,我们设计了一个办法统一下发新版本的shell脚本和python到所有的树莓派。这对于网内有几十个树莓派的时候,非常有用。找一台linux主机做版本服务器,写个下面的脚本
#!/bin/bash TFTPPATH="/root/tftp_file" IPLISTPATH="/root/PRTG_WIFI_Probe/IPlist" rm -f $IPLISTPATH/* mv $TFTPPATH/IP-WIFI* $IPLISTPATH/ find $IPLISTPATH/ -mmin +2 -name "IP-WIFI*" -exec rm {} \; #保留最近2分钟内更新过的IP-WIFI-*****.txt文件,之前的删除掉 cat $IPLISTPATH/IP-WIFI* > /root/PRTG_WIFI_Probe/IPlist_all.txt #合并所有的IP-WIFI-*****.txt for ip in `cat /root/PRTG_WIFI_Probe/IPlist_all.txt | tr -d "\r" ` do echo "sent file to "$ip scp /root/PRTG_WIFI_Probe/programfile/checknetwork.py $ip:/home/pi scp /root/PRTG_WIFI_Probe/programfile/checknetwork.sh $ip:/home/pi done #全部下发一遍文件
这里面,就涉及到了之前在树莓派上的一段骚操作。
NIC=$(route -n | grep UG | awk '{print $8}'| awk 'NR==1') ifconfig $NIC | grep "inet " | awk '{print $2}' >> IP-WIFI-Check-$HOSTNAME.txt #这两句详细解释一下 #第一句,获取当年设备缺省路由表第一行的记录,并提取其中的网卡设备名 #第二句,获取此网卡目前的IP地址 #这个地址是目前树莓派与服务器通信的主地址。仅连接无线的情况为wlan0 IP地址,同时连接有线无线的时候为eth0 IP地址 #这个地址,之后集中下发脚本的时候用得到
二、树莓派保活探测
本例中,PRTG系统会读取生成的XML文件,只要这个文件存在,系统就不会告警。因此,如果某个树莓派出现异常,不继续更新上报信息的时候。我们需要一个机制来探测,XML文件是否一直在正常更新在PRTG探针所在的服务器上,编写以下BAT脚本
@echo off&setlocal enabledelayedexpansion for /f "tokens=1 delims=" %%i in ('dir C:\00-tftp /tw ^| find /i "%1-WIFI_Check_result.txt" ') do set timeresult=%%i set ma=%timeresult:~15,2% set mb=%time:~3,2% set /a ma=1%ma%-100 set /a mb=1%mb%-100 #以上两句是去除分钟为08时的异常。BAT脚本对于08xxx的数字会认为是8进制 set /a mc=%mb%-%ma% if %mc% gtr 2 (echo %mc%:Error Time Out) else (echo %mc%:Active)
然后,放到如下的路径下
C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXE
好了,去PRTG添加一个自定义传感器,使用这个脚本,传参为设备名。XML文件超过2分钟没更新就告警咯。
三、PRTG XML格式自定义传感器XML解释
来个示例
XML Return Format: Minimum Example:
搞定!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~