Страница 1 из 1

Perl. бэкап свичей

Добавлено: 2008-08-13 13:00:16
hm
Поставили задачу, написать прогу, которая бы снимала бэкап каждый день и релизила в svn, а затем сравнивала бы их с предыдущим и отсылала дифф по почте. Написал малость, по описаниям модулей только теперь никак не получается собрать все в единую программу. Я новичок, сильно не бейте)

сканируем сеть

Код: Выделить всё

#!/usr/local/bin/perl -w

use Net::Ping;

sub who_send_ack(@);
sub main;

main;

sub main {
        my @acked;
        @acked = who_send_ack( 192, 168, 0, 2..254 );
        print "$_\n" foreach @acked;
        }

sub who_send_ack(@) {
        my( $first_three_octets, @last_octets, @hosts, $p, @acked );
        $first_three_octets .= shift() . "." for 1..3;
        push @hosts, map { $first_three_octets . $_ } @_;

        $p = Net::Ping->new( "syn", 2 );
        foreach my $host ( @hosts ) {
        $p->ping( $host );
            }
        while( my( $host,$rttp,$ip ) = $p->ack ) {
        push @acked, $ip;
            }
        return @acked;
}
снимаем версию девайса

Код: Выделить всё

#!/usr/local/bin/perl -w

use Net::SNMP;

open(FFC,"> /var/tmp/CISTEL");
my $session = Net::SNMP->session(
    -hostname  => '192.168.0.124',
    -community => 'public',
     );
my $sysvers = '1.3.6.1.2.1.1.1.0';
my $result = $session->get_request( -varbindlist => [$sysvers] );
print FFC $result->{$sysvers};
close (FFC);
$session->close;
exit 0;
снимаем конф со старых 3комов

Код: Выделить всё

#!/usr/local/bin/perl -w

use Net::Telnet;

my $hostname="192.168.0.20";
my $tftpserv="192.168.0.1";

$username="admin";
$password="admin";
$telnetcmd='system backupConfig save $tftpserv $hostname 3comoscfg.cfg';
$telnetcmd=~ s/(\$\w+)/$1/eeg;

$t = Net::Telnet->new ( Timeout => 10,
                        Prompt => '/Select menu option:/',
                        Errmode => 'die',
                        Host => $hostname);
$t->login($username, $password) or die "not authorized: ", $t->lastline;
$t->cmd($telnetcmd) or die "error: ", $t->lastline;
$t-> close;
exit 0;
конфы с новых 3комов

Код: Выделить всё

#!/usr/local/bin/perl -w

use Net::Telnet;

$hostname="192.168.0.21";
my $tftpserv = "192.168.0.1";

$username = "admin";
$password = "admin";
$telnetcmd = 'tftp $tftpserv put flash:/3comoscfg.cfg';
$telnetcmd =~ s/(\$\w+)/$1/eeg;

$t = Net::Telnet->new ( Timeout => 10,
                        Prompt => '/>/',
                        Errmode => 'die',
                        Host => $hostname);
$t->login($username, $password) or die "not authorized: ", $t->lastline;
$t->cmd($telnetcmd) or die "error: ", $t->lastline;
$t-> close;
exit 0;
снимаем с цисок

Код: Выделить всё

#!/usr/local/bin/perl -w

use Net::Telnet::Cisco;
use Timestamp::Simple qw(stamp);

$user = "admin";
$pass = "admin";

my $dt = stamp;
$backup_host  = "192.168.0.1";
$device       = "192.168.0.22";

$session = Net::Telnet::Cisco->new(Host => $device );
$session->login($user, $pass);

$session->enable($pass);
$session->cmd("copy run tftp://$backup_host\n\n\n");
$session->close;

exit 0;
дифф

Код: Выделить всё

#!/usr/local/bin/perl

use Text::Diff;

open(FFA,"> /var/tmp/diff");
open(FFF,"< /var/tmp/123");
open(FFE,"< /var/tmp/321");

my $diff = diff \*FFF, \*FFE, { STYLE => "Table" };

close (FFF);
close (FFE);
print FFA $diff;
close (FFA);
exit 0;
а тут уже снимаем конф по ssh

Код: Выделить всё

#!/usr/bin/perl -w

use Net::SSH::Perl;
use Net::SMTP_auth;

my $host = "192.168.0.31";
my $user = "admin";
my $pass = "admin";
my $cmd='show running';
open(FFF,"> /var/tmp/test.conf");

my $ssh = Net::SSH::Perl->new($host, debug => 1);
$ssh->login($user, $pass);
my ($out, $err) = $ssh->cmd($cmd);

$result=$out;
print FFF $out;
close (FFF);

$smtp = Net::SMTP_auth->new('mail.local');
$smtp->auth('LOGIN', 'test', 'test');
$smtp->mail('back@serv.local');
$smtp->to(''admin');
$smtp->data();
$smtp->datasend("To: postmaster\n");
$smtp->datasend("\n");
$smtp->datasend($result);
$smtp->dataend();
$smtp->quit;

exit 0;
ну и для релиза на свн нужно написать.
Алгоритм: сканируем диапазон, если хост живой снимаем версию через снмп, далее выполняем скрипт, соответсвующий девайсу бэкапа на тфтп и релизим на свн. затем проверяется дифф между тем, что лежит на свн и тфтп и дифф отправляется по почте. вот и все

Re: Perl. бэкап свичей

Добавлено: 2008-08-13 13:36:35
hizel
во-первых если вы ставите Net-SNMP
не будет ли удобнее использовать

Код: Выделить всё

use SNMP;
вместо Net::SNMP

во вторых не будет ли универсальнее делать просто полностью срез всего дерева snmp для
данного устройства, по идее там должно содержатся полная конфигурация свича
хм правда заодно там еще будет и текущее состояние

первые мысли

Re: Perl. бэкап свичей

Добавлено: 2008-08-13 14:09:24
hm
эммм, я не вдавался в подродности. просто в Cpan нашел модуль Net:SNMP , почитал и написал.
а на счет получения конфа по снмп. надо бы заюзать. по мере продвижения буду выкладывать тут свои наработки) спасибо.

Re: Perl. бэкап свичей

Добавлено: 2008-08-13 15:14:49
hm
а каким образом можно слить конф по снмп?

Re: Perl. бэкап свичей

Добавлено: 2008-08-13 15:18:31
hizel
например для сиськи
http://www.opennet.ru/base/cisco/snmp_manage.txt.html
=)
смотреть mib файлики для конкретного устройства ;)

Re: Perl. бэкап свичей

Добавлено: 2008-08-13 16:10:45
hm
hizel писал(а):например для сиськи
http://www.opennet.ru/base/cisco/snmp_manage.txt.html
=)
смотреть mib файлики для конкретного устройства ;)
а на 3комах будет работать???

Re: Perl. бэкап свичей

Добавлено: 2008-08-13 16:11:26
hizel
думаю нет :)

Re: Perl. бэкап свичей

Добавлено: 2008-08-13 16:21:56
hm
решил попробовать, действительно не получается)
такц, тогда такой способ отпадает

Re: Perl. бэкап свичей

Добавлено: 2008-08-13 16:26:01
hizel
мм к каждой нармальной и ненормальной железке если оно поддерживает snmp
хороший производитель прилагает файлики mib, они, эти файлики, текстовые,
хуман-реадабле и в них можно потупить и узнать много нового собственно о железке ;)

Re: Perl. бэкап свичей

Добавлено: 2008-08-15 11:54:17
hm
http://support.3com.com/infodeli/tools/ ... 15snmp.htm
насколько я понимаю, с 3кома я не смогу снимать конфы по снмп.