一个基于Django
编写的SNMP
轮询Demo,可以对设备(代码内置了H3C OID部分规则)进行SNMP
轮询,icmp
连通性检测,并将结果写入数据库,前端页面读取数据库数据进行直观的展示。效果图可点击本页面导航栏的Gallery
相册查看。
一个视频
无解说无字幕,嫌BGM太吵可静音
缘由
声明:我不是搞软件的
当初仅为了在项目实施中显示设备的上线情况和快速查找到需要变更配置的设备;后来越搞越多,像首页,设备导出,修改页,查看配置,计划任务,清空数据等功能并不是我当初有计划要制作的;最后及时刹车,许多脑中风暴的功能没有继续写,也没有继续添加功能的计划。
代码组成及工作流
框架
Bootstrap-3.3.7
+Django4.0.7
+MySql-5.7.39
(或sqlite
)
工作流
- 设备初始参数写入数据库
- 设备的轮询,并对结果进行写入数据库
- 前端页面对数据的展示
页面及功能
- 首页
- 设备类型统计显示
- 设备在线/离线、CPU使用率、内存使用率概览饼状图显示
- 设备CPU使用率、内存使用率 TOP 10 显示
- 关于
- 设备管理
- 设备数据显示
- 设备添加
- snmp测试
- 继续添加
- 添加并返回
- 设备导出
- 设备详情
- 刷新
- 执行查看配置
- 设备参数修改、同步、删除
- 计划任务
- 定时任务
- 手动任务
- 更多操作
- 批量导入
- 清空数据
如何使用
clone 仓库代码至本地或使用浏览器下载压缩包
git clone https://github.com/kiraster/ndgv_demo.git
或 https://github.com/kiraster/ndgv_demo Code –» Download ZIP
本地处理
使用任意支持Python 的 IDE工具,将代码目录添加
安装环境
为了不影响你电脑的python环境,建议使用虚拟环境运行本代码(以下用Visual Studio Code 软件举例)
IDE工具控制台切换到代码根目录
创建虚拟环境
python -m venv venv
激活虚拟环境
.\venv\Scripts\Activate.ps1
可能遇到不能执行脚本的错误,可以以管理员身份打开
powershell
,执行set-executionpolicy remotesigned
,选择y
安装python 库
pip install -r requirements.txt
初始化数据库
- 修改
ndgv1/settings.py
文件(78行开始)(以下是使用sqlite
数据的配置,如需使用MySQL
,把sqlite
部分注释,再把MySQL
注释部分取消即可)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
# 'default': {
# 'ENGINE': 'django.db.backends.mysql',
# 'NAME': 'ndgv1.3', # 数据库名称
# 'USER': 'root',
# 'PASSWORD': 'xxxxxxxx',
# 'HOST': '127.0.0.1',
# 'PORT': 3306,
# 'CHARSET': 'utf8'
}
}
删除
device_app/migrations
和scheduler_app/migrations
除_init_.py
外的所有文件删除
db.sqlite3
文件执行数据库迁移命令
python manage.py makemigrations python manage.py migrate
修改清空数据
功能代码
修改device_app/views
文件(683行开始),以下是使用sqlite
数据的配置,如需使用MySQL
,把sqlite
部分注释,再把MySQL
注释部分取消即可
只直接使用原生 sql 语句 更快
from django.db import connection
# sqlite 数据库
sqlite_db = connection.cursor()
# MySQL 数据库
# mysql_db = connection.cursor()
# 执行 命令 重置 自增ID
sqlite_db.execute('DELETE FROM sqlite_sequence')
sqlite_db.execute('DELETE FROM device_app_device')
sqlite_db.execute('DELETE FROM device_app_devicedetail')
sqlite_db.execute('DELETE FROM device_app_devicestate')
sqlite_db.execute('DELETE FROM device_app_devicelocation')
sqlite_db.execute('DELETE FROM scheduler_app_schedulerdetail')
sqlite_db.execute('DELETE FROM django_apscheduler_djangojob')
sqlite_db.execute('DELETE FROM django_apscheduler_djangojobexecution')
sqlite_db.execute('DELETE FROM sqlite_sequence')
# 取消外键约束
# mysql_db.execute('SET FOREIGN_KEY_CHECKS=0')
# mysql_db.execute('truncate table device_app_device')
# mysql_db.execute('truncate table device_app_devicedetail')
# mysql_db.execute('truncate table device_app_devicestate')
# mysql_db.execute('truncate table device_app_devicelocation')
# mysql_db.execute('truncate table scheduler_app_schedulerdetail')
# mysql_db.execute('truncate table django_apscheduler_djangojob')
# mysql_db.execute('truncate table django_apscheduler_djangojobexecution')
# 设置外键约束
# mysql_db.execute('SET FORE
运行代码
python .\manage.py runserver
代码弊端
- 代码写死华三设备的oid
- 代码中写死设备命名规则
- 定时任务写死轮询时间
- 前端页面展示以1080P分辨率屏幕编写
- 首页展示,类别显示的规则写死华三设备型号
- ……
可能的问题或错误
PermissionError: [WinError 10013]
以一种访问权限不允许的方式做了一个访问套接字的尝试。- 使用管理员权限运行IDE编辑器
- 检查是否端口占用
- 设备管理页面显示的数据不正确
- 由于是内置华三部分设备的
OID
,有些设备的OID
值没有添加到代码 - 有些数据根据设备命名规则解析出来的,如果设备名称不符合命名规则会显示不正确
- 由于是内置华三部分设备的
- 设备同步后显示同步成功,但是没有数据
- 可能是snmp团体字不正确,或IP地址不可达
- 或者本机防火墙限制
- 批量导入失败
- 上传文件中格式不准确或数据有误
- 上传文件中数据与已有数据冲突,可使用清空数据再进行导入
- 由于没有加入Django事务,对于已导入正确数据并不会进行回退
- 首页中类型统计不正确
- 统计规则是根据华三的设备型号中关键字定义的
- 其他厂商设备不通用
- 页面显示不全或内容挤压
- 编写时候是以1080P分辨率屏幕显示为准
- 没有对其他分辨率屏幕做调整