SNMP запрос без использования net-snmp-devel (запрограммировать вручную один единственный запрос)

Модератор: Модераторы разделов

Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

SNMP запрос без использования net-snmp-devel

Сообщение Stauffenberg »

Всем привет.

Нужно запрограммировать простой snmp-запрос, но я не хочу подключать snmp-библиотеки, которые во всех, найденных мной, примерах/блогах советуют подключить.

Код: Выделить всё

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


Мне нужно послать один-единственный запрос (SNMPv2-MIB::sysDescr.0), и доустанавливать для этого devel-пакеты (+ их зависимости) не хотелось бы.
Есть тут те, кто уже работал с SNMP? Действительно без этих библиотек никак не обойтись?
Теоретически это просто UDP запрос на 161 порт (вторая версия протокола) с определенной MIB-строкой, которую поймет snmp-демон. Или я ошибаюсь?

Заранее благодарен за ответы.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: SNMP запрос без использования net-snmp-devel

Сообщение Stauffenberg »

В общем, сгенерировать запрос вручную так и не получилось. Пишу при помощи соответствующих библиотек.
Такой вопрос - этот код срабатывает без проблем, если сервер шлет ответ. Если же нет, то код заходит в цикл и после 4ой итерации падает с Segmentation fault. Может кто-нибудь предложить какое-нибудь решение?

Код: Выделить всё

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

int main(int argc, char ** argv)
{
  struct snmp_session session;
  struct snmp_session *sess_handle;

  struct snmp_pdu *pdu;
  struct snmp_pdu *response;

  struct variable_list *vars;

  oid id_oid[MAX_OID_LEN];
  oid serial_oid[MAX_OID_LEN];

  size_t id_len = MAX_OID_LEN;
  size_t serial_len = MAX_OID_LEN;

  int status;

  struct tree * mib_tree;

  if(argv[1] == NULL){
    printf("Please supply a hostname\n");
    exit(1);
  }

  init_snmp("APC Check");

  snmp_sess_init( &session );
   session.version = SNMP_VERSION_2c;
   session.community = "public";
   session.community_len = strlen(session.community);
   session.peername = argv[1];
  sess_handle = snmp_open(&session);

  pdu = snmp_pdu_create(SNMP_MSG_GET);

  read_objid("SNMPv2-MIB::sysDescr.0", id_oid, &id_len);
  snmp_add_null_var(pdu, id_oid, id_len);

  status = snmp_synch_response(sess_handle, pdu, &response);

  for(vars = response->variables; vars; vars = vars->next_variable)
    print_value(vars->name, vars->name_length, vars);

  snmp_free_pdu(response);
  snmp_close(sess_handle);

  return (0);
}


Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: SNMP запрос без использования net-snmp-devel

Сообщение /dev/random »

Stauffenberg писал(а):
03.02.2015 14:06

Код: Выделить всё

  status = snmp_synch_response(sess_handle, pdu, &response);

  for(vars = response->variables; vars; vars = vars->next_variable)
    print_value(vars->name, vars->name_length, vars);

Я этой библиотекой никогда не пользовался, но вот тут меня кое-что очень настораживает. Вы вызываете функцию, получаете код завершения и, не проверяя его, лезете в переменные, которые эта функция должна была инициализировать.
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: SNMP запрос без использования net-snmp-devel

Сообщение Stauffenberg »

/dev/random писал(а):
03.02.2015 14:20
Stauffenberg писал(а):
03.02.2015 14:06

Код: Выделить всё

  status = snmp_synch_response(sess_handle, pdu, &response);

  for(vars = response->variables; vars; vars = vars->next_variable)
    print_value(vars->name, vars->name_length, vars);

Я этой библиотекой никогда не пользовался, но вот тут меня кое-что очень настораживает. Вы вызываете функцию, получаете код завершения и, не проверяя его, лезете в переменные, которые эта функция должна была инициализировать.

Спасибо. Да, действительно все просто. Добавил пока вот это. Segmentation fault ушел.

Код: Выделить всё

  status = snmp_synch_response(sess_handle, pdu, &response);
    printf("status = %d\n", status); // debug

    if (status == 0)
        for(vars = response->variables; vars; vars = vars->next_variable)
            print_value(vars->name, vars->name_length, vars);
    else
        printf("NO SNMP\n");
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали: