Разбить массив на куски, выполнить snmp_get_request для каждого чанка, заново объединить полученные хеш-ссылки - PullRequest
0 голосов
/ 11 июня 2011

У меня проблема при попытке использовать плагин Nagios, использующий Net :: SNMP.Он пытается запросить большое количество OID одновременно, что приводит к ошибке, поскольку ответ превысит максимальное значение MTU для канала.(Размер сообщения 2867 превышает maxMsgSize 1472.)

Код для этого раздела следующий:

$result = $session->get_request(
   Varbindlist => \@oids
);

Есть ли в Perl способ

  1. Разделить @oids на более мелкие части
  2. Итерировать по этим частям
  3. Объединить возвращаемые результаты $ в одну ссылку на один хеш?

Это будетНаименьшая модификация скрипта для поддержки большего количества интерфейсов, правильно?

Ответы [ 2 ]

3 голосов
/ 11 июня 2011
1) Split @oids into smaller pieces
2) Iterate over these pieces

используйте splice (), чтобы разбить список на меньшие списки.Если вы хотите десять одновременно:

while (@oids) {
    my @sublist = splice @oids, 0, 10;
    # do something with the 10 (or less) elements in @sublist
}
0 голосов
/ 11 июня 2011

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

my $divisions = int ( @oids / 10 );
my $offset = 0;
my @oids_list;
while ( $offset <= $#oids ) {
    my $top = $offset + $divisions;
    $top = $top <= $#oids ? $top : $#oids
    push @oids_list, [ @oids[ $offset .. $top ] ];
    $offset += $divisions + 1;
}
my @results;

foreach my $oids_ref ( @oids_list ) {
    push @results, $session->get_request(
        Varbindlist => $oids_ref
}

Теперь, если мои вычисления верны, у вас будет@results, который будет списком возвращаемых значений из $ session-> get_request () за итерацию.Я не знаю, как это выглядит;может быть, вы просто объедините это вместе.Это ваша часть, чтобы выяснить.;)

...