sergey1988 Posted September 6, 2013 Posted September 6, 2013 Есть такая задача запросить по SNMP какое нибудь уникальное значение Пробовал: MAC - нужно забирать из таблицы entPhysicalEntry, но на разных девайсах строка соответствующая шасси располагается в строке с разным индексом по крайней мере на разных моделях, так что просто запросить не получается нужно как то парсить всю таблицу и извлекать мак шасси SerialNumber - аналогичная проблема SNMP Local Engine ID - запросить проще, но заметил что на некоторых девайсах они повторяются, что в теории происходить не должно имя устройства - теоретически может повториться так вот какой бы OID опросить с уникальным значением чтобы однозначно идентифицировать девайс? Вставить ник Quote
vop Posted September 10, 2013 Posted September 10, 2013 А если сначала запросить sysObjectID, а по нему загрузить табличку с правильными оидами, да и за одно и с обработчиками? Вставить ник Quote
OKyHb Posted September 18, 2013 Posted September 18, 2013 MAC адрес можно ещё и через BRIDGE-MIB::dot1dBaseBridgeAddress (.1.3.6.1.2.1.17.1.1.0) забирать. У нас все используемые свичи его нормально отдают. Вставить ник Quote
AlKov Posted September 18, 2013 Posted September 18, 2013 А если сначала запросить 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 И что с ним дальше делать?? Вставить ник Quote
vop Posted September 18, 2013 Posted September 18, 2013 И как это сделать?Ну вот запросил 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-ами получить все нужные данные. Таким образом можно избежать проблем с разночтением. Ну а подготовить базу для всех типов используемых устройств не сложно. Учитывая, например, что группы однотипных устройств обрабатываются одинаково. Вставить ник Quote
vop Posted September 18, 2013 Posted September 18, 2013 Вкусно пообедав, решил нарисовать немного примеров, что бы рамочно показать один из возможных алгоритмов. Примеры кода без особых подробностей, исключительно для демонстрации принципа. И так, решила наша программа пнуть некий свич, что бы узнать про него побольше. Где-нибудь в теле программы делаем запросик, не забывая присматриваться к ошибкам. 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); } /* ================================================================ */ Ну вот где-то так. И для каждой новой железячки делаем отдельный драйвер. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.