运行环境
centos7+SNMP 5.7.3+MySQL
net-snmp如何添加自定义MIB(标量)
参考文章
https://blog.csdn.net/qq_36849711/article/details/119204413
SNMP连接MySQL
1.在生成的标量文件 .c文件中包含mysql的头文件,如果找不到这个头文件,查看MySQL是否安装完全
#include “MySQL文件保存路径/mysql.h”
2.使用dlopen/dlsum动态加载动态库
如果只引用头文件,编译安装SNMP的时候可能出现无法识别数据库连接、查询等方法,下面是我通过dlopen动态加载动态库,查找函数的地址实现了数据库连接方法,这种方式类似重新声明函数,所以需要知道要使用的函数的原型。以此类推可以实现数据库查询,数据库连接等方法。
参考文章
https://blog.csdn.net/sa726663676/article/details/123355547
MYSQL *conn; //数据库连接句柄
void* handle = dlopen("/usr/lib64/mysql/libmysqlclient.so", RTLD_LAZY);//路径以本机存储位置为准
MYSQL *(*mysql_init)(MYSQL *mysql); //初始化
mysql_init = dlsym(handle, "mysql_init");
conn = mysql_init(NULL);
MYSQL *(*mysql_real_connect)(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag);
mysql_real_connect = dlsym(handle, "mysql_real_connect"); //连接MySQL
mysql_real_connect(conn, "localhost", "username", "password", "databasename", port, NULL, 0)//通过上述操作后,连接数据库的方法可以使用
3.实现SNMP的GET和SET
对mib节点进行get操作时,获取的就是下面代码的name值,通过给name赋值,可以动态的获取mib节点的值,可以通过上面操作,从数据库取值存入name中,用来实现节点数据的动态读取。
switch (reqinfo->mode) {
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
buff,
strlen(buff));
break;
我们对mib节点进行set操作时
例如 snmpset -v 2c -c public localhost 1.3.6.1.4.1.xxx.x.x.0 s test
s代表字符 对这个mib节点赋值test
下面代码中,我通过定义一个字符串数组buff,用于接收requests->requestvb->buf中的数据,也就是我上面通过snmpset设置的test值,通过这种方式实现mib节点的修改。
case MODE_SET_COMMIT:
/* XXX: delete temporary storage */
memcpy(buff,requests->requestvb->buf,requests->requestvb->val_len); // 赋值
buff[requests->requestvb->val_len] ='\0'; //字符串结束符
if (ret != SNMP_ERR_NOERROR) {
/* try _really_really_ hard to never get to this point */
netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_COMMITFAILED);
}
break;
完结