2013-11-18 1 views
0

Я пытаюсь использовать Perl и Net::SNMP для запроса устройства с несколькими настроенными представлениями/контекстами (например, Cisco ACE 4710) , Команда эквивалент snmpwalk является:Чтение значений SNMP с устройства с несколькими контекстами ACM на основе представления, используя Net :: SNMP

snmpwalk -c [email protected]_NAME -v 2c 1.2.3.4 '.1.3.6.1.4.1.9.9.480.1.1.2' 

Я могу перечислить различные контексты/виды с SNMP-VIEW-BASED-ACM-MIB, например:

my $vacmContextName = '.1.3.6.1.6.3.16.1.1.1.1'; 
my ($session, $error) = Net::SNMP->session(-hostname => '1.2.3.4', -community => 'public'); 
my %contexts = %{ $snmp->get_entries(-columns => [ $vacmContextName ]) }; 

... но у меня возникают проблемы в настоящее время читать дальше OIDs от каждого конкретного контекста, например:

my $ciscoL4L7ResourceLimitTable = '.1.3.6.1.4.1.9.9.480.1.1.2'; 
my ($session, $error) = Net::SNMP->session(-hostname => '1.2.3.4', -community => '[email protected]_NAME'); 
my %stats = %{ $snmp->get_entries(-columns => [ $ciscoL4L7ResourceLimitTable ]) } 

Если я бегу с -debug => DEBUG_ALL, я вижу, данные возвращаются в инспекции пакетов (с узнаваемыми данными из этого контекста), но го ан я получаю много из следующих ошибок:

error: [131] Net::SNMP::Security::Community::process_incoming_msg(): The community name "[email protected]_NAME" was expected, but "public" was found 
error: [218] Net::SNMP::MessageProcessing::prepare_data_elements(): The community name "[email protected]_NAME" was expected, but "public" was found 
error: [398] Net::SNMP::Dispatcher::_transport_response_received(): The community name "[email protected]_NAME" was expected, but "public" was found 
error: [1234] Net::SNMP::__ANON__(): The community name "[email protected]_NAME" was expected, but "public" was found 
error: [2363] Net::SNMP::__ANON__(): The community name "[email protected]_NAME" was expected, but "public" was found 

... и в результате содержание %stats является undef.

Если я пытаюсь использовать -community => 'public', он работает, но я получаю только значения из контекста по умолчанию (который не содержит всего, что мне нужно).

Если я пытаюсь с -contextname => 'CONTEXT_NAME', я просто получаю:

error: [2423] Net::SNMP::_context_name(): The contextName argument is only supported in SNMPv3 

Разве это не возможно, чтобы делать то, что мне нужно с Net::SNMP?

This is perl, v5.10.1 (*) built for i386-linux-thread-multi 
CPAN_FILE D/DT/DTOWN/Net-SNMP-v6.0.1.tar.gz 
INST_VERSION v6.0.1 
+0

1) Вы не указываете версию SNMP в 'Net :: SNMP-> session()' (по умолчанию - v1). 2) Согласно [руководству по администрированию серии ACE 4700] (http://www.cisco.com/en/US/docs/app_ntwk_services/data_center_app_services/ace_appliances/vA3_1_0/configuration/admin/guide/snmp.html#wp1082931), каждый контекст имеет свой собственный IP-адрес. В ваших фрагментах кода отображается только один IP-адрес. 3) Контексты были введены в SNMP v3, следовательно, ошибка Net :: SNMP. Cisco предоставила средства для доступа к контексту для SNMP v1, v2 и v2c, если вы следуете приведенному выше руководству. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot - ** 1) ** Артефакт попытки свести код к минимуму, чтобы продемонстрировать проблему - он не работает ни с 'snmpv1', ни с snmpv2c; ** 2) ** Каждый контекст имеет свой собственный IP-адрес, но это не типично (и, следовательно, я не собираюсь) включить управляющий трафик на всех IP-адресах, а только контекста администратора (который находится в выделенной VLAN) ; ** 3) ** В руководстве показано использование «snmpget -c COMMUNITY @ CONTEXT ...», которое я уже продемонстрировал выше, но то же самое, похоже, не применяется к Net :: SNMP (или, скорее, Net :: SNMP явно предотвращает это). – jimbobmcgee

+0

Это не помогает другим отлаживать ваш код, если вы удаляете важные биты, но это ни здесь, ни там. Просто для уточнения, * admin * context IP - это «1.2.3.4», строка контекстного сообщества * admin * является «public», а контекст * user *, к которому вы хотите получить доступ, - 'CONTEXT_NAME'? – ThisSuitIsBlackNot

ответ

1

С электронной почтой разговора я только что был с пакетом автором, Word-of $ Божества:

«Реализация контекста» Cisco является конкретным поставщиком и не основано на стандартах. Использование «контекстов» официально определено в RFCs SNMPv3 (спецификации). Модули Net :: SNMP пытаются выполнить RFC в своей реализации. Я должен вернуться к RFC, чтобы определить, является ли законным отвечать на сообщение SNMP v1/2c со строкой «community», которая не совпадает с строкой, с которой был выполнен запрос. Это проблема, которую вы видите.

Вы, скорее всего, не захотите, чтобы Cisco изменила свою реализацию, даже если она нарушает RFC, поэтому ваш единственный призыв состоит в том, чтобы прокомментировать код в модуле Net/SNMP/Security/Community.pm, который возвращается ошибка при отправке/получении различных строк сообщества. Обычно я не добавляю модификацию модуля для решения специфических проблем поставщика.

Вместо закомментируйте соответствующий раздел Community.pm (который используется гораздо больше на моем сервере, чем только этот сценарий), я вместо этого избран прокладки/обезьяна патч методы в вопросе в моем собственный код, например:

no warnings 'redefine'; 
use Net::SNMP::Security::Community; 
*Net::SNMP::Security::Community::process_incoming_msg = sub { return 1; }; 

Таким образом, метод не суметь обойден в пользу просто принимать любую возвращенную строку сообщества.

Грязный грязный по всем пунктам, но приемлемый в моей контролируемой среде. Любой, кто встретит это в будущем, должен убедиться, что версия ! = 6.0.1 не изменил способ работы этого модуля или то, что делает существующая подпрограмма, прежде чем пытаться сделать то же самое.

Смежные вопросы