Агент SNMP: может mib2c генерировать код для типа InetAddress или String (т.е. что-то не целочисленного типа)

Мне удалось преобразовать 95% выделенного кода MIB в C и заставить его работать в субагенте, как описано в последней части этого руководства по Net-SNMP

Для этого я, естественно, использую mib2c.mfd.conf (я только что прочитал, что mfd означает Mib For Dummies... все сказано...)

mib2c -I -c mib2c.mfd.conf my_mib_node

Он сгенерировал длинный файл.c почти со всеми oids, как показано ниже.

Для идентификатора VideoInetAddr практически не было сгенерировано ни одной строки

//ABSTRACT OF SOURCE FILE GENERATED BY MIB2C
//...

long    VideoFormat = 0;  /* XXX: set default value */
// <<<=== NOTHING GENERATED HERE FOR VideoInetAddr OF TYPE INETADDRESS
// WHEREAS OTHER INTEGERS ARE NORMALLY PRESENT
long    VideoInetPort = 0;  /* XXX: set default value */
//...

void init_my_mib_node(void)
{
 //...

    const oid VideoFormat_oid[] = { 1,3,6,1,4,1,a,b,c,d,e };
    static netsnmp_watcher_info VideoFormat_winfo;
    // <<<=== NO OID GENERATED for VideoInetAddr OF TYPE INETADDRESS
    // WHEREAS OTHER OIDs ARE NORMALLY GENERATED
    static netsnmp_watcher_info VideoInetAddr_winfo; //We have the winfo after all
    const oid VideoInetPort_oid[] = { 1,3,6,1,4,1,a,b,c,d,g };
    static netsnmp_watcher_info VideoInetPort_winfo;

    DEBUGMSGTL(("my_mib_node",
    "Initializing VideoFormat scalar integer.  Default value = %d\n",
                VideoFormat));

    reg = netsnmp_create_handler_registration(
         "VideoFormat", NULL,
          VideoFormat_oid, OID_LENGTH(VideoFormat_oid),
          HANDLER_CAN_RWRITE);

    netsnmp_init_watcher_info(&VideoFormat_winfo, &VideoFormat, 
    sizeof(long),ASN_INTEGER, WATCHER_FIXED_SIZE);

   if (netsnmp_register_watched_scalar( reg, &VideoFormat_winfo ) < 0 ) {
    snmp_log( LOG_ERR, "Failed to register watched VideoFormat" );
   //...
}

Это работало нормально и потребовало 5 минут (без кода для записи, просто вызовите функцию init()), я смог получить и установить все... целые числа...

Некоторые oids типа InetAddress не были сгенерированы, как и строки

Вопрос

  • Есть ли MIB Conf-файл, способный генерировать код для каждого типа

Я попытался mib2c.old-api.conf, который генерирует код также для нецелых oids, но я считаю, что это не так удобно. Есть еще один шаблон кода для записи.

2 ответа

Да, mib2c может генерировать код для IP-адресов. Я не могу сказать, что mfd делает это, но, определенно, некоторые mib2c.iterate.conf (для таблиц) делают это.

Тип IP в SNMP - это ASN_IPADDRESS, представленный unint32_t в C. Кроме того, необходимо убедиться, что в MIB-файле для объекта, представляющего IP, имеется "SYNTAX IpAddress".

Взгляните: на файл MIB с IP-объектом и реализацией на C

Часть ответа, но я очень далек от понимания, и поэтому побочные проблемы сохраняются

Очень прагматично мне удалось добавить вручную

//I put here ONLY what I added, see question above to complete code
#define STR_LENGTH_IPV4 sizeof("xxx.yyy.zzz.www")
char   VideoInetAddr[STR_LENGTH_IPV4] = "192.168.2.3";
//...
const oid VideoInetAddr_oid[] = { 1,3,6,1,4,1,a,b,c,d,f };

reg = netsnmp_create_handler_registration(
         "VideoInetAddr", NULL,
          VideoInetAddr_oid, OID_LENGTH(VideoInetAddr_oid),
          HANDLER_CAN_RWRITE);

netsnmp_init_watcher_info(&VideoInetAddr_winfo, &VideoInetAddr, sizeof(VideoInetAddr),
              ASN_OCTET_STR,  WATCHER_MAX_SIZE );

if (netsnmp_register_watched_scalar( reg, &VideoInetAddr_winfo ) < 0 ) {
    snmp_log( LOG_ERR, "Failed to register watched VideoInetAddr" );
}

Это все еще должно понять точно опцию как WATCHER_MAX_SIZE (действительно ли это - хороший?)

Другие вопросы по тегам