Config-Sicherung von Cisco-Routern mit Perl-Script

Ich möchte mit einem Perl-Script die Konfigs von Cisco-Routern und Switchen sichern. Dazu nutze ich die Module Net::Telnet::Cisco & Net::SCP::Expect, um die Konfigs entweder per scp oder per telnet/tftp zu sichern Ich pflege die Geräte in einer Datei, die ich einlese und dann nach und nach die Konfigs wegschreibe.

Funktioniert soweit, das Problem ist nur, dass wenn eines der Module auf einen Fehler läuft (z.B. Gerät nicht erreichbar o.ä.) das komplette Script abbricht, da das Modul in dem Fall scheinbar ein exit schmeißt.

Wie bekomme ich es hin, dass bei einem Fehler das Script nicht komplett abbricht, sondern beim nächsten Gerät in der Liste weitermacht?

Vielen Dank im Voraus für die Hinweise…

…da das Modul in dem Fall
scheinbar ein exit schmeißt.

Wie bekomme ich es hin, dass bei einem Fehler das Script nicht
komplett abbricht, sondern beim nächsten Gerät in der Liste
weitermacht?

Hallo Sven,

ich bin mir nicht ganz sicher, was Du mit „exit schmeißen“ meinst, aber ohne die Module näher angesehen zu haben, würde ich spontan sagen, dass dir hier „eval“ weiterhilft.

Beispiel:

my $session=Net::Telnet::Cisco->new(Host => ‚123.123.123.123‘);
eval
{
$session->tuIrgendwas();
};
warn $@ if $@;

Viele Grüße

Kai

Hallo!

Ich kennen jetzt natürlich die Struktur nicht, aber hast Du es schon mal mit eval versucht?

Also zum Beispiel so:

eval { connect(xyz) };
warn() if $@;
eval { print(„Print klappt.\n“); };
warn() if $@;

Als Ergebnis bekommst Du dann normalerweise sowas:
The Unsupported function connct function is unimplemented at abc.pl line 22.
…caught at abc.pl line 23.
Print klappt.

Alternativ: wühle Dich durch https://www.socialtext.net/perl5/index.cgi?exception…

Viele Grüße,
Michael

Vorschlag: ausführen des kritischen Codes in einer eval-Umgebung mit der Möglichkeit, Fehler über die- und warn-Handler abzufangen und zu bearbeiten.

#!perl

URL: http://www.cs.cf.ac.uk/Dave/PERL/node116.html

sub WARN_handler {
my($signal) = @_;

sendToLogfile(„WARN: $signal“);

return;
}

sub DIE_handler {
my($signal) = @_;

sendToLogfile(„DIE: $signal“);

return;
}

sub sendToLogfile {
my(@array) = @_;

open(LOGFILE, „>>program.log“);
print LOGFILE join("\n", @array), „\n“;
close(LOGFILE);

return ;
}

$SIG{__WARN__} = ‚WARN_handler‘;
$SIG{__DIE__} = ‚DIE_handler‘;

„warn“ abfangen

chdir(’/printer’) or warn($!);

„die“ abfangen und als „warn“ ausgeben, dann Programm fortsetzen

eval { chdir(’/printer’) or die($!); };
warn $@ if $@;

„die“ abfangen VOR Programmabbruch

chdir(’/printer’) or die($!);

1;

habe leider nicht viel erfahrung mit Routern und Switchen…

ist es möglich, vorher einen ping an das gerät zu senden und ihn abzufragen? Damit wäre z.B. bereits die Erreichbarkeit gesichert.

gruß

Hallo,

kann leider nicht weiterhelfen!

Mit freundlichen Grüssen!

Ich kenne mich nur mit perl aus, nicht mit Cisco-routern etc. Es hört sich für mich so an, als ob eine Abfrage fehlt, dass bei einem Fehler im script kein exit passiert. Ich würde versuchen das Modul umzuschreiben. Ansonsten kann cih leider ncith weiterhelfen.

das tut mir leid - hier kann ich leider gar nicht weiter helfen.
Grüße, Burkhard

Hallo,

ist es hilfreich, wenn der Router das selber übernimmt ?

http://www.netzwerkblog.info/2012/07/automatische-si…

Gruß
Michael