入门级snmp agent开发,通过这篇文章可大致了解snmp agent的开发思路,主要参考了网上博客与官方文档,下方有链接。
用net-snmp扩展MIB库,实现方法可归结为四种:
1)一是静态库方式,通过修改配置头文件,在相应地方包含新引入的mib模块的.c和.h文件,然后重新编译库文件和扩展代码;这种方式不够灵活,每次修改扩展的MIB后,都需要重新编译snmpd和扩展的代码,再重新安装snmpd到系统中。
2)二是编译动态共享库,只需把新引入的MIB模块的.c和.h文件编译成动态库,通过设置能够让代理程序载入。
对于第二种方式,一需要编译成.so动态共享库,二需要原代理程序是否包含dlmod或load命令,三还要看系统是否支持。一般情况下仅支持Unix平台。
3)三是扩展一个子代理,让SNMPD以主代理的模式运行,对于SNMPD我们只要让它启动就可以,不需要任何的更改和配置,把子代理编译生成的程序运行起来就可以扩展自定义的MIB库。
4)用shell脚本来扩展
本文我们以第三种方法在linux上开发和测试
一、安装snmpd
1.1 安装包:
net-snmp-agent-libs-5.7.2-28.el7_4.1.x86_64
net-snmp-utils-5.7.2-28.el7_4.1.x86_64
net-snmp-libs-5.7.2-28.el7_4.1.x86_64
net-snmp-5.7.2-28.el7_4.1.x86_64
net-snmp-devel-5.7.2-28.el7_4.1.x86_64
net-snmp-perl-5.7.2-28.el7_4.1.x86_64
1.2 测试
systemctl restart snmpd.service
systemctl status snmpd.service
# 若出现running这表示安装成功
1.3 配置
vim /etc/snmp/snmpd.conf
master agentx # master 是说该snmpd以主代理方式运行
rocommunity public # rocommunity (只读对象)
rwcommunity public # rwcommunity(读写对象)
默认主代理snmpd只支持agentx类型,而我们要开发的程序是一种子代理(subagent),是需要连snmpd的master agent的。
测试snmpd是否正常
执行snmpwalk -v2c -c public localhost 1.3.6.1.2.1.1
,
输出类似如下方展示,则表示正常运行
SNMPv2-MIB::sysDescr.0 = STRING: Linux bogon 3.10.0-693.el7.x8664 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x8664
二、MIB库
首先MIB库有什么用?其实作为子代理来说,在server机器上,可以不用MIB库,MIB库只为了让用户访问时方便,有了MIB库,用户就不用记那么多和长的OID,比如把MIB放在windows机器上,在windows机器装一个支持MIB的软件,用该软件打开MIB库,只要点击相应的对象就可以自动发送snmp请求到server端,所以server端是可以不要MIB库的。
MIB 存放目录 /usr/share/snmp/mibs
目录下,因为这个目录是snmpd的默认目录,只要把MIB库放入该目录就可以自动加载MIB库,否则需要修改/etc/snmp/snmp.conf文件,添加mibs +/path/to/XXX 并重启snmpd。
2.1 示例1
自定义MIB库,如下:
-- Test-MIB.my
Test-MIB DEFINITIONS ::= BEGIN
IMPORTS
OBJECT-GROUP, MODULE-COMPLIANCE, NOTIFICATION-GROUP
FROM SNMPv2-CONF
enterprises, Integer32, Unsigned32, OBJECT-TYPE, MODULE-IDENTITY,
NOTIFICATION-TYPE
FROM SNMPv2-SMI
DisplayString
FROM SNMPv2-TC;
-- October 09, 2002 at 14:50 GMT
-- 1.3.6.1.4.1.16535
Test MODULE-IDENTITY
LAST-UPDATED "200210091450Z" -- October 09, 2002 at 14:50 GMT
ORGANIZATION
""
CONTACT-INFO
""
DESCRIPTION
"Video's Server MIB."
::= { enterprises 16535 }
-- Node definitions
-- This part will include all details about the Test.
-- 1.3.6.1.4.1.16535.1
Time OBJECT IDENTIFIER ::= { Test 1 }
-- 1.3.6.1.4.1.16535.1.1
GetTime OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..100))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Example : 2013/4/11"
::= { Time 1 }
END
-- Test-MIB.my
该MIB库只有一个OID,即:1.3.6.1.4.1.16535.1.1
测试:
snmptranslate -Tp -IR Test-MIB::Test
# 如出现下面结果,表示MIB正常加载
+--Test(16535)
|
+--Time(1)
|
+-- -R-- String GetTime(1)
Textual Convention: DisplayString
Size: 0..100
2.1 示例2
官方提供NET-SNMP-TUTORIAL-MIB.txt
NET-SNMP-TUTORIAL-MIB DEFINITIONS ::= BEGIN
-- A Comment!
-- IMPORTS: Include definitions from other mibs here, which is always
-- the first item in a MIB file.
IMPORTS
netSnmpExamples FROM NET-SNMP-EXAMPLES-MIB
OBJECT-TYPE, Integer32,
MODULE-IDENTITY FROM SNMPv2-SMI
MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF;
--
-- A brief description and update information about this mib.
--
netSnmpTutorialMIB MODULE-IDENTITY
LAST-UPDATED "200205290000Z" -- 29 May 2002, midnight
ORGANIZATION "net-snmp"
CONTACT-INFO "postal: Wes Hardaker
P.O. Box 382
Davis CA 95617
email: net-snmp-coders@lists.sourc