目录
教大家实现图里面的2个仪表盘
其他自行根据 2个仪表盘的模式 进行补充
一.首先准备实验环境
需要环境 python 3.8.8
打开微信 找到老师发的 python3.8.8.exe
或者到官网里面下载
下载完成之后开始配置虚拟环境
搜索 py 找到 刚刚安装好的Python 3.8 (64-bit)
右键他 点击 打开文件位置
再次右键 点击 Python 3.8 (64-bit) 点击打开文件位置
就到了下面这个位置
之后在上面的目录 敲cmd 后 回车
会出现一个 终端
在里面输入
python -m venv d:\ssr\snmp_project
d:\ssr\snmp_project 目录你可以改 改成啥都可以
然后再文件资源管理器 里面找到这个目录d:\ssr\snmp_project
点进Scripts这个文件夹 在上面输入cmd
在弹出来的终端 输入activate.bat 后回车
然后就进入到了这里
依次输入
python -m pip install --upgrade pip
pip install pyasn1-modules==0.2.8
pip install pysnmp==4.4.12
pip install flask
都成功之后 环境就安装好了
二.开始编写代码
先新建前提文件
先在刚刚的Scripts 目录下建一个 python文件 ssr.py
再建一个templates文件夹 (文件名一定要是我这个)
之后再templates 里面 建一个 main.html
好了前提工作好了 接下来就是写代码了
先写python代码
接下来打开刚刚创建的ssr.py
先导入各种模块
import random
from pysnmp.hlapi import *
from flask import Flask,render_template
在加一些全局变量
myOIDs字典里面加入我获取CPU占用率,内存使用率 相关的OID
app = Flask(__name__)
myOIDs={
'cpu_loads' : ". 1.3.6.1.2.1.25.3.3.1.2",
'hrStorageSize':'1.3.6.1.2.1.25.2.3.1.5.1',
'hrStorageUsed':"1.3.6.1.2.1.25.2.3.1.6.1" ,
}
myhost='localhost'
myport=161
mycommunity ='public'
myifindex ='.10'
然后加入这2个分装好的函数
这2个就是
getTableRows(oids)读mib 表的某几个列的全部信息
getObjs(oids): 读mib 多个标量信息
def getTableRows(oids):
iterator = nextCmd(
SnmpEngine(),
CommunityData(mycommunity, mpModel=0),
UdpTransportTarget((myhost, myport)),
ContextData(),
*oids,
lexicographicMode = False)
ret = []
for errorIndication, errorStatus, errorIndex, varBinds in iterator:
count = ()
if errorIndication:
print(errorIndication)
break
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
break
else:
for varBind in varBinds:
count = count + (varBind[1]._value,)
ret.append(count)
return ret
def getObjs(oids):
iterator = getCmd(
SnmpEngine(),
CommunityData(mycommunity, mpModel=0),
UdpTransportTarget((myhost, myport)),
ContextData(),
*oids)
ret = []
errorIndication, errorStatus, errorIndex, varBinds = next(iterator)
if errorIndication:
print(errorIndication)
return 0
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex)-1][0] or '?'))
return 0
else:
for varBind in varBinds:
ret.append(varBind[1]._value)
return ret
然后再把主函数加上
@app.route('/')代表主路由里面固定格式是一个函数返回到main.html
主路由就和C程序里面的main一样 先执行这个 所以运行之后就会跳转到main.html
@app.route('/')
def index():
return render_template('main.html')
if __name__ == '__main__':
app.run()
然后就开始编写给2个仪表盘传输数据的代码了
这个是CPU使用率的
加一个cpu路由 访问这个路由就会返回json格式的数据 这个就用在了下面的更新函数里面
@app.route('/cpu/')
def cpu_used():
cpuoid=ObjectType(ObjectIdentity(myOIDs['cpu_loads']))
ret = getTableRows((cpuoid,))
cpuload=0
for i in ret:
cpuload += i[0]
return {'cpu':cpuload}
这个是内存使用情况的:
def get_memory_usage():
total_memory = getObjs([ObjectType(ObjectIdentity(myOIDs['hrStorageSize']))])
used_memory = getObjs([ObjectType(ObjectIdentity(myOIDs['hrStorageUsed']))])
if total_memory and used_memory and total_memory[0] > 0:
memory_usage = (used_memory[0] / total_memory[0]) * 100
return round(memory_usage, 2)
else:
return None
@app.route('/neicun/')
def memory():
memory_usage = get_memory_usage()
return {'memory_usage': memory_usage}
这样就好了,下面是整合起来的代码
import random
from pysnmp.hlapi import *
from flask import Flask,render_template
app = Flask(__name__)
myOIDs={
'cpu_loads' : ". 1.3.6.1.2.1.25.3.3.1.2",
'hrStorageSize':'1.3.6.1.2.1.25.2.3.1.5.1',
'hrStorageUsed':"1.3.6.1.2.1.25.2.3.1.6.1" ,
}
myhost='localhost'
myport=161
mycommunity ='public'
myifindex ='.10'
def getTableRows(oids):
iterator = nextCmd(
SnmpEngine(),
CommunityData(mycommunity, mpModel=0),
UdpTransportTarget((myhost, myport)),
ContextData(),
*oids,
lexicographicMode = False)
ret = []
for errorIndication, errorStatus, errorIndex, varBinds in iterator:
count = ()
if errorIndication:
print(errorIndication)
break
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
break
else:
for varBind in varBinds:
count = count + (varBind[1]._value,)
ret.append(count)
return ret
def getObjs(oids):
iterator = getCmd(
SnmpEngine(),
CommunityData(mycommunity, mpModel=0),
UdpTransportTarget((myhost, myport)),
ContextData(),
*oids)
ret = []
errorIndication, errorStatus, errorIndex, varBinds = next(iterator)
if errorIndication:
print(errorIndication)
return 0
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex)-1][0] or '?'))
return 0
else:
for varBind in varBinds:
ret.append(varBind[1]._value)
return ret
def get_memory_usage():
total_memory = getObjs([ObjectType(ObjectIdentity(myOIDs['hrStorageSize']))])
used_memory = getObjs([ObjectType(ObjectIdentity(myOIDs['hrStorageUsed']))])
if total_memory and used_memory and total_memory[0] > 0:
memory_usage = (used_memory[0] / total_memory[0]) * 100
return round(memory_usage, 2)
else:
return None
@app.route('/cpu/')
def cpu_used():
cpuoid=ObjectType(ObjectIdentity(myOIDs['cpu_loads']))
ret = getTableRows((cpuoid,))
cpuload=0
for i in ret:
cpuload += i[0]
return {'cpu':cpuload}
@app.route('/neicun/')
def memory():
memory_usage = get_memory_usage()
return {'memory_usage': memory_usage}
@app.route('/')
def index():
return render_template('main.html')
if __name__ == '__main__':
app.run()
然后是main.html 的代码
先写2个盛放仪表盘的元素
<div style="display: flex;">
<div id="gaugeChart" style="width: 300px;height:300px;"></div>
<div id="memory_usage" style="width: 300px;height:300px;"></div>
</div>
接下来到echarts官网下载仪表盘代码
点击我放在这里的链接 后 点击下载示例
下载后拿编辑器打开 是这样的
我们要把他移植到我们的main.html 里面
需要使用示例代码里面的script里面的内容
示例里面有2个script标签 第一个是一个网络连接 第二个就是内容了
然后把 2个script 复制到main.html 里body标签里面
就变成这样的了
因为有2个仪表盘嘛 所以要2份 第二份的时候 就不需要再复制这个了
复制下面script里面的内容到第一次复制的script的就可以(不需要复制script 标签了)
就是这个内容(下面还有只是没截全)
现在 基本有了 但是 刚刚不是下面 有2个吗, 变量名都是一样的 ,所以要换一下变量名
然后在加 2个 更新函数
和
整合的代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div style="display: flex;">
<div id="gaugeChart" style="width: 300px;height:300px;"></div>
<div id="memory_usage" style="width: 300px;height:300px;"></div>
</div>
<script type="text/javascript" src="https://registry.npmmirror.com/echarts/5.5.1/files/dist/echarts.min.js"></script>
<script>
var gaugeDom = document.getElementById('gaugeChart');
var gaugeChart = echarts.init(gaugeDom, null, {
renderer: 'canvas',
useDirtyRect: false
});
var app={}
var gaugeOption = {
tooltip: {
formatter: '{a} <br/>{b} : {c}%'
},
series: [
{
name: 'Pressure',
type: 'gauge',
detail: {
formatter: '{value}'
},
data: [
{
value: 98,
name: 'CPU负载'
}
]
}
]
};
if (gaugeOption && typeof gaugeOption === 'object') {
gaugeChart.setOption(gaugeOption);
}
var myurl3 = "http://" + window.location.host+"/cpu/";
setInterval(()=>{
fetch(myurl3).then(res=>{
return res.json()
}).then((json)=>{
gaugeOption.series[0].data[0].value = json.cpu;
gaugeChart.setOption(gaugeOption);
})
},1000)
var memory_usageDom = document.getElementById('memory_usage');
var memory_usageChart = echarts.init(memory_usageDom, null, {
renderer: 'canvas',
useDirtyRect: false
});
var app={}
var memory_usageOption = {
tooltip: {
formatter: '{a} <br/>{b} : {c}%'
},
series: [
{
name: 'Pressure',
type: 'gauge',
detail: {
formatter: '{value}'
},
data: [
{
value: 98,
name: '内存占有率'
}
]
}
]
};
if (memory_usageOption && typeof memory_usageOption === 'object') {
memory_usageChart.setOption(memory_usageOption);
}
var myurCON = "http://" + window.location.host+"/neicun/";
setInterval(()=>{
fetch(myurCON).then(res=>{
return res.json()
}).then((json)=>{
memory_usageOption.series[0].data[0].value = json.memory_usage;
memory_usageChart.setOption(memory_usageOption);
})
},300)
</script>
</body>
</html>
运行代码
然后到Scripts目录下面
在上面输入cmd,然后再弹出的终端输入python ssr.py
然后访问这个网址就可以
流程
剩下的根据上面的流程写就可以
1.找OID
2.编写路由
3.echarts下载代码,使用
标签:教程,return,网络管理,app,点赞,ret,memory,usage,cpu From: https://blog.csdn.net/m0_74172897/article/details/143921021