Jump to content

Recommended Posts

Posted

Есть такая задача запросить по SNMP какое нибудь уникальное значение

 

Пробовал:

 

MAC - нужно забирать из таблицы entPhysicalEntry, но на разных девайсах строка соответствующая шасси располагается в строке с разным индексом по крайней мере на разных моделях, так что просто запросить не получается нужно как то парсить всю таблицу и извлекать мак шасси

 

SerialNumber - аналогичная проблема

 

SNMP Local Engine ID - запросить проще, но заметил что на некоторых девайсах они повторяются, что в теории происходить не должно

 

имя устройства - теоретически может повториться

 

так вот какой бы OID опросить с уникальным значением чтобы однозначно идентифицировать девайс?

Posted

MAC адрес можно ещё и через BRIDGE-MIB::dot1dBaseBridgeAddress (.1.3.6.1.2.1.17.1.1.0) забирать. У нас все используемые свичи его нормально отдают.

Posted

А если сначала запросить sysObjectID, а по нему загрузить табличку с правильными оидами, да и за одно и с обработчиками?

И как это сделать?

Ну вот запросил sysObjectID -

# snmpget -v2c -c public 192.168.4.142 sysObjectID.0
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.171.10.113.1.1

И что с ним дальше делать??

Posted
И как это сделать?

Ну вот запросил sysObjectID -

# snmpget -v2c -c public 192.168.4.142 sysObjectID.0
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.171.10.113.1.1

И что с ним дальше делать??

 

Заглядываем в mib`ы и получаем, что нам ответил dlink-des3200-10Prod. Потом мы заглядвыаем в нашу собственную базу, которую подготовили заранее для этого продукта, в которой уже знаем точно, какими OID-ами получить все нужные данные. Таким образом можно избежать проблем с разночтением. Ну а подготовить базу для всех типов используемых устройств не сложно. Учитывая, например, что группы однотипных устройств обрабатываются одинаково.

Posted

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

 

И так, решила наша программа пнуть некий свич, что бы узнать про него побольше. Где-нибудь в теле программы делаем запросик, не забывая присматриваться к ошибкам. in_lsw - это структура свича с большим набором разных параметров и фишек.

 

....
if((rc=snmp_get(in_lsw, OID_sysObjectID" "OID_sysUpTime" "OID_sysType" "OID_sysName" "OID_sysLocation" "OID_sysCont))) {
  return(ret_error(in_lsw, rc, "SNMP Get OID ID rc=%d", rc));
}
....

 

Из полученного перечня нас интересует сейчас OID_sysObjectID. С этим параметром начинаем "обзванивать" модули разных производителей, и в итоге натыкаемся на модуль, например, 3200-х д-линков.

 

#define OID_DLINK ".1.3.6.1.4.1.171"

#define OID_SYSID_DES3200_10 OID_DLINK".10.113.1.1"
#define OID_SYSID_DES3200_18 OID_DLINK".10.113.1.2"
#define OID_SYSID_DES3200_28 OID_DLINK".10.113.1.3"
#define OID_SYSID_DES3200_28F OID_DLINK".10.113.1.4"
#define OID_SYSID_DES3200_26 OID_DLINK".10.113.1.5"
#define OID_SYSID_DES3028 OID_DLINK".10.63.6"
#define OID_DLINK_COMMON_MGMT OID_DLINK".12"
#define OID_DLINK_SAVE_CONF OID_DLINK_COMMON_MGMT".1.2.6.0"
#define OID_DLINK_SERIALID  OID_DLINK_COMMON_MGMT".1.1.12.0"

/* ================================================================ */
int auto_init_des3200(lsw_lst_t *in_lsw) {

   if(!strcmp(in_lsw->oid_sysid, OID_SYSID_DES3200_26)) {
in_lsw->driver="des3200-26";
   } else if(!strcmp(in_lsw->oid_sysid, OID_SYSID_DES3200_10)) {
in_lsw->driver="des3200-10";
   } else if(!strcmp(in_lsw->oid_sysid, OID_SYSID_DES3200_18)) {
in_lsw->driver="des3200-18";
   } else if(!strcmp(in_lsw->oid_sysid, OID_SYSID_DES3200_28)) {
in_lsw->driver="des3200-28";
   } else if(!strcmp(in_lsw->oid_sysid, OID_SYSID_DES3200_28F)) {
in_lsw->driver="des3200-28f";
   } else if(!strcmp(in_lsw->oid_sysid, OID_SYSID_DES3028)) {
in_lsw->driver="des3028";
   } else if(!strncmp(in_lsw->oid_sysid, OID_DLINK, strlen(OID_DLINK))) {
in_lsw->driver="des-general";
   } else {
       return(0);
   }

   in_lsw->fun_snmp_read           = &loc_shw_read_des3200;
   in_lsw->fun_snmp_save_cfg       = &loc_save_cfg_des3200;  // Save switch config to NV-ram
   .....

   in_lsw->fun_snmp_get_main_val   = &brd_sw_get_main_val;   // Read main bridge info (ports, vlans...)
   in_lsw->fun_snmp_set_port_name  = &brd_sw_set_port_name;
   in_lsw->fun_snmp_get_vlan       = &brd_sw_get_vlan;
   in_lsw->fun_snmp_add_vlan       = &brd_sw_add_vlan;
   in_lsw->fun_snmp_del_vlan       = &brd_sw_del_vlan;
   in_lsw->fun_snmp_set_vlan_ports = &brd_sw_set_vlan_ports; // Set/reset vlan for cur port
   ....

   return(0);
}
/* ================================================================ */

 

Т.е. мы нашли нужный нам драйвер, и добавили функции для работы с данными по SNMP. Причем, как совершенно локальные, так и общие, например, brd_*() из dot1d_bridge. В принципе, brd_ функции можно добавить там, где проверяем совместимость с dot1d, но это уже детали.

 

Ну и наконец, для чтения нужных нам данных свича, просто идем по запомненой функции в in_lsw->fun_snmp_read:

 

/* ================================================================ */
static int loc_shw_read_des3200(lsw_lst_t *in_lsw) {
   char *p=NULL;
   int rc=0;

   // Process known vals first
   if((rc=sw_snmp_main_val(in_lsw))) return(rc);

   // Ask D-Link values
   if((rc=snmp_get(in_lsw, OID_DLINK".12.1.2.7.1.2.1 "OID_DLINK".12.8.1.1.1.0 "OID_DLINK".12.8.1.1.3.0"))) return(rc);


   if((p=v2_get_lstr_str(in_lsw->snmp, OID_DLINK".12.8.1.1.3.0"))) { // Switch type
in_lsw->name=xstrcpy(p);
   } else {
in_lsw->name="DES-3200-26 (guess?)";
   }

   if((p=v2_get_lstr_str(in_lsw->snmp, OID_DLINK".12.1.2.7.1.2.1"))) {
in_lsw->hw_vers=clean_snmp_str(p);
   } else {
if(in_lsw->hw_vers) {free(in_lsw->hw_vers); in_lsw->hw_vers=NULL;}
   }

   if((p=v2_get_lstr_str(in_lsw->snmp, OID_DLINK".12.8.1.1.1.0"))) {
in_lsw->sf_vers=clean_snmp_str(p);
   } else {
if(in_lsw->sf_vers) {free(in_lsw->sf_vers); in_lsw->sf_vers=NULL;}
   }

   if((rc=snmp_get(in_lsw, OID_DLINK_SERIALID))) return(rc);
   if((p=v2_get_lstr_str(in_lsw->snmp_ret, OID_DLINK_SERIALID))) {
in_lsw->ser_num=clean_snmp_str(p);
   } else {
if(in_lsw->ser_num) {free(in_lsw->ser_num); in_lsw->ser_num=NULL;}
   }

   return(0);
}
/* ================================================================ */

 

Ну вот где-то так. И для каждой новой железячки делаем отдельный драйвер.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.