Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Конфиг сваливается весь в одну длинющую строку

10K
18 апреля 2016 года
trinitro
48 / / 14.06.2010
Тестирую скрипт который обходит свитчи и сливает текущий конфиг с них:

Код:
#!/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 Versions+: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 подключений этим скриптом, вместо одного.

Помогите пожалуйста найти ошибки!
Приветствуются любые замечания и советы по улучшению!
1.8K
19 апреля 2016 года
Kuzya
184 / / 19.03.2008
либо здесь
 
Код:
@lines = $telnet -> cmd($cmd1);
    chomp (@lines);
    foreach $line (@lines)
либо здесь

 
Код:
while(<IF>)
    {
        chomp;
        s/create account admin sa//g;
chomp за комментируйте и протестируйте
1.8K
19 апреля 2016 года
Kuzya
184 / / 19.03.2008
Для начала,
 
Код:
SELECT ip FROM computers WHERE unit_id='76' ORDER BY ip
зайди на свой mysql и выполни запрос, посмотри что он вернёт.

Еще заметил, в конце запроса нет "точки с запятой", но насколько я помню, в mysql она необходима.
10K
19 апреля 2016 года
trinitro
48 / / 14.06.2010
Спасибо за попытку помочь!
Запрос возвращает, как и ожидается cписок ip.
В конце запроса "точки с запятой" и не нужно. Это код, а не консоль.
Маленькое уточнение - база из которой берутся сведения Postgres.
10K
20 апреля 2016 года
trinitro
48 / / 14.06.2010
Убрал chomp из этого куска и помогло:

 
Код:
while(<IF>)
    {
        #chomp;
        s/create account admin sa//g;
Спасибо Kuzya !

Но проблема с 170 подключениями пока остаётся...
1.8K
20 апреля 2016 года
Kuzya
184 / / 19.03.2008
 
Код:
if ($1 eq '100')
                 {
            print "$ip - FAIL!n"
            }

            else
вот тут еще точки с запятой на конце строки нету
10K
20 апреля 2016 года
trinitro
48 / / 14.06.2010
Да точно, исправил!

СПАСИБО!
1.8K
20 апреля 2016 года
Kuzya
184 / / 19.03.2008
еще бы я вот эту часть переделал бы
Код:
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();
                }

        }
}
на так
Код:
my $lines = `$ping`;

if ($lines =~ /(100% packet loss)/m)
{
    print "$ip - FAIL!n"
}

else
{
    print "$ip - OK!, then backup config $ip to continue...n";
        &getconf();
}
плюс в команду ping добавилбы параметры -W 10 - это таймаут
10K
20 апреля 2016 года
trinitro
48 / / 14.06.2010
Спасибо большое за советы! Сегодня поправлю! Если ещё какие будут ремарки пишите, буду рад!
10K
21 апреля 2016 года
trinitro
48 / / 14.06.2010
Так:

 
Код:
my $lines = `$ping`;
if ($lines =~ /(100% packet loss)/m)
{
    print "$ip - FAIL!n"
}

else
{
    print "$ip - OK!, then backup config $ip to continue...n";
    &getconf();
}
не сработало!
1.8K
25 апреля 2016 года
Kuzya
184 / / 19.03.2008
этим скриптом проверял, определяет - в "апе хост" или нет на ура, если заметишь, в каманду пинг я еще добавил таймаут.
Код:
#!/usr/bin/perl


my $ip = "192.168.1.10";
my $ping =  "ping -c 1 -W 1 -q $ip";

my $lines = `$ping`;

#print @lines;

if ($lines =~ /(100% packet loss)/m)
{
    print "$ip  - FAIL!/n";
}
else{
    print "$ip - OK!, then backup config $ip to continue.../n";
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог