Gunner Posted August 30, 2011 Posted August 30, 2011 Ребят помогите реализовать такой запрос с помощью библиотеки Net:SNMP snmpset -c private -v 2c 10.10.250.157 1.3.6.1.4.1.171.12.9.3.2.1.4.50.192.168.251.155 a 10 1.3.6.1.4.1.171.12.9.3.2.1.20.50.192.168.251.155 i 2 1.3.6.1.4.1.171.12.9.3.2.1.21.50.192.168.251.155 x 80000000 1.3.6.1.4.1.171.12.9.3.2.1.22.50.192.168.251.155 i 4 все работает на ура делаю my( @list); print "0x",PortPrepare($port),"\n"; push( @list, ("1.3.6.1.4.1.171.12.9.3.2.1.4.50.".$port, IPADDRESS, $ip)); push( @list, ("1.3.6.1.4.1.171.12.9.3.2.1.20.50.".$port, INTEGER, 2)); push( @list, ("1.3.6.1.4.1.171.12.9.3.2.1.21.50.".$port, OCTET_STRING,"80000000")); push( @list, ("1.3.6.1.4.1.171.12.9.3.2.1.22.50.".$port, INTEGER, 4)); my $result = $session->set_request( -varbindlist => [@list]); die "request error: ".$session->error unless (defined $result); Получаю ошибку request error: Received badValue(3) error-status at error-index 3 at ./snmp.pl line 89. я понимаю что x это HEX-STRING, но там другая ошибка. request error: The ASN.1 type "HEX_STRING" is unknown at ./snmp.pl line 89. и что делать с праметрами такими Вставить ник Quote
littlesavage Posted August 30, 2011 Posted August 30, 2011 (edited) push( @list, "1.3.6.1.4.1.171.12.9.3.2.1.21.50.".$port, OCTET_STRING, pack("N", 0x80000000)); ? Edited August 30, 2011 by littlesavage Вставить ник Quote
littlesavage Posted August 30, 2011 Posted August 30, 2011 $session точно инициализирован на v2c? И покажи print Dumper(\@list); Вставить ник Quote
Gunner Posted August 30, 2011 Author Posted August 30, 2011 $VAR1 = [ '1.3.6.1.4.1.171.12.9.3.2.1.4.50.10', 64, '192.168.251.155', '1.3.6.1.4.1.171.12.9.3.2.1.20.50.10', 2, 2, '1.3.6.1.4.1.171.12.9.3.2.1.21.50.10', 4, 'Ĵ', '1.3.6.1.4.1.171.12.9.3.2.1.22.50.10', 2, 4 ]; my ( $session, $error ) = Net::SNMP->session ( Hostname => $ipcomm,Community => "private"); die "session error: $error" unless ( $session ); Вставить ник Quote
littlesavage Posted August 30, 2011 Posted August 30, 2011 По дефолту в Net::SNMP - v1. Нужно добавить -version => 2. В snmpset OID 1.3.6.1.4.1.171.12.9.3.2.1.4.50.192.168.251.155, а в дампе - 1.3.6.1.4.1.171.12.9.3.2.1.4.50.10. И лучше добавить в начало точку - .1.3.6.1.4.1.171.12.9.3.2.1.4.50.192.168.251.155 Вставить ник Quote
Gunner Posted August 30, 2011 Author Posted August 30, 2011 в начале ошибка выглядит все так snmpset -c private -v 2c 10.10.250.157 1.3.6.1.4.1.171.12.9.3.2.1.4.50.10 a 192.168.251.155 1.3.6.1.4.1.171.12.9.3.2.1.20.50.10 i 2 1.3.6.1.4.1.171.12.9.3.2.1.21.50.10 x 00400000 1.3.6.1.4.1.171.12.9.3.2.1.22.50.10 i 4 сработал следущий набор но несовсем так push( @list, (".1.3.6.1.4.1.171.12.9.3.2.1.4.50.".$port, IPADDRESS, $ip)); push( @list, (".1.3.6.1.4.1.171.12.9.3.2.1.20.50.".$port, INTEGER, 2)); push( @list, (".1.3.6.1.4.1.171.12.9.3.2.1.21.50.".$port, OCTET_STRING, pack("N","00400000" ))); push( @list, (".1.3.6.1.4.1.171.12.9.3.2.1.22.50.".$port, INTEGER, 4)); точка спасла, но блин вместо 10 порта правило создалось на 14-15, 20-21, 23, 25 то есть pack("N","00400000" ) делает что-то нето Вставить ник Quote
littlesavage Posted August 30, 2011 Posted August 30, 2011 У тебя это список портов коммутатора D-link ведь? Посмотри функцию str2portlist из этого скрипта: http://ls.orionet.ru/public/dlink_ports.pl Вставить ник Quote
Gunner Posted August 30, 2011 Author Posted August 30, 2011 (edited) Да это такая хитрая маска у длинка. Для snmpset сделал тупо массив my $port = $_[0]; switch($port){ case(1){return "80000000";} case(2){return "40000000";} case(3){return "20000000";} case(4){return "10000000";} case(5){return "08000000";} case(6){return "04000000";} case(7){return "02000000";} case(8){return "01000000";} case(9){return "00800000";} case(10){return "00400000";} case(11){return "00200000";} case(12){return "00100000";} case(13){return "00080000";} case(14){return "00040000";} case(15){return "00020000";} case(16){return "00010000";} case(17){return "00008000";} case(18){return "00004000";} case(19){return "00002000";} case(20){return "00001000";} case(21){return "00000800";} case(22){return "00000400";} case(23){return "00000200";} case(24){return "00000100";} else {return "00000000";} } Спасибо за скрипт, завтра посмотрю пойдет по нему переделаю. Edited August 30, 2011 by Gunner Вставить ник Quote
agr Posted August 30, 2011 Posted August 30, 2011 Вы неправильно употребили pack с шаблоном N, в параметрах должно быть число, а не строка. Обратите внимание как вам изначально написали - pack("N", 0x80000000). Со строками можете попробовать pack("h*", "00040000" ) или pack("H*", "00040000" ). Вставить ник Quote
Gunner Posted August 30, 2011 Author Posted August 30, 2011 pack("N", 0x80000000) тоже ругалось на неверный параметр. Спасибо попробую завтра. Вставить ник Quote
Gunner Posted August 31, 2011 Author Posted August 31, 2011 (edited) Кусок кода в скрипте что вы мне дали работает странно - для 3028 и 3200 свичей все нормально а для 3526 нет, зато pack("H*","40000000") работает везде и дает одинаковый результат в функцией str2portlist. Пока остановлюсь на этом варианте. Edited August 31, 2011 by Gunner Вставить ник Quote
RA81 Posted September 15, 2011 Posted September 15, 2011 Мне кажется вот более изящное решение насчет преобразования данных из мибов в порты, и наоборот. http://paste.org.ru/?rnmaxo Пользуйтесь на здоровье. Хотя представленный выше код, тоже интересен. Взял на вооружение. У меня слабость в использовании pack/unpack Вставить ник Quote
Night_Snake Posted July 3, 2013 Posted July 3, 2013 Апну-ка я тему... Проблема, в общем-то та же. Есть код, использующий NET::SNMP. Есть свичи - des-3028, des-3526, des-3200a1/c1. На 3200c1 и 3526 код работает. На 3028 и 3200а1 - нет. Часть кода, которая непосредственно записывает oid на свич: sub set_snmp_info{ my $host = shift; my %result_hash; my @oid_list = @{(shift)};#OID:value my $community = shift || "private"; my $version = shift || "v2c"; my $timeout = shift || 60; my ($session, $error) = Net::SNMP->session( -hostname => $host, -community => $community, -version => 'snmp'.$version, -timeout => $timeout, ); if (!$session){ print "ERROR $host: $error\n"; return $error; } foreach my $query (@oid_list){ my @oids = ($query->{'oid'}, $query->{'type'}, $query->{'value'}); if (_convert_asn1_types(\@oids)) { _usage(); } my @args = (-varbindlist => \@oids); my $result = $session->set_request(@args); if(!$result){ $error = $session->error(); print "ERROR $host ($query->{'oid'}, $query->{'type'}, $query->{'value'}): $error\n"; return $error; } } $session->close(); return 0; } Данные в эту функцию попадают в таком же виде, как и у ТС. Ошибка вот такая: Set .1.3.6.1.4.1.171.12.23.4.1.1.3.10.10.10.10 to 4 with type i Set .1.3.6.1.4.1.171.12.23.4.1.1.2.10.10.10.10 to AABBCCDDEE11 with type h Set .1.3.6.1.4.1.171.12.23.4.1.1.4.10.10.10.10 to 0000020000000000 with type h ERROR 172.18.16.4 (.1.3.6.1.4.1.171.12.23.4.1.1.3.10.10.10.10, i, 4): Received wrongValue(10) error-status at error-index 1 Если тоже самое делать через snmpset (скармливая несколько oid в одном запросе), то все ок. ЧЯДНТ? Вставить ник Quote
agr Posted July 4, 2013 Posted July 4, 2013 a _convert_asn1_types(\@oids) корректно отрабатывает? Вставить ник Quote
Night_Snake Posted July 4, 2013 Posted July 4, 2013 a _convert_asn1_types(\@oids) Да, иначе бы код не отрабатывал на 3526 и 3200c1. Вставить ник Quote
agr Posted July 4, 2013 Posted July 4, 2013 (edited) стоит все же проверить что получается в @oids после обработки той функцией. Edited July 4, 2013 by agr Вставить ник Quote
Night_Snake Posted July 5, 2013 Posted July 5, 2013 стоит все же проверить что получается в @oids после обработки той функцией. Получаются SNMP-типы данных: IPADDRESS, INTEGER и т.д. Повторюсь, этот код работает, но вот с некоторыми длинками есть "особенности". Вставить ник 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.