Jump to content

Recommended Posts

Posted

Подскажите есть ли софт позволяющий отмониторить разрыв STP кольца? Что-нибудь а-ля нагиос, или в идеальном случае плагин к нему... :-)

Posted

Ну я ж попросил, дай конкретный пример.

Ну хоть, что-нибудь, что так работает, как ты описываешь.

Posted

Трапы - это не то!!! А если у меня конвертер к резервному линку подключен???? Линк упадет, а трап никогда не придет!

Posted

поставь конвертер в режим LFP,(ляжет оптика, ляжет и медь)

 

вообще в хороших коммутаторах мибы есть на тему стп, в них и стоит покопать на счёт сбора информации о состоянии

Posted

Мне кажется, проще собирать с кольца STP cost to root, если разница больше 20000 (дефолтный кост для 1Gb), то между этими коммутаторами обрыв

 

поставь конвертер в режим LFP,(ляжет оптика, ляжет и медь)

 

вообще в хороших коммутаторах мибы есть на тему стп, в них и стоит покопать на счёт сбора информации о состоянии

В Planet GT-702S разве такое есть???

Posted (edited)

Покопавшись денек с MIBами DES-3010G/DES-3526 и еще денек с perlом, получил скрипт, на выходе которого вот такая уродливая пока штука:-)

simple.png

simple.png

Могу описать логику постороения картинки если кому интересно?!

Edited by ilijaz
Posted (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 by Shturm_N
Posted (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 by Shturm_N
Posted (edited)

Для построения картинки simple.png мне потребовалось

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 by ilijaz
Posted

Год назад, эти свичи, хоть и было заявлено, не держали STP, SmokerMan, а мониторить нужно состояние порта, имхо так лучше.

  • 4 years later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.