Поиск по этому блогу

суббота, 5 марта 2011 г.

Средство первичной диагностики для First line support

В нашей сети почти все оборудование доступа пока - Dlink 3028. Каждый раз поддержка на нас перекидывала на нас заявки о том что нет линка и т.п., что очень бесило. Решил немного упростить нам, админам жизнь.
В нашей сети собираются трапы mac notification(это собственно отдельная тема). Смысл в том, что при появлении мака на порту свич посылает трап о том, что на его порту появился/удалился мак. В свою очередь snmptrapd запускает скрипт, который парсит этот трап и помещает в БД информацию что на свиче на порту 10 есть мак 0101.0202.0303. Скрипт просто берет селект из БД и ходит на свич и выполняет определенные команды, которые определены в скрипте. Этот скрипт я поместил в папку apache cgi-bin, например если набрать в адресной строке
http://server.sxample.com/cgi-bin/cabdiag.pl?00:18:f3:9f:14:03, то получим следуюущее:




Command: show fdb port 7

VID  VLAN Name                        MAC Address       Port Type  

---- -------------------------------- ----------------- ---- ---------------

643  Users                            00-18-F3-9F-14-03  7   DeleteOnTimeout

Total Entries  : 1

DES-3028:4
Command: cable_diag ports 7

 Perform Cable Diagnostics ...

 Port   Type      Link Status          Test Result          Cable Length (M)

 ----  -------  --------------  -------------------------  -----------------

  7      FE        Link Up       OK                                73

DES-3028:4
Command: show error ports 7

 Port Number : 7      

                 RX Frames                                  TX Frames

                 ---------                                  ---------

 CRC Error       661                  Excessive Deferral    0        

 Undersize       0                    CRC Error             0        

 Oversize        0                    Late Collision        0        

 Fragment        23027                Excessive Collision   0        

 Jabber          0                    Single Collision      0        

 Drop Pkts       0                    Collision             0        

 Port Number : 7      

 

DES-3028:4

172.22.29.197:7


параметр - mac. 
Поддержка сразу видит первичную диагностику свич, порт и результат выполнения скриптов, определенных в скрипте и перекидывает ticket не на нас, если проблема сразу видна.
Вот код скрипта:


#!/usr/local/bin/perl
#Solodovnikov Timur

use DBI;
use Net::Telnet;
use CGI qw/:standard/;

my $ora_host = "dbhost";
my $ora_user = 'dbuser@dbhost';
my $ora_passwd = "dbpassword";
my $ora_sid = "orasid";
my $port='33444'; 
my $SWITCH_PORT_ID;
my $SWITCH_ID;
my $PORT;
my $mac;
my $ip;
my $t;
#possible logins in switchs
my @user = ('admin','admin');
my @password = ('password', 'password2');
my $key = 0;


&prepare;
 
&bindsw("sh ports $PORT \n q");
&bindsw("sh err ports $PORT \n q");
&bindsw("cable_diag ports $PORT \n q");
&bindsw("show fdb port $PORT \n q");
print @lines,"\n";
print "$ip:$PORT \n";




sub bindsw{

$t = new Net::Telnet (Timeout => 20,
                  Prompt => '/#/',
                  Host => "$ip" );
                                  
                 $t->login($user, $password);

push @lines, $t->cmd("@_");

$t->cmd("logout");

}


 sub prepare {
 #
 die "Mac-address is not defined \n "if not defined $ARGV[0];
 $mac = (param('mac'));
 $mac =~ s/[\.\:\-]//g;
 $mac = lc ($mac);


&database_connect;

$sth = $dbh->prepare('select b.SWITCH_PORT_ID from switch_port p, SWITCH_PORT$MA
C_BINDING b, SWITCH s where p.switch_id = s.id and b.switch_port_id = p.id and m
ac = ?');
$sth->execute($mac);
$j=0;
#
while (my @row = $sth->fetchrow_array) {
        $SWITCH_PORT_ID = $row[0];
        $j++;
}
$sth = $dbh->prepare('select SWITCH_ID, PORT from switch_port where id = ?');
$sth->execute($SWITCH_PORT_ID);

while (my @row = $sth->fetchrow_array) {
        ($SWITCH_ID,$PORT) = @row;
        $j++;
        $PORT =~ s/0\///g;
}

$sth = $dbh->prepare('select number_to_ip(ipaddr) from switch where id = ?');
$sth->execute($SWITCH_ID);

while (my @row = $sth->fetchrow_array) {
        ($ip) = @row;
        $j++;
}
for ($key=0; $key<6;$key++)
{
$user = $user[$key];
$password = $password[$key];


$t = new Net::Telnet (Timeout => 20,
                  Prompt => '/#/',
                  Host => "$ip" );
                                  
                 eval {$t->login($user, $password)} && last;

}
        


&database_disconnect;


}


sub database_connect {

    $dbh = DBI->connect("dbi:Proxy:hostname=$ora_host;port=$port;dsn=dbi:Oracle:
", $ora_user, $ora_passwd,
         { AutoCommit => 0, RaiseError => 1, PrintError => 0 }) ||
           die Log("Connect: ".$DBI::errstr);
     
}

sub database_disconnect {
   if ($dbh) {
      $dbh->disconnect;
   }
}



2 комментария:

  1. Добрый день , а не могли б вы более подробно расписать , это как вы реализовали желательно с примерами
    В нашей сети собираются трапы mac notification(это собственно отдельная тема). Смысл в том, что при появлении мака на порту свич посылает трап о том, что на его порту появился/удалился мак. В свою очередь snmptrapd запускает скрипт, который парсит этот трап и помещает в БД информацию что на свиче на порту 10 есть мак 0101.0202.0303.

    ОтветитьУдалить
  2. К сожалению примеров не будет(работаю в друго месте), но процесс опишу:

    У нас большинство свитчей поддерживало отправку snmp trap при появлении mac адреса на порту. trap отсылался на snmp сервер. Эти трапы обрабатывались скриптом, выбирая из него информацию о порте, ip свича, ну и собвственно сам мак. Этот скрипт сваливал все это в заранее собранную БД. Скрипт из примера выше брал ip свича и порт из БД, лез по telnet на свитч и отдвал информацию на web вот и все.

    ОтветитьУдалить