通过 PRTG EXE 高级监控脚本 + python 监控华为防火墙线路健康状态

背景

通过 SNMP 无法获取 华为 healthcheck 健康监测状态,本机建介绍PRTG脚本 通过 EXE 脚本自定义监控参数,该传感器可以接受 json 或者 xml 格式,下来来看看如何是先吧~~~

要监控的信息
image-20220916165732362

环境及配置依赖

  • 系统:win-11
  • python : 3.10.7
pip install paramiko
pip install textfsm

编写脚本

python 脚本

import paramiko
import time
import textfsm
import json
import sys


# 连接设备
def connect_device(ip, link_name):
    ip = ip
    link_name = link_name
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 替换你的账户及密码 'name', 'password'
    ssh_client.connect(ip, 22, 'name', 'password', look_for_keys=False)
    command = ssh_client.invoke_shell()
    time.sleep(0.5)
    command.send('screen-length 0 temporary \n')
    time.sleep(1)
    command.send('display healthcheck name {} \n'.format(link_name))
    time.sleep(1)
    command.send('display healthcheck name {} verbose \n'.format(link_name))
    time.sleep(1)
    command_result = command.recv(65535).decode(encoding='utf-8').lower()
    ssh_client.close()

    # 通过textfsm模块获取数据, textfsm建议使用绝对路径
    tex_temp = open(open('C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\huawei_health_check_temp.txt', encoding='utf-8'), encoding='utf-8')
    result = textfsm.TextFSM(tex_temp).ParseTextToDicts(command_result)
    return result


# 传感器是从回显中获取信息的,将处理后的信息打印处理 
def print_result(dev_result, data):
    # 获取health_check的状态
    dev_state = dev_result[0]

    link_state = {
        "Channel": "{} Statu".format(dev_state['line_Name']),
        "CustomUnit": "#",
        "Mode": "Absolute"
    }
	
    # 定义状态信息,0 为正常,1 为部分地址探测异常,2 为healthcheck探测失败
    if dev_state['All_State'] == 'up' and dev_state['line_down'] == '0':
        link_state["Value"] = 0
        data['prtg']['text'] = "Link State: up"

    elif dev_state['All_State'] == 'up' and dev_state['line_down'] != '0':
        link_state["Value"] = 1
        data['prtg']['text'] = "Link State: Some lines are abnormal"
        data['prtg']['Warning'] = 1
    else:
        link_state["Value"] = 2
        data['prtg']['text'] = "Link State: down"
        data['prtg']['Error'] = 1

    data['prtg']['result'].append(link_state)

    # 处理每个目的地址监测状态
    for one_line in dev_result:
        one_link_state = {
            "Channel": "{} Check Statu".format(one_line['One_Destination']),
            "CustomUnit": "#",
            "Mode": "Absolute",
        }

        if one_line['One_State'] == 'up':
            one_link_state['Value'] = 0
        else:
            one_link_state['Value'] = 2
        data['prtg']['result'].append(one_link_state)

    print(json.dumps(data, sort_keys=True, indent=2))


def main():
    data = {
        "prtg": {
            "result": [
            ]
        }
    }

    try:
        # 通过sys接受外部数据,设备地址及接口名称
        device_ip = sys.argv[1]
        link_name = sys.argv[2]
        result = connect_device(device_ip, link_name)
        print_result(result, data)

    except Exception as e:
        data['prtg']['text'] = "Link State: {}".format(e)
        print(json.dumps(data, sort_keys=True, indent=2))


if __name__ == '__main__':
    main()

Python 获取到的数据

{
  "prtg": {
    "Warning": 1,
    "result": [
      {
        "Channel": "telecom-china-check Statu",
        "CustomUnit": "#",
        "Mode": "Absolute",
        "Value": 1
      },
      {
        "Channel": "59.36.211.193 Check Statu",
        "CustomUnit": "#",
        "Mode": "Absolute",
        "Value": 0
      },
      {
        "Channel": "223.6.6.6 Check Statu",
        "CustomUnit": "#",
        "Mode": "Absolute",
        "Value": 2
      },
      {
        "Channel": "8.8.8.8 Check Statu",
        "CustomUnit": "#",
        "Mode": "Absolute",
        "Value": 0
      }
    ],
    "text": "Link State: Some lines are abnormal"
  }
}

textfsm模板

Value Filldown line_Name (\S+)
Value Filldown line_member (\w+)
Value Filldown All_State (up|down)
Value Filldown line_init (\d+)
Value Filldown line_down (\d+)
Value Filldown line_up (\d+)
Value One_State (up|down)
Value Required One_Destination (\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})


Start
 ^${line_Name}\s+${line_member}\s+${All_State}\s+${line_up}\s+${line_down}\s+${line_init}
 ^\s+state\s+:\s+${One_State}
 ^\s+\w+\s+\S+\s+\w+\s+\S\s+ip\S${One_Destination} -> Record

bat文件

使用本地python环境调用脚本

@echo off
"C:\Users\quzq\AppData\Local\Programs\Python\Python310\python.exe" "C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\huawei_health_check.py" %1 %2

将文件放置PRTG探针

目录为:C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML

image-20220916170941930

配置监信息

点击添加探针选高级exe脚本

image-20220916171316430

配置相关参数

image-20220916171603677

定义告警信息

image-20220916171651893
image-20220916171828247

当探针有一个线路异常时探诊状态为警告
image-20220916171932939

查看线路异常通道,值显示为2的为down状态
image-20220916172142436

参考链接

传感器介绍 https://www.paessler.com/manuals/prtg/exe_script_advanced_sensor
传感器字段介绍 https://www.paessler.com/manuals/prtg/custom_sensors#command_line

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值