MixX DeDrug Posted October 13, 2012 Сабж, как это делается впринципе... Извиняюсь за, может быть для кого-то, глупые вопросы... Допустим, нужно отрубить порт "N" на сотне свитчей сразу... как? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
pppoetest Posted October 13, 2012 perl + fork Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alanw Posted October 13, 2012 Cмотря что умеют свичи : snmp + scripting language. telnet + python (import telnetlib) Удачи :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
MixX DeDrug Posted October 13, 2012 Свитчи des-3200, snmp естественно умеют... Где почитать можно о подобных скриптах? Ну и примерчик неплохо бы для наглядности... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Negator Posted October 13, 2012 forum.dlink.ru Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Butch3r Posted October 13, 2012 А может кто поделится? А то что-то всё руки никак не доходят писать :( Хотя бы скрипт массового обновления прошивки на Dlink'ах Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
MixX DeDrug Posted October 13, 2012 Вот-вот, конкретно никто делиться не хочет... На длинке суппорт воще отмороженный... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
pppoetest Posted October 13, 2012 (edited) А че там делиться, скрипт от силы строк на десять. Edited October 13, 2012 by pppoetest Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Megas Posted October 13, 2012 простите почему отмороженный? тут на форуме неоднократно приводились скрипты апдейта. при чем апдейт должен выполнятся плавно или потеряете контроль если у вас звезда. в случае отруба конфига это 3 строки на expect и bash. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
pppoetest Posted October 13, 2012 (edited) На длинке суппорт воще отмороженный... Хмм, какое отношение саппорт блинка имеет к тарелочке с голубой каёмочкой, которую вы тут так желаете? Edited October 13, 2012 by pppoetest Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Butch3r Posted October 13, 2012 простите почему отмороженный? тут на форуме неоднократно приводились скрипты апдейта. при чем апдейт должен выполнятся плавно или потеряете контроль если у вас звезда. в случае отруба конфига это 3 строки на expect и bash. ткните плз, не могу найти поиском Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
pppoetest Posted October 13, 2012 простите почему отмороженный? Видимо потому что не дал скрипт массовой прошивки Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
mcdemon Posted October 13, 2012 ну дайте уже скрипт в конце то концов) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted October 13, 2012 (edited) #!/usr/bin/perl use Net::Telnet (); require("dbaccess.pm"); $SQL = "SELECT base_switches.ip FROM base_switches WHERE access_mode = 1 AND model_id IN (2) AND active = 1 ORDER BY id"; $sth = $dbh->prepare($SQL) or die(); $sth->execute or die(); while(@row=$sth->fetchrow_array) { $t = new Net::Telnet (Timeout => 200, Prompt => '/\:\w+#|\>/', Errmode => 'return'); print "\nSwitch: " . @row[0] . "\n"; $t->open(@row[0]); $t->login("admin", "PASSWORD"); print "Login OK\n"; unless ($child = fork) { print "Downloading firmware [$ip]\n"; $t->cmd(String => "download firmware_fromTFTP 91.206.16.8 DES-3526/DES3526R6_6.20.B12.had image_id 1",Timeout => 500); $t->cmd(String => "reboot force_agree",Timeout => 5); exit; } print "Commands OK\n"; } Edited October 13, 2012 by disappointed Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
mcdemon Posted October 13, 2012 я в скриптах не силен, времени особо нет на это :( ну я так понял это нужно на линуксе выполнять? или на windows тоже можно? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
pppoetest Posted October 13, 2012 я в скриптах не силен, времени особо нет на это :( А в семнадцатой строке какой пароль указывать? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Saab95 Posted October 13, 2012 Зачем вам скрипты, когда для винды есть plink =) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
mcdemon Posted October 14, 2012 вообще как я понял скрипт берет коммутаторы из mysql а есть еще каконибуть другой вариант скрипта? списка коммутаторов нет в мускуле может быть можно как-то указать просто подсеть и скрипт по порядку на все айпишники подсети будет выполняться Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Butch3r Posted October 14, 2012 Я почему-то думал что это нужно делать через snmp Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted October 14, 2012 (edited) #!/usr/bin/perl use Net::Telnet (); use Net::IP; $net = "10.0.0.0/24"; $login = "admin"; $password = "switch_password"; $tftp_server = "10.0.254.254"; $pool = new Net::IP($net) || die; do { $t = new Net::Telnet (Timeout => 10, Prompt => '/\:\w+#|\>/', Errmode => 'return'); print "\nSwitch: " . $pool->ip() . "\n"; $t->open($pool->ip()); $t->login($login, $password); print "Login OK\n"; unless ($child = fork) { print "Downloading firmware: " . $pool->ip() . "\n"; $t->cmd(String => "download firmware_fromTFTP $tftp_server DES-3526/DES3526R6_6.20.B12.had image_id 1",Timeout => 500); $t->cmd(String => "reboot force_agree",Timeout => 5); exit; } print "Commands OK\n"; } while (++$pool); Edited October 14, 2012 by disappointed Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Negator Posted October 14, 2012 через SNMP быстрее получается. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
mcdemon Posted October 14, 2012 спасибо за скрипт, опробую через пару неделек а SNMP я не использую кроме как для снятия графиков, вообще протокол мне этот не нравится... сложный какой-то и мудреный слишком нет времени разбираться (мибы там какие-то всякие итд) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
pppoetest Posted October 14, 2012 Тьху, ну совсем уже толсто Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sexst Posted October 14, 2012 (edited) Чтобы одновременно обновить целую нитку длинков (звезду, луч, кольцо) достаточно сначала залить на все свитчи прошивку, а потом одновременно всем скормить сначала "cable diag ports all" и сразу "reboot". Я обычно прямо так строчкой и отправляю, разделив "\n". Получается что сначала каждый свитч начнет выполнять достаточно затратную по времени команду дав пару секунд чтобы скормить ребут всем интересующим свитчам. Оcобенно удобно в питоне с его многопоточностью. #!/usr/bin/python # -*- coding: utf-8 -*- import MySQLdb from telnetlib import Telnet from multiprocessing import Process, Queue, current_process def worker(tasks): for ip in iter(tasks.get, 'halt'): print ip #Телнетимся к свитчу tn=Telnet(ip,23,5) tn.write("login\n") tn.write("password\n") tn.write("\ncable_diag ports all\n reboot\ny\n") queue=Queue() num_threads=200 MyDB = MySQLdb.Connect(user="root", passwd="", host="localhost", db="sappor") cursor = MyDB.cursor() cursor.execute("select ip from sw where BLA_BLA_BLA") resultset = cursor.fetchall() for row in resultset: queue.put(row[0]) cursor.close() for i in xrange(num_threads): Process(target=worker, args=(queue,)).start() queue.put('halt') Edited October 15, 2012 by sexst Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Andrei Posted October 15, 2012 Вот такой еще пробегал как-то на форуме: use Net::Telnet;my $telnet = new Net::Telnet( Timeout=>60, Prompt => '/(DES|DGS)-/'); $telnet->open($host); $telnet->login($user,$pass); $telnet->cmd('download firmware_fromTFTP $tftp_server_ip $firmware_fname image_id 1'); $telnet->cmd('config firmware image_id 1 boot_up'); $telnet->cmd('save'); $telnet->cmd('reboot force_agree'); $telnet->close(); Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...