allan_sundry Posted March 1, 2013 Доброе время суток! У меня есть скрипт который заходит telnet'ом на коммутаторы Linksys SPS224G4 и отправляет копию конфигурации на tftp сервер. В последнее время было замечено что ряд коммутаторов перестал отдавать конфиг... При попытке ручного копирования наткнулся на такую ошибку: switch# copy startup-config tftp://XXX.XXX.XXX.XXX/20130301/switch 01-Mar-2013 17:30:25 %COPY-I-FILECPY: Files Copy - source URL flash://startup-config destination URL tftp://XXX.XXX.XXX.XXX/20130301/switch 01-Mar-2013 17:30:26 %TFTP-C-OPEN: No free UDP port Copy: Can't open TFTP client 01-Mar-2013 17:30:26 %COPY-W-TRAP: The copy operation has failed switch# При этом с части коммутаторов снялось уже около 200 копий, а некоторые перестали отдавать копии после 80 раз... Как можно "полечить" без перезагрузки коммутатора?! Share this post Link to post Share on other sites More sharing options...
t1bur1an Posted March 2, 2013 Интересная проблема. не сталкивался. Но вот что думаю, надо бы отходить от самописных скриптов и юзать что нибудь на подобии noc project. Share this post Link to post Share on other sites More sharing options...
allan_sundry Posted March 2, 2013 (edited) Интересная проблема. не сталкивался. Но вот что думаю, надо бы отходить от самописных скриптов и юзать что нибудь на подобии noc project. Реклама?! о_О ?! И что же магического в "noc project"? Он умеет работать абсолютно со всеми коммутаторами и роутерами? Мой "перловый" скрипт заходит по telnet, запускает команду copy tftp, а после пишет exit - по сути эмуляция ручного копирования конфига... что может быть проще? C Zyxel проще слить конфиг со встроенного tfp-сервера, а вот с Linksys альтернатив по-моему нет Edited March 2, 2013 by allan_sundry Share this post Link to post Share on other sites More sharing options...
t1bur1an Posted March 3, 2013 Да, можете просмотреть мою историю сообщений и увидете что в каждой теме советую этот проект )) Вообще его фишка в том что он парсит сам конфиг с коммутатора командой show running-config не используя тфтп. А проблему которую вы описали случается не только у линксисов. Какая у вас стоит версия прошивки на коммутаторах которые зависают подобным образом? Пробовали обновлять? Share this post Link to post Share on other sites More sharing options...
allan_sundry Posted March 3, 2013 Да, можете просмотреть мою историю сообщений и увидете что в каждой теме советую этот проект )) Вообще его фишка в том что он парсит сам конфиг с коммутатора командой show running-config не используя тфтп. А проблему которую вы описали случается не только у линксисов. Какая у вас стоит версия прошивки на коммутаторах которые зависают подобным образом? Пробовали обновлять? И как же реализовано копирование конфигурации в этом проекте? (интересно посмотреть на кусок кода отвечающий за это) Проблема не коррелирует с версией прошивки, официально 1.0.2 последняя... Share this post Link to post Share on other sites More sharing options...
azhur Posted March 3, 2013 И как же реализовано копирование конфигурации в этом проекте? Так как у встроенного в NOC сервера tftp поддержку WRQ так и не реализовали (хоть и просили), то скачать конфиг с коммутатора по tftp не получится. То есть так не сработает copy startup-config tftp://XXX.XXX.XXX.XXX/20130301/switch А вот дописать конфиг можно, если железка поддерживает: copy tftp://XXX.XXX.XXX.XXX/20130301/switch running-config Поэтому типичный вариант получения конфига - коннект по telnet|ssh, далее "show running-config" или её аналог, анализ и сохранение результата. Ввод логина-пароля, enable и прочее подобное - автоматизировано средствами самого NOC. Подробности реализации на совести автора скриптов поддержки конкретной железки. Вот пример для Cisco IOS из сорцев: http://code.nocproject.org/browse/noc/sa/profiles/Cisco/IOS/__init__.py?hb=true - общие переменные и функции профиля http://code.nocproject.org/browse/noc/sa/profiles/Cisco/IOS/get_config.py?hb=true - собственно скрипт получения конфига ЗЫ Возможен и вариант для веб-смартов - запрос и анализ страниц веб-интерфейса, но реализовано ли такое на практике для каких-то железок - я не знаю. Share this post Link to post Share on other sites More sharing options...
Butch3r Posted March 3, 2013 А почему это не делать через SNMP? Просто как это сделано в ноке - зайти, написать show run и сохранить его содержимое - уж больно коряво Share this post Link to post Share on other sites More sharing options...
azhur Posted March 3, 2013 А почему это не делать через SNMP? Что делать по SNMP? Или есть свитчи которые умеют по SNMP конфиг отдавать целиком? И много таких? Просто как это сделано в ноке - зайти, написать show run и сохранить его содержимое - уж больно коряво Не понимаю в чём корявость. Объясни, пожалуйста. Плюс - очень универсально. Share this post Link to post Share on other sites More sharing options...
Butch3r Posted March 3, 2013 Что делать по SNMP? Или есть свитчи которые умеют по SNMP конфиг отдавать целиком? тоже самое: copy startup-config tftp://XXX.XXX.XXX.XXX/20130301/switch Share this post Link to post Share on other sites More sharing options...
azhur Posted March 3, 2013 тоже самое: copy startup-config tftp://XXX.XXX.XXX.XXX/20130301/switch Дак не умеет NOC принимать файлы конфигов по tftp, о чём я писал уже! А если складывать на сторонний tftp-сервер - то понадобятся костыли, чтобы полученный файл конфига в систему контроля версий NOC-а засунуть. А если эту систему не использовать - то NOC не очень-то и нужен. Share this post Link to post Share on other sites More sharing options...
allan_sundry Posted March 3, 2013 хм... можно конечно попробовать реализовать на perl сохранение конфига без tftp... не думаю что это будет очень сложно Share this post Link to post Share on other sites More sharing options...
allan_sundry Posted March 5, 2013 Проблема решилась изменением подхода - скрипт теперь не использует tftp: foreach (@linksys_sps){ my $file = sprintf($folder."/".$_); print ("Create file ",$file,"\n"); system "touch $file"; my $string = sprintf($_."#"); print ("Prompt String is ",$string,"\n"); print ("Connecting to ",$_,"\n"); my $telnet = new Net::Telnet ( Timeout=>20, Errmode=>'return' ); $telnet->open($_); if ($telnet->errmsg){ print "Can't connect to " . $_ . " Error: " . $telnet->errmsg . "\n"; } else { $telnet->waitfor('/User Name:$/i'); $telnet->print('admin'); $telnet->waitfor('/Password:$/i'); $telnet->print('password'); $telnet->waitfor(String => $string ); print ("Set Backup Terminal Variable ",$_,"\n"); $telnet->print("terminal datadump"); $telnet->waitfor(String => $string ); print ("Read configuration ",$_,"\n"); $telnet->print('sh run'); my @config = $telnet->waitfor(String => $string ); print ("Write configuration ",$_," to file ",$file,"\n"); open my $fh, '>', $file or die "Cannot open file: $!"; foreach my $config (@config) { print $fh "$config\n"; } close $fh; print ("Set Default Terminal Variable ",$_,"\n"); $telnet->print('no terminal datadump'); $telnet->waitfor(String => $string ); $telnet->print('exit'); } } P.S. возможно кому-то этот код поможет сохранить время и нервы ;) Share this post Link to post Share on other sites More sharing options...