Jump to content

Recommended Posts

Posted

Ребят помогите реализовать такой запрос с помощью библиотеки 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.

и что делать с праметрами такими

Posted

$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 );

Posted

По дефолту в 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

Posted

в начале ошибка выглядит все так

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" ) делает что-то нето

Posted (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 by Gunner
Posted

Вы неправильно употребили pack с шаблоном N, в параметрах должно быть число, а не строка. Обратите внимание как вам изначально написали - pack("N", 0x80000000).

Со строками можете попробовать pack("h*", "00040000" ) или pack("H*", "00040000" ).

Posted (edited)

Кусок кода в скрипте что вы мне дали работает странно - для 3028 и 3200 свичей все нормально а для 3526 нет, зато

pack("H*","40000000") работает везде и дает одинаковый результат в функцией str2portlist. Пока остановлюсь на этом варианте.

Edited by Gunner
  • 3 weeks later...
Posted

Мне кажется вот более изящное решение насчет преобразования данных из мибов в порты, и наоборот.

http://paste.org.ru/?rnmaxo

Пользуйтесь на здоровье. Хотя представленный выше код, тоже интересен. Взял на вооружение. У меня слабость в использовании pack/unpack

  • 1 year later...
Posted

Апну-ка я тему...

Проблема, в общем-то та же.

Есть код, использующий 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 в одном запросе), то все ок.

ЧЯДНТ?

Posted (edited)

стоит все же проверить что получается в @oids после обработки той функцией.

Edited by agr
Posted

стоит все же проверить что получается в @oids после обработки той функцией.

Получаются SNMP-типы данных: IPADDRESS, INTEGER и т.д. Повторюсь, этот код работает, но вот с некоторыми длинками есть "особенности".

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 и с Политикой конфиденциальности.