Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> скрипт сбора конфигов свитчей, автоматизация снятия резервных копий 
V
    Опции темы
trinitr0
Дата 28.10.2015, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Пытаюсь написать скрипт который обходит свитчи и собирает их конфиги:

Код

use Net::Telnet;
use DBI;

my $ip;
my $name = 'sa';
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=87654321");
my $sth = $dbh -> prepare($qry);
my $rv = $sth -> execute();

if (!defined $rv) {
  print "При выполнении запроса '$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 "OK, then for $ip to continue...\n";
                 &getconf();
             }
             else
             {
                    print "FAIL!\n"
             }
            }
       }
    }   
}    
            
sub getconf {
            $telnet = new Net::Telnet (Timeout=>5,Errmode=>'die',Prompt=>'/#/'); #make object net
            $telnet -> open($ip); #connect to switch
            $telnet -> login($name, $pass); #enter to switch
            $telnet -> cmd('dis cli'); #full output

            $file_name = $number = substr($ip,7,10); #strip ip address
            $file_name =~ s/$number/switch$number.cfg/; #rename config file

            if (-e "/var/tftp/$file_name")
            {
                system "unlink /var/tftp/$file_name";
            }
            else
            {
                system "touch      /var/tftp/$file_name";
                system "chmod 0666 /var/tftp/$file_name";
            }

            $cmd="upload cfg_toTFTP 10.0.107.45 $file_name";
            $telnet -> cmd($cmd);

            @lines = $telnet -> cmd($cmd);#output for debug
            
            $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/12345678//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();

__END__


Но в случае недоступности в данный момент свитча, скрипт завершает работу, вместо того чтобы перейти к следующему по списку взятого из  базы?

Подскажите пожалуйста как исправить такое поведение?

Это сообщение отредактировал(а) trinitr0 - 30.10.2015, 12:34
PM MAIL Jabber   Вверх
noize
Дата 28.10.2015, 21:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


5.18.2
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 10.7.2010
Где: СПб

Репутация: 3
Всего: 3



вызов &getconf(); заверните в eval. Примерно так:
Код

eval { &getconf(); };
if ($@) {
    print "Error when ran getconf: $@";
}

ну и мой стандартный совет - используйте strict и warnings, они очень облегчают жизнь

Это сообщение отредактировал(а) noize - 28.10.2015, 21:52
PM MAIL   Вверх
tzirechnoy
Дата 28.10.2015, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



Цитата
Net::Telnet (Timeout=>5,Errmode=>'die'


Дейстивтельно, непонятно, почему это оно завершается!
PM MAIL   Вверх
trinitr0
Дата 29.10.2015, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



strict и warnings присутвовали. Убрал по-причине того, дополнительной информации по решению основной проблемы они не давали. Разберусь с этой проблемой, верну и буду допиливать дальше.

Это сообщение отредактировал(а) trinitr0 - 29.10.2015, 00:10
PM MAIL Jabber   Вверх
trinitr0
Дата 29.10.2015, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Цитата(tzirechnoy @ 28.10.2015,  22:21)
Цитата
Net::Telnet (Timeout=>5,Errmode=>'die'

Дейстивтельно, непонятно, почему это оно завершается!

На что Вы намекаете? 
На Timeout=>5 или Errmode=>'die'?
PM MAIL Jabber   Вверх
tzirechnoy
Дата 29.10.2015, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



Из man Net::Telnet

Цитата
           When mode is "die" and an error is encountered using the object, then an error message is printed to standard error and the program dies.



PM MAIL   Вверх
trinitr0
Дата 29.10.2015, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Из строки
Код

Net::Telnet (Timeout=>5,Errmode=>'die'

 удалил
Код

Errmode=>'die'


Но всё равно прерывается при недоступности свитча такой строкой:

problem connecting to "10.0.0.201", port 23: Нет маршрута до узла at switch_conf_bkp.pl line 48
PM MAIL Jabber   Вверх
alezzz
Дата 29.10.2015, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



наверно потому что The default Errmode is "die", попробуйте вместо die поставить return.

я что-то не понял код:
Код

if ($line =~ /\s+(\d+)% packet loss/)
          {
             if ($1 eq '100')
             {
                 print "OK, then for $ip to continue...\n";
                 &getconf();
             }

если 100% loss (т.е. пинг не прошел) то пытаемся подключится по телнету?
PM MAIL   Вверх
trinitr0
Дата 30.10.2015, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



alezzz, точно, перепутано! Делал вечером, незаметил.
PM MAIL Jabber   Вверх
trinitr0
Дата 9.11.2015, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



В таком виде заработало:

Код

use Net::Telnet;
use DBI;

my $ip;
my $name = 'sa';
my $pass = '12345';

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=54321");
my $sth = $dbh -> prepare($qry);
my $rv = $sth -> execute();

if (!defined $rv) {
  print "При выполнении запроса '$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 "FAIL!\n"
             }
             else
             {
                print "$ip - OK!, then backup config $ip to continue...\n";
                 &getconf();
             }
         }
       }
    }   
}    
            
sub getconf {
            $telnet = new Net::Telnet (Timeout=>5,Prompt=>'/#/'); #make object net
            $telnet -> open($ip); #connect to switch
            $telnet -> login($name, $pass); #enter to switch
            $telnet -> cmd('dis cli'); #full output

            $file_name = $number = substr($ip,7,10); #strip ip address
            $file_name =~ s/$number/switch$number.cfg/; #rename config file

            if (-e "/var/tftp/$file_name")
            {
                unlink "/var/tftp/$file_name";
            }
            else
            {
                system "touch      /var/tftp/$file_name";
                system "chmod 0666 /var/tftp/$file_name";
            }

            $cmd1="upload cfg_toTFTP 10.0.107.45 $file_name";
            
            #$cmd2="upload cfg_toTFTP 10.0.107.45 dest_file $file_name";
            
            $telnet -> cmd($cmd1);

            @lines = $telnet -> cmd($cmd);#output for debug
            
            $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/12345//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();

__END__


Всем Спасибо!  smile 

Это сообщение отредактировал(а) trinitr0 - 9.11.2015, 11:02
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1371 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.