Тестирую скрипт который обходит свитчи и сливает текущий конфиг с них:
#!/usr/bin/perl
use Net::Telnet;
use DBI;
my $ip;
my $name = 'adm';
my $pass = '12345678';
my $qry = ("SELECT ip FROM computers WHERE unit_id='76' ORDER BY ip");
my $dbh = DBI -> connect ("DBI:Pg:dbname=info user=info_bckp_switch host=10.0.0.4 password=qwerty");
my $sth = $dbh -> prepare($qry);
my $rv = $sth -> execute();
if (!defined $rv) {
print "ERROR on while execute '$qry': " . $dbh->errstr . "\n";
exit(0);
}
###################################################################################################
while (my @row = $sth -> fetchrow_array())
{
$ip = $row[0]; #get ip switch
foreach $ip(@row)
{
my $ping = "ping -c 1 -q $ip";
my @lines = `$ping`;
for my $line (@lines)
{
if ($line =~ /\s+(\d+)% packet loss/)
{
if ($1 eq '100')
{
print "$ip - FAIL!\n"
}
else
{
print "$ip - OK!, then backup config $ip to continue...\n";
&getconf();
}
}
}
}
}
#########################################################################################################
sub getconf {
$file_name = $number = substr($ip,7,10); #strip ip address
$file_name =~ s/$number/switch$number.cfg/; #rename config file
system "unlink /var/tftp/$file_name";
system "touch /var/tftp/$file_name";
system "chmod 0666 /var/tftp/$file_name";
$telnet = new Net::Telnet (Timeout=>50,Prompt=>'/#/'); #make object net
$telnet -> open($ip); #connect to switch
$telnet -> login($name, $pass); #enter to switch
$telnet -> cmd('dis cli'); #for full output
$cmd1="show switch";
$cmd2="upload cfg_toTFTP 10.0.107.45 $file_name";
$cmd3="upload cfg_toTFTP 10.0.107.45 dest_file $file_name"; #for HardVer C1
@lines = $telnet -> cmd($cmd1);
chomp (@lines);
foreach $line (@lines)
{
($val) = $line =~ /Hardware Version\s+:\s+([A-Z0-9]+)/;
next unless $val;
if ($val eq "C1")
{
$telnet -> cmd($cmd3);
}
else
{
$telnet -> cmd($cmd2);
}
}
$telnet -> print('$cmd');
$telnet -> waitfor('/#/');
$telnet -> print ('logout');
$telnet -> close;
open(IF, "< /var/tftp/$file_name") or die $!;
open(OF, "> /var/tftp/$file_name.tmp") or die $!;
while(<IF>)
{
chomp;
s/create account admin sa//g;
s/11388019//g;
print OF $_;
}
close (OF);
close (IF);
rename "/var/tftp/$file_name", "/var/tftp/$file_name.bkp";
rename "/var/tftp/$file_name.tmp", "/var/tftp/$file_name";
unlink "/var/tftp/$file_name.bkp";
$date = `date +%d-%m-%Y--%H-%M`;
open(IF, ">> /var/tftp/$file_name") or die $!;
print IF "\n#$date";
close (IF);
system "chmod 0666 /var/tftp/$file_name";
}
$sth -> finish();
$dbh -> disconnect();
Но результате конфиг сваливается весь в одну длинющую строку,
а в логах свитчей обнаруживается около 170 подключений этим скриптом, вместо одного.
Помогите пожалуйста найти ошибки!
Приветствуются любые замечания и советы по улучшению!