您的位置:首页 > 其它

SNMP关于net snmp执行命令的接口封装(一)

2015-06-23 14:07 357 查看
1.Linux环境



2.安装

net snmp开源软件

http://www.net-snmp.org/docs/man/

3.需求背景

目前准备做一个设备网管,采用snmp协议,目前刚刚研究snmp相关,下面是要做的事情:

web server                            第三方网管
-----------|--------------------------------------|--------------
           |                                      |
           |-------json---------|-------snmp------|   net-snmp client/manager
                                |
                            |适 配 层|
--------------------------------|---------------------------------  
                                snmp              
                                |                     net-snmp agent
                              设 备
其中web server是内部的一套设备网管(B/S架构),第三方网管采用snmp协议,内部的网管采用json格式请求,目前要做的事情就是不管是第三方还是内部网管下来的请求是什么格式(json or snmp),到设备这一层都是snmp,这样的话,就要在适配层做一个解析封装模块(json<-->snmp),这个是上面要求的,本来做成两套很容易实现。
这样搞的话,目前要做的两件事,第一件事情,在net-snmp client/manager这一层,封装snmp相关命令接口(get、set等),注意区分版本(v1,v2,v3),主要是格式问题。第二件事情,实现适配功能,就是将上层下来的json请求解析成snmp方式,应答时转换成json格式。


4.接口封装

今天仅仅只是做了简单实验,也不知道这样是不是可行的。直接代码吧。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define  BUFF_SIZE    80

typedef struct 
{
    char *p_cmd_name;//snmpget/set等
    char *p_version;//v1/V2/V3
    char *p_community;//public
    char *p_ip_address;//设备ip
    char *p_oid;//MIB对应的oid信息
}snmp_cmd_s;

void create_snmp_cmd(const snmp_cmd_s *p_cmd_struct, char *p_cmd)
{
    if(NULL == p_cmd_struct || NULL == p_cmd)
    {
        printf("error : NULL pointer.\n");
        return;
    }

    memset(p_cmd, 0, strlen(p_cmd));
    //创建v1、V2的命令
    strncpy(p_cmd, p_cmd_struct->p_cmd_name, strlen(p_cmd_struct->p_cmd_name));
    strncat(p_cmd, " ", strlen(" "));//加空格

    strncat(p_cmd, "-v", strlen("-v"));//命令格式
    strncat(p_cmd, " ", strlen(" "));//加空格

    strncat(p_cmd, p_cmd_struct->p_version, strlen(p_cmd_struct->p_version));//1or2c
    strncat(p_cmd, " ", strlen(" "));//加空格

    strncat(p_cmd, "-c", strlen("-c"));//命令格式
    strncat(p_cmd, " ", strlen(" "));//加空格

    strncat(p_cmd, p_cmd_struct->p_community, strlen(p_cmd_struct->p_community));//public
    strncat(p_cmd, " ", strlen(" "));//加空格

    strncat(p_cmd, p_cmd_struct->p_ip_address, strlen(p_cmd_struct->p_ip_address));//dev ip
    strncat(p_cmd, " ", strlen(" "));//加空格

    strncat(p_cmd, p_cmd_struct->p_oid, strlen(p_cmd_struct->p_oid));//mib oid
    //strncat(p_cmd, " ", strlen(" "));//加空格 ,最后一个空格不需要

    return;
}

int exec_snmp_cmd(const char *p_cmd)
{
    FILE *fp;
    char buffer[BUFF_SIZE] = {0};

    if (NULL == (fp = popen(p_cmd, "r")))
    {
        perror("error : Fail to popen.\n");
        exit(1);
    }

    while(NULL != fgets(buffer, sizeof(buffer), fp))
    {
        printf("%s", buffer);
    }

    pclose(fp);

    return 0;
}

int main(void)
{
#if 0
    int ret = exec_snmp_cmd("cat /etc/passwd");

    if (ret)
    {
        printf("error : set snmp cmd failed.\n");
    }
#endif
    char cmd_str[BUFF_SIZE] = {0};

    snmp_cmd_s snmp_walk_cmd = 
    {
        "snmpwalk",
        "1",
        "public",
        "127.0.0.1",
        /*"sysDescr",*/
        ".1.3.6.1.4.1.2021.4.5.0",//查看内存容量的oid
    };

    //1.创建命令
    create_snmp_cmd(&snmp_walk_cmd, cmd_str);

    //2.执行命令
    exec_snmp_cmd(cmd_str);

    return 0;
}


运行情况:

[root@x64-dev ~]# ./popen

UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 484676 kB

望各位对snmp有经验的大神多多指教,多谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: