Как отправить snmptrap с net-snmp в C? - PullRequest
0 голосов
/ 11 февраля 2019

Я занимаюсь разработкой приложения для встроенного устройства.Я хочу отправлять ловушки, когда возникла какая-то ситуация.Я нашел несколько примеров, но не очень помог мне.В net-snmp есть функция send_v2trap().Кто-нибудь может мне помочь?Нужно ли делать в snmpd.conf и snmptrapd.conf?

1 Ответ

0 голосов
/ 16 февраля 2019

Мы постараемся сделать что-то, возможно, ближе к реальной потребности: отправка traps / уведомлений при касании вашего OID

Давайте рассмотрим пример ... net-snmp-5.7.x / agent / mibgroup / examples/watched.c

Мы изменяем:

reginfo = netsnmp_create_handler_registration("my example string", NULL,

на

reginfo = netsnmp_create_handler_registration("my example string", handler_for_changes,

и определение handler_for_changes (...) is

int handler_for_changes (   netsnmp_mib_handler * p_handler,
                            netsnmp_handler_registration * p_reginfo,
                            netsnmp_agent_request_info * p_requestinfo,
                            netsnmp_request_info * p_requests)
{
    u_char * data_ptr = NULL;

    switch ( p_requestinfo->mode )
    {
        case MODE_SET_COMMIT: 
        {
            switch ( p_requests->requestvb->type )
            {
                case ASN_INTEGER:
                //...
                {
                    data_ptr = (u_char*)p_requests->requestvb->val.integer;
                }
                break;
                case ASN_OCTET_STR:
                //...
                {
                    data_ptr = (u_char*)p_requests->requestvb->val.string;
                }
                break;
            }
            break;
        }

        default:
            break;
    }

    if (  data_ptr )
    {

    //This is likely not the place to do this but this is for example

    netsnmp_variable_list * notification_vars =  NULL;
    static const oid objid_snmptrap[] = {1,3,6,1,6,3,1,1,4,1,0};

    //you will need your own notif OID defined in your own MIB
    static const oid notification_oid[] = {1,3,6,1,4,1,8072,2,3,0,1};
    snmp_varlist_add_variable ( &notification_vars,
                                objid_snmptrap, OID_LENGTH(objid_snmptrap),
                                ASN_OBJECT_ID,
                                (u_char *) notification_oid,
                                OID_LENGTH(notification_oid) * sizeof(oid));

    //the data that changed
    snmp_varlist_add_variable ( &notification_vars,
                                p_reginfo->rootoid,p_reginfo->rootoid_len,
                                p_requests->requestvb->type,
                                data_ptr, p_requests->requestvb->val_len);

    //send the trap is now one line ( + void return )
    send_v2trap(notification_vars);

    snmp_free_varbind(notification_vars);

    }

    return SNMPERR_SUCCESS;
}

Существует утилита net-snmp-config, которая позволяет нам скомпилировать агент (см. Учебные руководства по Net-SNMP)

[nils @ localhost trapMCVE] $ net-snmp-config--compile-subagent mysubagent --norm watched.c

generating the temporary code file: netsnmptmp.24494.c
void init_watched(void);
checking for init_watched in watched.c
void init_watched_string(void);
void init_watched(void)
init_watched_string();
void init_watched_string(void)
checking for shutdown_watched in watched.c
running: gcc  -fno-strict-aliasing -g -O2 -Ulinux -Dlinux=linux  -I. -I/usr/local/include -o mysubagent netsnmptmp.24494.c  watched.c  -L/usr/local/lib -lnetsnmpmibs -lnetsnmpagent -lnetsnmp -lnetsnmpmibs -ldl  -lnetsnmpagent   -lnetsnmp  
leaving the temporary code file: netsnmptmp.24494.c
subagent program mysubagent created

Затем мы можем запустить SNMP Daemon с его локальным файлом конфигурации

#likely not a best practise but for example only
rwcommunity public localhost
#inform Request
#informsink localhost:16200
trapsess -Ci -v 2c -c private localhost:16200

и мы запускаем его так, чтобы он прослушивал входящий SNMP-запрос на локальный хост и порт 1161 (случайным образом выбранный, чтобы> 1024 и unpriviledge).Ловушки будут отправляться на локальный хост через порт 16200 (случайным образом ...)

[nils @ localhost trapMCVE] $ snmpd -f -Lo -C -c local_snmpd.conf --master = agentx -agentXSocket = tcp: localhost: 1705 udp: localhost: 1161

Мы запускаем нашего субагента , который взаимодействует с демоном SNMP через сокет tcp на порту 1705 (случайным образом ...)

. / Mysubagent -f -Lo -x tcp: localhost: 1705

В этот момент мы также можем определить файл локальной конфигурации для нашей SNMP TRAPДемон

#likely not a best practise but for example only
authCommunity log,execute,net private

и мы запускаем его:

snmptrapd -f -Lo -C -c local_snmptrapd.conf localhost: 16200

Итак, вернувшись к тестированию нашего субагента, мы можем попробовать snmpget

[nils@localhost trapMCVE]$ snmpget -v 2c -c public localhost:1161 NET-SNMP-EXAMPLES-MIB::netSnmpExampleString.0
NET-SNMP-EXAMPLES-MIB::netSnmpExampleString.0 = STRING: So long, and thanks for all the fish!

и теперь мы хотим изменить эту строку и посмотреть, была ли сгенерирована ловушка / информация.Итак, мы делаем snmpset

[nils@localhost trapMCVE]$ snmpset -v 2c -c public localhost:1161 NET-SNMP-EXAMPLES-MIB::netSnmpExampleString.0 s "Hello world: 42"
NET-SNMP-EXAMPLES-MIB::netSnmpExampleString.0 = STRING: Hello world: 42

и чудом на snmptrapd процессе

2019-02-16 01:49:10 localhost [UDP: [127.0.0.1]:45864->[127.0.0.1]:16200]:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (54342) 0:09:03.42 SNMPv2- 
MIB::snmpTrapOID.0 = OID: NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatNotification     
NET-SNMP-EXAMPLES-MIB::netSnmpExampleString.0 = STRING: Hello world: 42

VOILA !!!

конец разглагольствования ...

надеюсь, это поможет

...