网络连通性
创建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")