Перезагрузка оборудования Cisco по расписанию
Этот скрипт пригодится тем у кого оборудование уже старое и бывает глючит и требует перезагрузки устройств для профилактики. В качестве скрипта использовал уже готовый, но немного переделанный скрипт backup 'а в другом топике.
#!/usr/bin/perl
use Net::Telnet ();
use Net::Telnet::Cisco;
use Mail::Sendmail;
my $ip="";
my $usernameCisco="login";
my $passwordCisco="password";
my $Cisco=0;
my $Unknown=0;
my $is_login=0;
my $is_cmd=0;
my $res="";
my $log_fail="";
my $dead="";
my $alive="";
my $log="";
my $log_t="";
my $t;
my $tmp;
my $mu;
# ----------------------------------------------------------------
$txt = "--- Config download script by dfox ---\n";
print $txt; $log=$log.$txt;
$txt = "Initialization...";
print $txt; $log=$log.$txt;
$txt = "\t\tOK!\n----------------------------\n";
print $txt; $log=$log.$txt;
# ----------------------------------------------------------------
# Пробегаем по списку адресов
# ----------------------------------------------------------------
$b3 = "225";
#for($k=0; $k<=$size-1;$k++)
#{
$ip="xxx.uuu.yyy.zzz";
$txt = "trying $ip...";
print $txt; $log=$log.$txt;
$sessionnoc = new Net::Telnet(Timeout => 5, Errmode=>"return");
$sessionnoc->open(Host=>"server.ru", Port => 23);
$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";
#------------------------------------------------------
# проверяем что за девайс
#------------------------------------------------------
$tmp="";
$tmp=$session->get;
$devType=0;
# Cisco
if (index($tmp,"")>=0)
{
$devType=1;
$txt="Device type - Cisco\n";
};
$txt="Logging on... ";
print $txt; $log=$log.$txt;
# Cisco
if ($devType==1)
{
$t=Net::Telnet::Cisco->new(Errmode=>"return",Timeout=>20,Host=>$ip,Input_log=>'tmp_cisco_in.txt',Output_log=>'tmp_cisco_out.txt');
if ($t->login($usernameCisco,$passwordCisco)){$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;
if($is_login==0){next;};
#------------------------------------------------------
# делаем дело исходя из типа девайса
#------------------------------------------------------
$txt="Uploading cmd...";
print $txt; $log=$log.$txt;
$is_cmd=0;
# Cisco
if ($devType==1 && $is_login>0)
{
if(!($t->is_enabled)) {$t->enable($passwordCisco);};
$t->cmd('terminal length 0');
$mu = $k+1;
if (@lin=$t->cmd("reload \n\n\n"))
{
$is_cmd=1;
++$Cisco;
$t->cmd("logout");
$t->close;
}
else {$is_cmd=0;};
};
if($is_cmd)
{
$txt="\t\tOK!\n$res\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;
}
else
{
$txt = "\t\tfailed!\n";
print $txt; $log=$log.$txt;
$dead=$dead.$ip."\n";
$log_t=$log_t."$ip\ttelnet_failed!!\n";
}
# закрываем сессию
$session->close;
#}
# ----------------------------------------------------------------
# шлем почту о резалтах
# ----------------------------------------------------------------
%mail =
(
To => 'admins@server.ru',
From => 'backups@server.ru',
Subject => 'Service report about REBOOT',
Message => "Reboot devices:\nCisco = $Cisco\n*************\n$log_t\n$log\n",
SMTP => '**********'
);
sendmail(%mail) or die $Mail::Sendmail::error;
print "OK. Log says:\n", $Mail::Sendmail::log;
# ----------------------------------------------------------------
В этом случае письмо отправиться только в случае ошибки. Так как подобные скрипты обычно запускают с внутреннего сервера с которого есть доступ к конфигурированию девайсов. Ну и строка в crontab:
0 4 * * 7 /home/user/cisco-reboot.pl
То есть скрипт будет отрабатывать раз в неделю на 7 день в 4 утра. Выбрал это время исходя из меньшей загрузки сети.
#!/usr/bin/perl
use Net::Telnet ();
use Net::Telnet::Cisco;
use Mail::Sendmail;
my $ip="";
my $usernameCisco="login";
my $passwordCisco="password";
my $Cisco=0;
my $Unknown=0;
my $is_login=0;
my $is_cmd=0;
my $res="";
my $log_fail="";
my $dead="";
my $alive="";
my $log="";
my $log_t="";
my $t;
my $tmp;
my $mu;
# ----------------------------------------------------------------
$txt = "--- Config download script by dfox ---\n";
print $txt; $log=$log.$txt;
$txt = "Initialization...";
print $txt; $log=$log.$txt;
$txt = "\t\tOK!\n----------------------------\n";
print $txt; $log=$log.$txt;
# ----------------------------------------------------------------
# Пробегаем по списку адресов
# ----------------------------------------------------------------
$b3 = "225";
#for($k=0; $k<=$size-1;$k++)
#{
$ip="xxx.uuu.yyy.zzz";
$txt = "trying $ip...";
print $txt; $log=$log.$txt;
$sessionnoc = new Net::Telnet(Timeout => 5, Errmode=>"return");
$sessionnoc->open(Host=>"server.ru", Port => 23);
$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";
#------------------------------------------------------
# проверяем что за девайс
#------------------------------------------------------
$tmp="";
$tmp=$session->get;
$devType=0;
# Cisco
if (index($tmp,"")>=0)
{
$devType=1;
$txt="Device type - Cisco\n";
};
$txt="Logging on... ";
print $txt; $log=$log.$txt;
# Cisco
if ($devType==1)
{
$t=Net::Telnet::Cisco->new(Errmode=>"return",Timeout=>20,Host=>$ip,Input_log=>'tmp_cisco_in.txt',Output_log=>'tmp_cisco_out.txt');
if ($t->login($usernameCisco,$passwordCisco)){$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;
if($is_login==0){next;};
#------------------------------------------------------
# делаем дело исходя из типа девайса
#------------------------------------------------------
$txt="Uploading cmd...";
print $txt; $log=$log.$txt;
$is_cmd=0;
# Cisco
if ($devType==1 && $is_login>0)
{
if(!($t->is_enabled)) {$t->enable($passwordCisco);};
$t->cmd('terminal length 0');
$mu = $k+1;
if (@lin=$t->cmd("reload \n\n\n"))
{
$is_cmd=1;
++$Cisco;
$t->cmd("logout");
$t->close;
}
else {$is_cmd=0;};
};
if($is_cmd)
{
$txt="\t\tOK!\n$res\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;
}
else
{
$txt = "\t\tfailed!\n";
print $txt; $log=$log.$txt;
$dead=$dead.$ip."\n";
$log_t=$log_t."$ip\ttelnet_failed!!\n";
}
# закрываем сессию
$session->close;
#}
# ----------------------------------------------------------------
# шлем почту о резалтах
# ----------------------------------------------------------------
%mail =
(
To => 'admins@server.ru',
From => 'backups@server.ru',
Subject => 'Service report about REBOOT',
Message => "Reboot devices:\nCisco = $Cisco\n*************\n$log_t\n$log\n",
SMTP => '**********'
);
sendmail(%mail) or die $Mail::Sendmail::error;
print "OK. Log says:\n", $Mail::Sendmail::log;
# ----------------------------------------------------------------
В этом случае письмо отправиться только в случае ошибки. Так как подобные скрипты обычно запускают с внутреннего сервера с которого есть доступ к конфигурированию девайсов. Ну и строка в crontab:
0 4 * * 7 /home/user/cisco-reboot.pl
То есть скрипт будет отрабатывать раз в неделю на 7 день в 4 утра. Выбрал это время исходя из меньшей загрузки сети.
Комментарии
Отправить комментарий