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

Поиск:

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


Шустрый
*


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

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



Тестирую скрипт который обходит свитчи и сливает текущий конфиг с них:

Код

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

Помогите пожалуйста найти ошибки!  
Приветствуются любые замечания и советы по улучшению!

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

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



А зачем вы 2 раза продублировали исходники?

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
trinitr0
Дата 8.4.2016, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Упс, нечаянно вышло. Исправлю
PM MAIL Jabber   Вверх
_zorn_
Дата 8.4.2016, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(trinitr0 @  7.4.2016,  21:00 Найти цитируемый пост)
а в логах свитчей обнаруживается около 170 подключений этим скриптом, вместо одного.

Для начала это локализуйте.
Например в начале функции getconf сделайте вывод айпи с чего конфиг льем.
В одну строку возможно потому что свитч переводы строки отдает в виде "\r".

А вы в перле вообще шарите ?
Я нет, поэтому общий совет - дебаг принтингом в консоль.
PM MAIL   Вверх
trinitr0
Дата 8.4.2016, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В perl я конечно не специалист, иначе таие кривые скрипты бы не писал  smile 

Но вот например если сливать конфиг передавая ip свитча как параметр: 

Код

#!/usr/bin/perl -w

use Net::Telnet;
use DBI;

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

###################################################################################################
    $ip = pop @ARGV; #get ip switch
        
        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! Switch unreachable!\n"
            }
            else
            {
            print "$ip - OK!, then backup config $ip to continue...\n";
             &getconf();
             print "Success! (Look in the directory /var/tftp/) \n";
            }
        }
        }
        
#########################################################################################################
sub getconf {

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

        system "touch      /var/tftp/$file_name";
        system "chmod 0666 /var/tftp/$file_name";

    $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'); #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;
}

__END__
 

то всё нормально!

Три характерные строчки в логах свитча (подключение, слив, отключение) и конфиг в нормальном виде

Это сообщение отредактировал(а) trinitr0 - 8.4.2016, 16:59
PM MAIL Jabber   Вверх
_zorn_
Дата 15.4.2016, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(trinitr0 @  8.4.2016,  23:58 Найти цитируемый пост)
В perl я конечно не специалист, иначе таие кривые скрипты бы не писал

А чем "принципиальность" перла ? Может все же использовать тот язык который лучше знаете ?
PM MAIL   Вверх
trinitr0
Дата 18.4.2016, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Из всех скриптовых языков Perl мне ближе всего (bash не в счёт). А для такого круга задач скритовые языки наиболее подходящие. 
PM MAIL Jabber   Вверх
trinitr0
Дата 20.4.2016, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проблема была с лишним chomp,
в этом куске:

Код

while(<IF>)
    {
        #chomp;
        s/create account admin sa//g;
        s/11388019//g;
        print OF $_;
    }

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


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

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


 




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


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

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