Как отправить ловушки v2 в net snmp используя c

У меня есть следующие конфигурации:

  1. Oid ловушки = .1.3.6.1.4.1.78945.1.1.1.1.1
  2. Переменная oid = .1.3.6.1.4.1.78945.1.1.2.1.0, тип переменной = строка
  3. Другая переменная Trap oid = .1.3.6.1.4.1.78945.1.1.2.4.0, тип переменной = целое число.
  4. IP-адрес прослушивателя ловушек и порт = 192.168.4.10:1234

Как я могу отправлять ловушки используя C или C ++ и модуль net-snmp в Linux? Мне нужен пример кода. Все примеры кодов на сайте net-snmp у меня не работали.

мой пример кода:

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>

oid             objid_id[] = { 1,3,6,1,4,1,78945,1,1,2,4,0};
oid             objid_name[] = { 1,3,6,1,4,1,78945,1,1,2,1,0};
oid           trap_oid[] = {1,3,6,1,4,1,78945,1,1,1,1,1};int main()
{
netsnmp_session session, *ss;
netsnmp_pdu    *pdu, *response;

char comm[] = "public";
snmp_sess_init( &session );
session.version = SNMP_VERSION_2c;
session.community = comm;
session.community_len = strlen(session.community);
session.peername = "192.168.4.10:1234";
ss = snmp_open(&session);
if (!ss) {
snmp_sess_perror("ack", &session);
exit(1);
}

pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
pdu->community = comm;
pdu->community_len = strlen(comm);
pdu->enterprise = trap_oid;
pdu->enterprise_length = sizeof(trap_oid) / sizeof(oid);
pdu->trap_type = SNMP_TRAP_ENTERPRISESPECIFIC;
snmp_add_var(pdu, objid_name, sizeof(objid_name) / sizeof(oid), 's', "Test Name");
snmp_add_var(pdu, objid_id, sizeof(objid_id) / sizeof(oid), 'i', "5468");

send_trap_to_sess (ss, pdu);
snmp_close(ss);
return (0);
}

Пример уведомления о сердцебиении с сайта net-snmp сбил меня с толку, где дать информацию слушателю?

Заранее спасибо.

-2

Решение

Пример кода прерывания (Notification.c) в net-snmp не будет работать как отдельное приложение (то есть вызов с вашего собственного основного). Вам нужно запустить демон subagent (agentX), как показано в примере example-demon.c в net-snmp. Внутри примера-демона вызовите init_notification (), определенный в коде примераtification.c, перед циклом while в example-demon.c

init_notification();
/* your main loop here... */
while(keep_running) {
/* if you use select(), see snmp_select_info() in snmp_api(3) */
/*     --- OR ---  */
agent_check_and_process(1); /* 0 == don't block */

}

который вызывает ‘send_example_notification (unsigned int clientreg, void * clientarg)’ каждые 30 секунд, который отправляет ловушку с помощью send_v2trap ().

Compile and build notification.c and example-demon.c into an executable example-demon
gcc -I. `net-snmp-config --cflags`   -c -o notification.o notification.c
gcc -I. `net-snmp-config --cflags`   -c -o example-demon.o example-demon.c
gcc -o example-demon notification.o example-demon.o `net-snmp-config --agent-libs`

Запустите example-demon, и вы должны увидеть, что прерывания v2 отправляются каждые 30 секунд и принимаются в вашем менеджере snmp (при условии, что для вашего IP-адреса хоста в файле snmpd.conf установлен snmpsink и т. Д.).

То, что у вас есть, также является действительным и другим способом отправки ловушек с использованием вашего собственного кода. Команда «snmptrap» также может использоваться для отправки ловушек в виде отдельного приложения или из оболочки и т. д.

1

Другие решения

Похоже, что время работы системы и ловушка должны быть добавлены в качестве первых переменных в pdu.

Следующий код добился цели:

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>

oid             objid_sysuptime[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 };
oid             objid_id[] = { 1,3,6,1,4,1,78945,1,1,2,4,0};
oid             objid_name[] = { 1,3,6,1,4,1,78945,1,1,2,1,0};
oid              trap_oid[] = {1,3,6,1,4,1,78945,1,1,1,1,1};int main()
{
netsnmp_session session, *ss;
netsnmp_pdu    *pdu, *response;
char *trap = NULL;

char comm[] = "public";
snmp_sess_init( &session );
session.version = SNMP_VERSION_2c;
session.community = comm;
session.community_len = strlen(session.community);
session.peername = "192.168.4.10:1234";
ss = snmp_open(&session);
if (!ss) {
snmp_sess_perror("ack", &session);
exit(1);
}

pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
pdu->community = comm;
pdu->community_len = strlen(comm);
pdu->trap_type = SNMP_TRAP_ENTERPRISESPECIFIC;

long sysuptime;
char csysuptime [20];
sysuptime = get_uptime ();
sprintf (csysuptime, "%ld", sysuptime);
trap = csysuptime;
snmp_add_var (pdu, objid_sysuptime, sizeof (objid_sysuptime)/sizeof(oid),'t', trap);
snmp_add_var(pdu, trap_oid, OID_LENGTH(trap_oid), 'o', "1.3.6.1.4.1.78945.1.1.1.1.1");
snmp_add_var(pdu, objid_name, OID_LENGTH(objid_name), 's', "Test Name");
snmp_add_var(pdu, objid_id, OID_LENGTH(objid_id) , 'i', "5468");

send_trap_to_sess (ss, pdu);
snmp_close(ss);
return (0);
}
1

По вопросам рекламы [email protected]