python SNMP 模拟管理

7 篇文章 1 订阅
此Python脚本通过SNMPv2获取设备的CPU利用率信息,并将其存储到SQLite数据库中。每隔5秒采集一次数据,持续指定时间。之后,程序将从数据库中提取最近一分钟的CPU利用率数据,利用matplotlib绘制实时CPU利用率图表。脚本适用于网络设备监控和性能分析。
摘要由CSDN通过智能技术生成

网络连通性

 

 创建SNMP session,获取OID

 使用获取的OID,做个简易信息获取

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author yinteacher
from pysnmp.hlapi import *
import os
import sqlite3
import datetime
import time
from dateutil import parser
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
import matplotlib.ticker as mtick
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文
plt.rcParams['font.family'] = 'sans-serif'

def snmpv2_get(ip, community, oid, port=161):
    # varBinds是列表,列表中的每个元素的类型是ObjectType(该类型的对象表示MIB variable)
    error_indication, error_status, error_index, var_binds = next(
        getCmd(SnmpEngine(),
               CommunityData(community),  # 配置community
               UdpTransportTarget((ip, port)),  # 配置目的地址和端口号
               ContextData(),
               ObjectType(ObjectIdentity(oid))  # 读取的OID
               )
    )
    # 错误处理
    if error_indication:
        print(error_indication)
    elif error_status:
        print('%s at %s' % (
            error_status,
            error_index and var_binds[int(error_index) - 1][0] or '?'
        )
              )
    # 如果返回结果有多行,需要拼接后返回
    result = ""

    for varBind in var_binds:

        result = result + varBind.prettyPrint() # 返回结果!
    # 返回的为一个元组,OID与字符串结果
    # print(result)
    return result.split("=")[0].strip(), result.split("=")[1].strip()

def get_info_writedb(ip, rocommunity, dbname, seconds):
    # 如果文件存在,删除数据库文件
    if os.path.exists(dbname):
        os.remove(dbname)
    # 连接数据库
    conn = sqlite3.connect(dbname)
    cursor = conn.cursor()
    # 创建数据库
    cursor.execute("create table routerdb(id INTEGER PRIMARY KEY AUTOINCREMENT, time timestamp , cpu int, memu int, memf int)")

    while seconds > 0:
        # cpmCPUTotal5sec
        cpu_info = snmpv2_get(ip, rocommunity, "1.3.6.1.4.1.9.9.109.1.1.1.1.3.7", port=161)[1]
        # cpmCPUMemoryUsed
        memu_info = snmpv2_get(ip, rocommunity, "1.3.6.1.4.1.9.9.109.1.1.1.1.12.7", port=161)[1]
        # cpmCPUMemoryFree
        memf_info = snmpv2_get(ip, rocommunity, "1.3.6.1.4.1.9.9.109.1.1.1.1.13.7", port=161)[1]
        # 记录当前时间
        time_info = datetime.datetime.now()
        # 把数据写入数据库
        cursor.execute("insert into routerdb (time, cpu, memu, memf) values ('%s', %d, %d, %d)"
                       % (time_info, int(cpu_info), int(memu_info), int(memf_info)))
        # 每五秒采集一次数据
        time.sleep(5)
        seconds -= 5
    # 提交数据到数据库
    conn.commit()

def mem_show(dbname):
    # 连接数据库
    conn = sqlite3.connect(dbname)
    cursor = conn.cursor()
    # 提取时间,MEM使用量和空闲量
    cursor.execute("SELECT time,cpu,memf FROM routerdb where datetime(time) > datetime('now','-1 minute') ")
    # cursor.execute("SELECT time,memu,memf FROM routerdb ORDER BY time DESC LIMIT 12")
    yourresults = cursor.fetchall()

    time_list = []
    mem_list = []

    # 把结果写入time_list和cpu_list的列表
    for time_mem in yourresults:
        time_list.append(time_mem[0])
        # 采用(Used的数据/Used+Free的数据(总和))* 100 的方式计算利用率
        mem_list.append(time_mem[1])

    # 转换字符串到时间对象
    time_list = [parser.parse(i) for i in time_list]

    # 调节图形大小,宽,高
    fig = plt.figure(figsize=(6, 6))
    # 一共一行, 每行一图, 第一图
    ax = fig.add_subplot(111)

    # 添加主题和注释
    plt.title('路由器CPU利用率')
    plt.xlabel('采集时间')
    plt.ylabel('CPU利用率')

    fig.autofmt_xdate()  # 当x轴太拥挤的时候可以让他自适应

    # 格式化X轴
    # ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d %H:%M:%S'))#设置时间标签显示格式
    ax.xaxis.set_major_formatter(mdate.DateFormatter("%H:%M:%S"))  # 设置时间标签显示格式
    # 格式化Y轴
    # ax.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.2f%%'))#格式化Y轴
    ax.yaxis.set_major_formatter(mtick.FormatStrFormatter('%0.2f%%'))  # 格式化Y轴
    # 传入数据,time为X轴,cpu为Y轴
    ax.plot(time_list, mem_list, linestyle='solid', color='r', label='CPU利用率')
    # 设置Y轴 最小值 和 最大值
    ax.set_ylim(bottom=0, top=100)

    # 设置说明的位置
    ax.legend(loc='upper left')
    # 显示图像
    plt.show()



if __name__ == "__main__":
    # 系统描述
    # print(snmpv2_get("192.168.1.1", "123456", "1.3.6.1.2.1.1.1.0", port=161))
    # # 联系人
    # print(snmpv2_get("192.168.1.1", "123456", "1.3.6.1.2.1.1.4.0", port=161))
    # # 主机名
    # print(snmpv2_get("192.168.1.1", "123456", "1.3.6.1.2.1.1.5.0", port=161))
    # # 地点
    # print(snmpv2_get("192.168.1.1", "123456", "1.3.6.1.2.1.1.6.0", port=161))
    # # cpmCPUTotal5sec
    print(snmpv2_get("192.168.1.1", "123456", "1.3.6.1.4.1.9.9.109.1.1.1.1.3.7", port=161))
    # # cpmCPUMemoryUsed
    # print(snmpv2_get("192.168.1.1", "123456", "1.3.6.1.4.1.9.9.109.1.1.1.1.12.7", port=161))
    # # cpmCPUMemoryFree
    # print(snmpv2_get("192.168.1.1", "123456", "1.3.6.1.4.1.9.9.109.1.1.1.1.13.7", port=161))

    # get_info_writedb("192.168.1.1", "123456", "deviceinfo.sqlite", 180)
    # mem_show("deviceinfo.sqlite")

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值