В нашей сети собираются трапы 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;
}
}
Добрый день , а не могли б вы более подробно расписать , это как вы реализовали желательно с примерами
ОтветитьУдалитьВ нашей сети собираются трапы mac notification(это собственно отдельная тема). Смысл в том, что при появлении мака на порту свич посылает трап о том, что на его порту появился/удалился мак. В свою очередь snmptrapd запускает скрипт, который парсит этот трап и помещает в БД информацию что на свиче на порту 10 есть мак 0101.0202.0303.
К сожалению примеров не будет(работаю в друго месте), но процесс опишу:
ОтветитьУдалитьУ нас большинство свитчей поддерживало отправку snmp trap при появлении mac адреса на порту. trap отсылался на snmp сервер. Эти трапы обрабатывались скриптом, выбирая из него информацию о порте, ip свича, ну и собвственно сам мак. Этот скрипт сваливал все это в заранее собранную БД. Скрипт из примера выше брал ip свича и порт из БД, лез по telnet на свитч и отдвал информацию на web вот и все.