LINUX.ORG.RU
решено ФорумAdmin

[perl] Обработка аварийных ситуаций.

 


0

1

Привет всем, имеется скрипт для обращения к сетевому оборудованию по snmp:

#!/usr/local/bin/perl
use warnings;
use Net::SNMP;
my $OID = '1.3.6.1.2.1.1.1.0';

while (<>){
        chomp($_);
        
        ($session, $error) = eval{Net::SNMP->session(
                -hostname  => shift || $_,
                -community => shift || 'private',)};
        
        if (!defined $session) {
                printf "ERROR: 1%s.\n", $error;
        }

        my $result = $session->get_request(-varbindlist => [ $OID ],);

        if (!defined $result) {
                printf "ERROR: %s.\n", $session->error();
                $session->close();
                exit 1;
        }

        printf "'%s' is %s.\n",
        $session->hostname(), $result->{$OID};
        $session->close();
}
exit 0;
     

Если ему передать ip свитча, то он по snmp узнает модель свитча. Но вот если до свитча не достучаться, или его просто не существует, скрипт вываливается с ошибкой:
«ERROR: No response from remote host „172.16.16.3“ ,
что сделать, чтобы скрипт не прекращал свою работу если свитч не доступен? Пробовал поместить фрагменты в eval{}, не выходит ничего дельного, посоветуйте решение.



Последнее исправление: peektoseen (всего исправлений: 2)

JFYI

chomp($_);

можно заменить на

chomp;

madgnu ★★★★★
()

ох жость… читай коменты:

#!/usr/local/bin/perl

# use strict; ← где?
use warnings;
use Net::SNMP;
my $OID = '1.3.6.1.2.1.1.1.0';

while (<>){
        chomp($_); # chomp;
        
        # my …
        ($session, $error) = eval{Net::SNMP->session(
                -hostname  => shift || $_,
                -community => shift || 'private',)};
        # eval{…} — не нужен.
        # shift — для каждой итерации будет использоваться новая пара аргументов
        #         (или так и задумано?)
        
        # if (!…) → unless (…)
        if (!defined $session) {
                printf "ERROR: 1%s.\n", $error;
                # где завершение итерации? без этого…
        }
        
        # …здесь может быть попытка доступа по неопределённой ссылке.
        my $result = $session->get_request(-varbindlist => [ $OID ],);

        # уже говорил.
        if (!defined $result) {
                printf "ERROR: %s.\n", $session->error();
                $session->close();
                exit 1; # это завершение скрипта. для завершения итерации есть next;
        }

        printf "'%s' is %s.\n",
        $session->hostname(), $result->{$OID};
        $session->close();
}
exit 0;
arsi ★★★★★
()

>скрипт не прекращал свою работу если свитч не доступен?

Не прекращал работу и что делал? Ещё раз обращался к этому свичу или шёл дальше по списку аргуменов?

Не понятно, зачем скрипту обработка нескольких ip-адресов, пусть обрабатывал бы один адрес, а shell вызывал бы этот скрипт сколько нужно раз.

mky ★★★★★
()
Ответ на: комментарий от mky

Пробегался по списку IP адресов из файла, который я ему подсуну и возвращал модель свитча. Вроде все теперь работает:

#!/usr/local/bin/perl

# use strict; ← где?
use strict;
use warnings;
use Net::SNMP;
my $OID = '1.3.6.1.2.1.1.1.0';

while (<>){
        chomp; # chomp;

        # my …
        my($session, $error) = Net::SNMP->session(
                -hostname  => shift || $_,
                -community => shift || 'private',);
        # shift — для каждой итерации будет использоваться новая пара аргументов
        #         (или так и задумано?)

        # if (!…) → unless (…)
        unless (defined $session) {
                printf "_ERROR: %s.\n", $error;
                next;
                # где завершение итерации? без этого…
        }

        # …здесь может быть попытка доступа по неопределённой ссылке.
        my $result = $session->get_request(-varbindlist => [ $OID ],);

        # уже говорил.
        unless (defined $result) {
                printf "$_ not responce\n";
                $session->close();
                next; # это завершение скрипта. для завершения итерации есть next;
        }

        printf "'%s' is %s.\n", $session->hostname(), $result->{$OID};
        $session->close();
}
exit 0;

peektoseen
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.