运维小工具-检查网络设备状态

之前用云管工具感觉很方便,操作很nice

但是不是每个企业所有的网络设备都用的云管设备。

那么有一个能自动帮忙检查所有网络设备是否在线就显得尤为重要了

import subprocess
import platform
import re
from openpyxl import load_workbook
import os
from datetime import datetime


def ensure_results_dir():
    """确保检查结果目录存在"""
    results_dir = os.path.join(os.getcwd(), "检查结果")
    if not os.path.exists(results_dir):
        os.makedirs(results_dir)
    return results_dir


def create_log_file(results_dir):
    """创建日志文件,以当前时间命名"""
    now = datetime.now()
    timestamp = now.strftime("%Y%m%d_%H%M%S")
    log_filename = f"设备检查_{timestamp}.txt"
    log_path = os.path.join(results_dir, log_filename)
    return open(log_path, 'w', encoding='utf-8')


class Logger:
    """同时输出到控制台和文件的日志记录器"""

    def __init__(self, log_file):
        self.log_file = log_file

    def log(self, message, print_to_console=True):
        """记录日志"""
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        log_message = f"[{timestamp}] {message}"
        self.log_file.write(log_message + "\n")
        self.log_file.flush()  # 确保立即写入文件
        if print_to_console:
            print(log_message)


def load_devices_from_excel(file_path='网络设备.xlsx', sheet_name='Sheet1'):
    """从Excel文件加载设备列表"""
    devices = []

    if not os.path.exists(file_path):
        raise FileNotFoundError(f"Excel文件 {file_path} 不存在!")

    try:
        wb = load_workbook(file_path)
        sheet = wb[sheet_name]

        for row in sheet.iter_rows(min_row=2, values_only=True):
            if row[0] and row[4]:  # 确保名称和IP都不为空
                devices.append({
                    "name": str(row[0]).strip(),
                    "ip": str(row[4]).strip()
                })

        return devices
    except Exception as e:
        raise Exception(f"读取Excel文件时出错: {e}")


def ping_device(ip, count=10):
    """执行ping命令并返回成功接收的包数"""
    param = '-n' if platform.system().lower() == 'windows' else '-c'
    command = ['ping', param, str(count), ip]

    try:
        output = subprocess.run(command, stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE, text=True, timeout=15)

        # 改进的正则表达式匹配
        pattern = r'已发送\s*=\s*(\d+),已接收\s*=\s*(\d+)'
        match = re.search(pattern, output.stdout)

        return int(match.group(2)) if match else 0
    except subprocess.TimeoutExpired:
        return 0
    except Exception as e:
        raise Exception(f"Ping {ip} 时发生错误: {e}")


def check_devices_status(devices, logger):
    """检查所有设备的状态并记录结果"""
    if not devices:
        logger.log("没有可检查的设备,请检查Excel文件内容!")
        return

    logger.log("\n设备状态检查开始")
    logger.log("-" * 50)

    results = []
    for device in devices:
        name, ip = device["name"], device["ip"]
        logger.log(f"正在检查 {name} ({ip})...", print_to_console=False)

        try:
            received = ping_device(ip)

            if received == 10:
                status = f"{name} ({ip}) 设备通讯正常 (收到 {received}/10 个响应)"
            elif received >= 5:
                status = f"{name} ({ip}) 设备掉包 (收到 {received}/10 个响应)"
            else:
                status = f"{name} ({ip}) 设备异常 (收到 {received}/10 个响应)"

            logger.log(status)
            results.append(status)

        except Exception as e:
            error_msg = f"{name} ({ip}) 检查失败: {str(e)}"
            logger.log(error_msg)
            results.append(error_msg)

    # 统计结果
    logger.log("-" * 50)
    logger.log(f"共检查 {len(devices)} 台设备,其中:")
    logger.log(f"正常设备: {sum(1 for r in results if '正常' in r)}")
    logger.log(f"掉包设备: {sum(1 for r in results if '掉包' in r)}")
    logger.log(f"异常设备: {sum(1 for r in results if '异常' in r)}")
    logger.log(f"检查失败: {sum(1 for r in results if '失败' in r)}")


if __name__ == "__main__":
    try:
        # 初始化日志系统
        results_dir = ensure_results_dir()
        log_file = create_log_file(results_dir)
        logger = Logger(log_file)

        logger.log("开始检查设备状态...")

        # 从Excel加载设备列表
        try:
            devices = load_devices_from_excel()
            logger.log(f"成功加载 {len(devices)} 台设备")

            # 检查设备状态
            check_devices_status(devices, logger)

        except Exception as e:
            logger.log(f"程序运行出错: {str(e)}")

        logger.log("\n检查完成。")

    finally:
        # 确保日志文件被正确关闭
        if 'log_file' in locals():
            log_file.close()

 表格详情

设备功能設備型號設備名稱VLAN管理IP
核心交换机core_10.130.0.113010.130.0.1
上网行为管理sangfor10.130.0.213010.130.0.2

每个设备检查开始的时候打印一个提示,开始检查,检查完毕打印一个检查结果

最终汇总 检查了几个,有问题的有几个,没问题的有几个 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值