Backup конфигурации cisco на сервер Linux (Ubuntu 10.04)

Linux
Нашей задачей будет настроить резервное копирование устройств cisco. Backup настроим через tftp сервис на сервере с ОС Linux (в моем примере это Ubuntu 10.04).

1. Сначала поставим сервис atftpd:

sudo apt-get install atftpd

правим настройки запуска сервиса
sudo vi /etc/default/atftpd

USE_INETD=false
OPTIONS="--daemon --port 69 --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /var/tftp"

дальше можно пачкой запустить команды
sudo invoke-rc.d atftpd start
cd /var
sudo mkdir tftp
sudo chmod -R 777 tftp/
sudo chown -R nobody tftp/
sudo /etc/init.d/atftpd restart


2. Доустанавливаем к perl необходимые модули (можно пропустить если ужО):
sudo apt-get install libnet-telnet-perl
sudo apt-get install libnet-telnet-cisco-perl
sudo apt-get install libmail-sendmail-perl


3. Создаем скрипт бекапа:
touch back.pl
vi back.pl

и заливаем в него содержимое
#!/usr/local/bin/perl
use Net::Telnet();
use Net::Telnet::Cisco;
use Mail::Sendmail;
use Time::localtime;
$tm = localtime;
my $log="";
my $log_t="";
my $tmp;
my $is_login=0;
my $alive="";
my $server_ip="192.168.0.1";
my $cisco_ip="192.168.0.1";
my $login="cisco";
my $password="cisco";

($DAY, $MONTH, $YEAR) = ($tm->mday, $tm->mon, $tm->year);

$ip=$cisco_ip;
$session = new Net::Telnet(Timeout => 5, Errmode=>"return");
$session->open(Host=>$ip, Port => 23);

$msg=$session->errmsg;
if(!$msg)
{
$txt = "\t\tOK!\n";
print $txt; $log=$log.$txt;
$alive=$alive.$ip."\n";
$txt="Logging on GW_Center   ";
print $txt; $log=$log.$txt;
# Cisco
$t=Net::Telnet::Cisco->new(Errmode=>"return",Timeout=>20,Host=>$ip,Input_log=>'tmp_cisco.txt',Output_log=>'tmp_cisco1.txt');
if ($t->login($login,$password)){$is_login=1;} else{$is_login=0;};

if($is_login>0){$txt="\t\tOK!\n";} else{$log_fail=$log_fail."$ip\n",$txt="\t\tfailed!\n";$log_t=$log_t."$ip\tlogin_failed!!\n";};

print $txt; $log=$log.$txt;

$txt="Uploading cmd...";
print $txt; $log=$log.$txt;
$is_cmd=0;

if ($is_login>0)
{
        $t->cmd('terminal length 0');
        $t->cmd("copy running tftp://$server_ip/cisco.run.$DAY-$MONTH-$YEAR\n\n\n");
        $t->cmd("copy vlan.dat tftp://$server_ip/cisco.vlan.dat.$DAY-$MONTH-$YEAR\\n\n\n");
        $is_cmd=1;
        #$res=@lin;
        $t->cmd("logout");
        $t->close;
};

if($is_cmd)
{
        $txt="\t\tOK!\n\n";
        $log_t=$log_t."$ip\tOK!\n";
}
else
{
        $txt="\t\tfailed!\n";
        $log_t=$log_t."$ip\tfailed!\n";
}
print $txt; $log=$log.$txt;
$t->close;
}

%mail =
(
        To      => 'anton@*****.ru',
        From    => 'anton@*****.ru',
        Subject => 'Cisco BACKUP Report',
        Message => "Backup device: cisco\n$log_t\n$log\n",
        SMTP    => 'relay'
);

sendmail(%mail) or die $Mail::Sendmail::error;
print "OK. Log says:\n", $Mail::Sendmail::log;


4. Настроим cron для ежедневного срабатывания скрипта
sudo vi /etc/crontab
1 23 * * * root perl /home/admin/back.pl
sudo /etc/init.d/cron stop
sudo /etc/init.d/cron start

6 комментариев

avatar
как оказалось в этой версии убунты cron настраивается по другому, поэтому исправил.
было
* */23 * * * root perl /home/admin/back.pl
avatar
еще переделал скрипт для бекапа нескольких девайсов сразу
#!/usr/local/bin/perl
use Net::Telnet();
use Net::Telnet::Cisco;
use Mail::Sendmail;
use Time::localtime;
$tm = localtime;
my $log="";
my $log_t="";
my $tmp;
my $is_login=0;
my $alive="";
my @row1 = ("10.10.10.1","cisco1","user1","****");
my @row2 = ("10.10.10.2","cisco2","user1","****");
my @cisco_routers = (\@row1, \@row2);
($DAY, $MONTH, $YEAR) = ($tm->mday, $tm->mon, $tm->year);

for(my $i = 0; $i <= $#cisco_routers; $i++){

    $session = new Net::Telnet(Timeout => 5, Errmode=>"return");
    $session->open(Host=>$cisco_routers[$i][0], Port => 23);

    $msg=$session->errmsg;
    if(!$msg)
    {
$txt="Logging on GW_Center   ";
print $txt;.
$t=Net::Telnet::Cisco->new(Errmode=>"return",Timeout=>20,Host=>$cisco_routers[$i][0],Input_log=>'tmp_cisco.txt',Output_log=>'tmp_cisco
if ($t->login("$cisco_routers[$i][2]","$cisco_routers[$i][3]")).
  {
     $is_login=1;
  } else
  {
     $is_login=0;
  };
if ($is_login>0) {$txt="\t\tOK!\n";}.
    else {.
           $log_fail=$log_fail."$cisco_routers[$i][0]\n",$txt="\t\tfailed!\n";
           $log_t=$log_t."$cisco_routers[$i][0]\tlogin_failed!!\n";
         };

    print $txt;
    if($is_login==0){next;};

    $txt="Uploading cmd...";
    print $txt;
    $is_cmd=0;
    if ($is_login>0)
    {
        $t->cmd('terminal length 0');
        $t->cmd("copy running tftp://10.10.10.3/$cisco_routers[$i][1].run.$DAY-$MONTH-$YEAR\n\n\n");
        $t->cmd("copy vlan.dat tftp://10.10.10.3/$cisco_routers[$i][1].vlan.dat.$DAY-$MONTH-$YEAR\\n\n\n");
        $is_cmd=1;
        #$res=@lin;
        $t->cmd("logout");
        $t->close;
    };

    if($is_cmd)
    {
        $txt="\t\tOK!\n\n";
        $log_t=$log_t."$cisco_routers[$i][1]\tOK!\n";
    }
    else
    {
        $txt="\t\tfailed!\n";
        $log_t=$log_t."$cisco_routers[$i][1]\tfailed!\n";
    }
    print $txt;
    $t->close;
    }
}

%mail =
(
        To      => '*****@*****.ru',
        From    => '*****@*****.ru',
        Subject => 'Cisco BACKUP Report',
        Message => "Backup devices:\n $log_t\n",
        SMTP    => 'relay'
);

sendmail(%mail) or die $Mail::Sendmail::error;
print "OK. Log says:\n", $Mail::Sendmail::log;