Как отправить snmptrap с net-snmp в C?
Я разрабатываю приложение для встроенного устройства. Я хочу отправлять ловушки, когда возникла какая-то ситуация. Я нашел несколько примеров, но не очень помог мне. Есть функция под названием send_v2trap()
в нетто-snmp. Кто-нибудь может мне помочь? Нужно ли делать в snmpd.conf
а также snmptrapd.conf
?
1 ответ
Мы постараемся сделать что-то, возможно, ближе к реальной потребности: отправка сообщений / сообщений при касании вашего 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(...)
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 ( ¬ification_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 ( ¬ification_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 - субагент компиляции 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 с локальным файлом conf
#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
ВОЙЛА!!!
конец разглагольствования...
Надеюсь, поможет