[Moscow.pm] Взрыв мозга или занимательная топология

Kaltashkin Eugene zhecka на gmail.com
Вс Ноя 25 14:20:15 PST 2007


Andrey пишет:
> Это будет гораздо обозримее, оторвано от oidов жуткого вида и ничего не 
> говорящих mac. Мы гарантированно построим структуру сети.
>   
текс. кажется первую стадию напрограммил, правда получилось ужасная схема.
залил в таблицу данные по свичам, по макам и по портам, оставив только 
рабочие свичи.
Теперь держитесь крепче, код не оптимизировал.

while(my($sw,$port,$macaddr)= $sth->fetchrow)
{
push @{ $result->{$sw}->{$port} },$swmac{$macaddr}; # положить в массив 
свича все IP адреса на нём видимые.
}

while (%{ $result })
{
  foreach my $sw (sort keys %{ $result })
  {
    foreach my $port (keys %{ $result->{$sw} })
      {
#        print $sw,":",$port,' size ',$#{ $result->{$sw}->{$port} }," 
data ",join ',',@{ $result->{$sw}->{$port} },"\n";
        if ( $#{ $result->{$sw}->{$port} } == 0)
            {
                my $host = $result->{$sw}->{$port}->[0];
                $path->{$sw}->{$port}->{$host} = 0;
                undef @{ $result->{$sw}->{$port} };
                delete $result->{$sw}->{$port};
#                print "Hurray, last position, Dropping $host\n";
                &drophost($host);
            }
        my $ttlcount = 0;
        foreach my $prt (keys %{ $result->{$sw} })
        {
          $ttlcount += scalar @{$result->{$sw}->{$prt}};
        }
#        print $ttlcount," ",$sw,"\n";
        if ( $ttlcount == 0)
            {
                undef %{$result->{$sw}};
                delete $result->{$sw};
            }
      }
  }

sub drophost
{
my $host = shift;
  foreach my $sw (sort keys %{ $result })
  {
    foreach my $port (keys %{ $result->{$sw} })
      {
        my @tmparr = ();
        foreach my $element (@{ $result->{$sw}->{$port} })
        {
        push(@tmparr,$element) if ($element ne $host);
        }
          @{ $result->{$sw}->{$port} } = @tmparr;
      }
  }
}

получил мапу начального уровня.

$VAR1 = {
          '10.6.204.28' => {
                             '25' => {
                                       '10.6.204.27' => 0
                                     }
                           },
          '10.6.204.27' => {
                             '25' => {
                                       '10.6.204.26' => 0
                                     },
                             '26' => {
                                       '10.6.204.28' => 0
                                     }
                           },
          '10.6.204.26' => {
                             '6' => {
                                      '10.6.204.31' => 0
                                    },
                             '7' => {
                                      '10.6.204.24' => 0
                                    },
                             '9' => {
                                      '10.6.204.23' => 0
                                    },
                             '12' => {
                                       '10.6.204.35' => 0
                                     },
                             '14' => {
                                       '10.6.204.25' => 0
                                     },
                             '8' => {
                                      '10.6.204.34' => 0
                                    },
                             '4' => {
                                      '10.6.204.21' => 0
                                    },
                             '18' => {
                                       '10.6.204.30' => 0
                                     },
                             '16' => {
                                       '10.6.204.32' => 0
                                     },
                             '13' => {
                                       '10.6.204.33' => 0
                                     },
                             '23' => {
                                       '10.6.204.29' => 0
                                     },
                             '5' => {
                                      '10.6.204.22' => 0
                                    }
                           }
        };

Всё вроде бы хорошо, но теперь нужно построить обратную связь, а с ней 
как раз и возникает проблема.
нижестоящие свичи ничего не знают о вышестоящем, ибо от него данные не 
пробегали.
Снова впал в ступор.
Как вариант взять ip устройства с которого идёт анализ, вычислить 
принадлежность свичу и трейсить от текущего свича подключенного
к устройству, но что-то останавливает.

ЗЫ: как оптимизировать вышестоящие запросы ?


Подробная информация о списке рассылки Moscow-pm