SmokerMan Posted July 19, 2007 Posted July 19, 2007 Подскажите есть ли софт позволяющий отмониторить разрыв STP кольца? Что-нибудь а-ля нагиос, или в идеальном случае плагин к нему... :-) Вставить ник Quote
GateKeeper Posted July 19, 2007 Posted July 19, 2007 (edited) snmp-trap: link down? Edited July 19, 2007 by GateKeeper Вставить ник Quote
Kirya Posted July 19, 2007 Posted July 19, 2007 А с чего он link down-то при отключении избыточного линка ? Вставить ник Quote
GateKeeper Posted July 19, 2007 Posted July 19, 2007 А это, смотря с кого трап словить... Вставить ник Quote
GateKeeper Posted July 19, 2007 Posted July 19, 2007 (edited) Например с любого из, между которыми этот разрыв и произошёл. Вдогонку: ошибочка вышла: smtp-trap читать как snmp-trap. Edited July 19, 2007 by GateKeeper Вставить ник Quote
Kirya Posted July 19, 2007 Posted July 19, 2007 Ладно. Скажи plz как настроить Dlink 3526 чтоб он давал такой trap ? Вставить ник Quote
GateKeeper Posted July 19, 2007 Posted July 19, 2007 Только не будем о D-Link'ах отзываться, иначе, как о мыльницах, ладно? Ну, даже, если трап не бросает, snmpget'ом добивается. Вставить ник Quote
Kirya Posted July 19, 2007 Posted July 19, 2007 Ну я ж попросил, дай конкретный пример. Ну хоть, что-нибудь, что так работает, как ты описываешь. Вставить ник Quote
ilijaz Posted July 20, 2007 Posted July 20, 2007 Трапы - это не то!!! А если у меня конвертер к резервному линку подключен???? Линк упадет, а трап никогда не придет! Вставить ник Quote
ingress Posted July 20, 2007 Posted July 20, 2007 поставь конвертер в режим LFP,(ляжет оптика, ляжет и медь) вообще в хороших коммутаторах мибы есть на тему стп, в них и стоит покопать на счёт сбора информации о состоянии Вставить ник Quote
ilijaz Posted July 20, 2007 Posted July 20, 2007 Мне кажется, проще собирать с кольца STP cost to root, если разница больше 20000 (дефолтный кост для 1Gb), то между этими коммутаторами обрыв поставь конвертер в режим LFP,(ляжет оптика, ляжет и медь) вообще в хороших коммутаторах мибы есть на тему стп, в них и стоит покопать на счёт сбора информации о состоянии В Planet GT-702S разве такое есть??? Вставить ник Quote
SmokerMan Posted July 26, 2007 Author Posted July 26, 2007 И все, же, никто в нагиос такой мониторинг не встраивал?... Вставить ник Quote
ilijaz Posted July 26, 2007 Posted July 26, 2007 (edited) Покопавшись денек с MIBами DES-3010G/DES-3526 и еще денек с perlом, получил скрипт, на выходе которого вот такая уродливая пока штука:-) Могу описать логику постороения картинки если кому интересно?! Edited July 26, 2007 by ilijaz Вставить ник Quote
_J_ Posted July 26, 2007 Posted July 26, 2007 Былоб неплохо описАть логику и на скрипт посмотреть. Вставить ник Quote
Shturm_N Posted July 26, 2007 Posted July 26, 2007 (edited) Была задача мониторить Dlink Des-2108 и Des-2110. Для nagios писал такой скрипт: ############################################## ############################################## #!/usr/bin/perl $res = "OK"; $retval="0"; my @str = split '\n', `cat /usr/local/sbin/switches`; for ($s=0;$s<(scalar(@str));$s++) { chomp (@str[$s]); my @switch = split '\s+', @str[$s]; chomp (@switch[0]); for ($port=1;$port<(scalar(@switch));$port++) { $stat=`snmpwalk -v 1 -c public @switch[0] 1.3.6.1.2.1.17.2.15.1.3.$port| cut -f 4 -d' '`; chomp ($stat); if ($stat eq ''){$stat_t="down"} elsif ($stat eq "2"){$stat_t="block"} elsif ($stat eq "5"){$stat_t="forward"}; if (@switch[$port] eq "*" or @switch[$port] eq $stat_t) { # $retval="0"; # if ($stat eq ''){$res=$port." down";} # elsif ($stat eq "2"){$res=$port." block";} # elsif ($stat eq "5"){$res=$port." forward";} } else { if ($stat eq ''){if (@switch[$port] eq "down"){$res_1=$port." down, must be ".@switch[$port]."; ";}else{$res_1=$port." down, must be ".@switch[$port]."; ";}} elsif ($stat eq "2"){if (@switch[$port] eq "block"){$res_1=$port." block, must be ".@switch[$port]."; ";}else{$res_1=$port." block, must be ".@switch[$port]."; ";}} elsif ($stat eq "5"){if (@switch[$port] eq "forward"){$res_1=$port." (forward)\tmust be ".@switch[$port]."; ";}else{$res_1=$port." forward, must be ".@switch[$port]."; ";}} if (scalar(@fail)>0) {@fail[scalar(@fail)+1]="$res_1";} else {@fail[0]="$res_1";} } } #print $res; if (scalar(@fail)>0){$res = "CRITICAL: @fail"; $retval="2";}else {$res = "OK"; $retval="0"} $hostname=@switch[0]; chomp ($hostname); chomp ($retval); chomp ($res); print "$hostname\tswstp\t$retval\t$res\n"; `/bin/echo -e "$hostname\tswstp\t$retval\t$res\n" | /usr/bin/send_nsca -H 10.0.0.9 -c /etc/nagios/send_nsca.cfg`; #@fail=(); $res_1=""; $res=""; $#fail=-1; $#switch=-1; } ############################################## ############################################## Содержимое /usr/local/sbin/switches: ############################################## ############################################## sw-name1 forward * * block down down down down sw-jname2 forward forward forward block block block block block forward down sw-name3 forward forward forward block down down down block sw-name4 forward forward * * * down block block ############################################## ############################################## Т.е. имя_свитча состояние_порта_1 состояние_порта_2 ...... Количество портов не имеет значения. Каждая строка обрабатывается отдельно. Малость коряво но работает.... Проверяется состояние портов на соответствие заданному шаблону. Возвращает "Критикал" если есть отличия и "ОК" если все в порядке. Проверка каждые 10 минут. Запуск через крон и возврат состояния через nsca. Если в шаблоне попадается "*" - значит состояние порта не интересует. Как прикрутить к нагиосу думаю описывать ненадо. Edited July 26, 2007 by Shturm_N Вставить ник Quote
SmokerMan Posted July 26, 2007 Author Posted July 26, 2007 Расскажите если не трудно... Вставить ник Quote
Shturm_N Posted July 26, 2007 Posted July 26, 2007 (edited) Расскажите если не трудно...В checkcommands.cfg дописал: # 'swstp' command definition define command{ command_name swstp command_line /usr/local/sbin/swstp } В services.cfg define service{ use generic-service ; Name of service template to use hostgroup_name switch-stp service_description swstp is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 5 retry_check_interval 1 contact_groups support # !!!ПРОПИШИ СВОЮ!! active_checks_enabled 0 passive_checks_enabled 1 notification_interval 20 notification_period 24x7 notification_options c,r check_command swstp } В hostgroups.cfg: define hostgroup{ hostgroup_name switch-stp alias stp switch members sw-name1,sw-name2,sw-name3,............ } Сделано у меня через пасив чеки. Т е результат тестирования приходит самостоятельно без вызова скрипта нагиосом. Реализовано через nsca. Что такое и как работает nsca смотрим в документации прилагаемой к нагиосу, или гуглим. Можно реализовать и с вызовом чека самим нагиосом. Мне было удобнее через nsca. Edited July 26, 2007 by Shturm_N Вставить ник Quote
ilijaz Posted July 31, 2007 Posted July 31, 2007 (edited) Для построения картинки мне потребовалось 1. OID для DES-3010G/3526 в которых содержится 1) STP Cost To Root DES-3010G 1.3.6.1.2.1.17.2.6.0 DES-3526 1.3.6.1.4.1.171.12.15.2.3.1.14.0 2) STP Router ID 1.3.6.1.2.1.17.1.1.0 3) STP Root Port DES-3010G 1.3.6.1.2.1.17.2.7.0 DES-3526 1.3.6.1.4.1.171.12.15.2.3.1.18.0 4) STP Designated Bridge DES-3010G 1.3.6.1.2.1.17.2.15.1.8.* <- это таблица, вместо * нужно указать порт DES-3526 1.3.6.1.4.1.171.12.15.2.3.1.17.0 ВНИМАНИЕ!!! DES-3010G ниже прошивки 3.00.053 не верно возвращают STP Designated Bridge, OID для DES-3526 указаны для прошивок >=4.00.B19 2. Решил писать на perl, не ругайте за кривой стиль или неоптимальность, я только учусь;-) use DBI; use GraphViz; DBI нужен для селекта списка свичей, snmp community, его типа и местанахождения. Есть 3 таблицы: первая со списком L2 свичей, вторая со списком колец, третья со списком L3 роутеров. Соответственно у L2 свичей есть идентификатор кольца, у колец есть идентификатор L3 роутера. GraphViz соответственно нужен для рисования картинки 3. Для постороения STP дерева необходимо знать STP router id корня дерева, которым является l3 router. И Dlink 30/35, и AT-99** в OID 1.3.6.1.2.1.17.1.1.0 содержат STP router id. sub get_router_id #Параметры 1-ip, 2-snmp v2c community { $id = `snmpget -Ov -v2c -c $_[1] $_[0] 1.3.6.1.2.1.17.1.1.0`; $id = substr($id,12,17); chomp($id); $id =~ tr/ /:/; # print "Router id $id\n"; return $id; } l3_select - массив из базы, который содержит ip и snmp community $l3_ip=$l3_select[0]; $l3_community=$l3_select[1]; $l3_router_id =get_router_id($l3_ip,$l3_community); Далее заполняем массив нужными данными полученными по snmp и из базы type1 - это DES3010G, type2 соответственно DES3526 while($row = $sth->fetchrow_hashref()) { $ip = $row->{'l2_sw_ip'}; $community = $row->{'community'}; $sw_location = $row->{'location'}; $swtype = $row->{'sw_type_id'}; if($swtype == 1) { $root_port = `snmpget -Ov -v2c -c $community $ip $type1_oid_root_port`; $root_port = substr($root_port,9); chomp($root_port); $cost_to_root = `snmpget -Ov -v2c -c $community $ip $type1_oid_cost`; $design_router_id = `snmpget -Ov -v2c -c $community $ip $type1_oid_design_bridge$root_port`; $design_router_id = substr($design_router_id,18,17); $design_router_id =~ tr/ /:/; chomp($design_router_id); } else { $root_port = `snmpget -Ov -v2c -c $community $ip $type2_oid_root_port`; $root_port = substr($root_port,9); chomp($root_port); $cost_to_root = `snmpget -Ov -v2c -c $community $ip $type2_oid_cost`; $design_router_id = `snmpget -Ov -v2c -c $community $ip $type2_oid_design_bridge`; $design_router_id = substr($design_router_id,18,17); $design_router_id =~ tr/ /:/; chomp($design_router_id); } $router_id = get_router_id($ip, $community); $cost_to_root = substr($cost_to_root,9); chomp($cost_to_root); print "$ip $community $swtype $cost_to_root $router_id root_port=$root_port design_router=$design_router_id\n"; $array[$i][0] = $router_id; $array[$i][1] = $cost_to_root; $array[$i][2] = $design_router_id; $array[$i][3] = 'n'; $array[$i][4] = $ip; $array[$i][6] = $root_port; if ($swtype == 1 ) { $array[$i][5] = 'DES-3010G'; } else { $array[$i][5] = 'DES-3526'; } $i++; } Получив массив array, начинаем спускаться по дереву от корня, параллельно рисуя ноды и ребра $g = GraphViz->new(node => {shape => 'box' , fontname => 'arial' }, edge => {labeldistance => '2', fontsize => '15'}); $g->add_node($l3_ip); find_node($l3_ip, $l3_router_id); $g->as_png("simple.png"); print $l3_ip, $l3_community, $l3_router_id; sub find_node { my $count=0; my $bum=0; while($array[$count]) { if($array[$count][2] eq $_[1]) { $g->add_node($array[$count][4], label => "$array[$count][4]\n$array[$count][5]"); $g->add_edge($_[0] => $array[$count][4], label => $array[$count][1], headlabel => $array[$count][6]); $bum=1; print "find_node($array[$count][4],$array[$count][0])\n"; find_node($array[$count][4],$array[$count][0]); } $count++; } return $bum; } Единственное, c русскими шрифтами и GraphViz какие-то проблемы. Edited July 31, 2007 by ilijaz Вставить ник Quote
Zaqwr Posted August 1, 2007 Posted August 1, 2007 Год назад, эти свичи, хоть и было заявлено, не держали STP, SmokerMan, а мониторить нужно состояние порта, имхо так лучше. Вставить ник Quote
sergiusk Posted April 19, 2012 Posted April 19, 2012 я написал через snmp + lldp получаю в виде visio или pdf Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.