157 lines
4.0 KiB
Perl
157 lines
4.0 KiB
Perl
#! /bin/perl
|
||
# L<>uft nur unter Windows richtig
|
||
# HP9304
|
||
#.1 .3 .6 .1 .2 .1 .4 .22 .1 .1
|
||
#iso org dod internet mgmt mib-2 ip ipnettomediatable ipnettomediaentry ipnettomediaifindex
|
||
# .2
|
||
|
||
use Win32::Console::ANSI;
|
||
use Term::ANSIScreen qw/:color :cursor :screen/;
|
||
use Net::Nslookup;
|
||
|
||
use strict;
|
||
|
||
while (1) {
|
||
|
||
my @switches=();
|
||
my @routers=();
|
||
|
||
##### Gesuchte IP entgegennehmen
|
||
print "\e[2JGesuchte IP eingeben, <ENTER> beendet: ";
|
||
my $ip=<STDIN>;
|
||
chomp $ip;
|
||
|
||
if ($ip eq "") { exit; }
|
||
|
||
##### Gesuchte IP anpingen um auf jeden Fall einen ARP Eintrag zu erhalten
|
||
`ping -n 3 -w 1000 $ip`;
|
||
|
||
##### Falls IP keine IP sondern ein Hostname ist wird IP ermittelt
|
||
unless ($ip =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {
|
||
my $a = nslookup(host => "$ip");
|
||
print "Interpretiere $ip als hostname\n";
|
||
if ($a eq "") {
|
||
print "Host $ip nicht gefunden. <Enter> f<>r weiter!\n";
|
||
<STDIN>;
|
||
next;
|
||
}
|
||
print "$ip zu $a aufgel<65>st\n\n";
|
||
$ip = $a;
|
||
}
|
||
|
||
|
||
##### Konfig der Switches lesen
|
||
open SWITCHES, "<switches.conf";
|
||
while (<SWITCHES>) {
|
||
chomp;
|
||
next unless ($_ =~ /^[0-9]/);
|
||
@switches=(@switches, $_);
|
||
}
|
||
close SWITCHES;
|
||
|
||
|
||
##### Konfig der Router lesen
|
||
open ROUTERS, "<routers.conf";
|
||
while (<ROUTERS>) {
|
||
chomp;
|
||
next unless ($_ =~ /^[0-9]/);
|
||
@routers=(@routers, $_);
|
||
}
|
||
close ROUTERS;
|
||
|
||
##### Router durchsuchen um MAC zu IP zu finden
|
||
my @array;
|
||
##### Router einzeln durchlaufen
|
||
foreach my $router (@routers) {
|
||
my @onerouter;
|
||
##### ARP Eintr<74>ge eines Routers lesen
|
||
@onerouter = `snmpwalk -mall -c public $router .1.3.6.1.2.1.4.22.1.2`;
|
||
##### Alle ARP Eintr<74>ge zusammenfassen
|
||
@array = (@array, @onerouter);
|
||
}
|
||
|
||
|
||
my $ergebnis="";
|
||
my $intind="";
|
||
my $intname="";
|
||
my $mac="";
|
||
my $gesmac="";
|
||
my ($m1,$m2,$m3,$m4,$m5,$m6);
|
||
$m1=$m2=$m3=$m4=$m5=$m6=0;
|
||
|
||
##### Alle ARP Eintr<74>ge durchlaufen
|
||
foreach my $arrayline (@array) {
|
||
chomp $arrayline;
|
||
my ($tmp,$mac) = split /: /,$arrayline;
|
||
#print "$arrayline\n";
|
||
if ( $arrayline =~ /$ip /) {
|
||
$gesmac = $mac;
|
||
# print $arrayline;
|
||
##### ... und gesuchte MAC Adr. herausfiltern
|
||
print "Gesuchte MAC-Adresse: $gesmac\n";
|
||
($m1,$m2,$m3,$m4,$m5,$m6) = split / /,$gesmac;
|
||
$m1 = hex($m1);
|
||
$m2 = hex($m2);
|
||
$m3 = hex($m3);
|
||
$m4 = hex($m4);
|
||
$m5 = hex($m5);
|
||
$m6 = hex($m6);
|
||
}
|
||
}
|
||
|
||
|
||
##### MAC
|
||
my $oid=".1.3.6.1.2.1.17.4.3.1.1.$m1.$m2.$m3.$m4.$m5.$m6";
|
||
#print $oid;
|
||
|
||
# HP 4000
|
||
#.1.3.6.1.2.1.2.iftable(2).ifentry(1).ifphysaddr(6)
|
||
# .ifdescr(2)
|
||
#.1.3.6.1.2.1.17.4.3.1.1 MAC-Adressen
|
||
#.1.3.6.1.2.1.17.4.3.1.2 InterfaceIndex
|
||
#.1.3.6.1.2.1.2.2.1.2.InterfaceIndex => InterfaceName
|
||
#
|
||
|
||
print "\n";
|
||
|
||
foreach my $switch (@switches) {
|
||
savepos();
|
||
print "Durchsuche Switch $switch";
|
||
my $ergebnis = `snmpwalk -mall -c public "$switch" "$oid"`; # Suche MAC auf akt Switch
|
||
my $tmp;
|
||
my $mac2="";
|
||
($tmp,$mac2) = split /: /,$ergebnis;
|
||
chomp $mac2;
|
||
if ($gesmac eq $mac2) {
|
||
my $oid2=".1.3.6.1.2.1.17.4.3.1.2.$m1.$m2.$m3.$m4.$m5.$m6"; # Ermittle InterfaceIndex
|
||
my $intind=`snmpwalk -mall -c public "$switch" "$oid2"`;
|
||
my ($tmp,$intindex) = split /=/,$intind;
|
||
chomp $intindex;
|
||
$intindex =~ s/ //,$intindex;
|
||
|
||
if ($intindex < 200) { # Portnummer ist kleiner 200 heist auf HP4, HP5 kein Trunk!
|
||
loadpos;
|
||
|
||
my $oid3=".1.3.6.1.2.1.2.2.1.2.$intindex";
|
||
my $intname=`snmpwalk -mall -c public "$switch" "$oid3"`;
|
||
my ($tmp,$intnam) = split /=/,$intname;
|
||
$intnam =~ s/"//,$intnam;
|
||
$intnam =~ s/ //,$intnam;
|
||
$intnam =~ s/"//,$intnam;
|
||
if($intname !~ /mesh/i and $intname !~ /net/i and $intname !~ /trk/i) {
|
||
# ports die mesh, trk und net im Namen enthalten d<>rften keine Downlink Ports sein
|
||
print "MAC-Adresse auf Switch $switch gefunden\n";
|
||
print "Port gefunden: $intnam\n";
|
||
}
|
||
|
||
savepos;
|
||
}
|
||
|
||
}
|
||
loadpos();
|
||
clline();
|
||
}
|
||
print "<Enter> f<>r weiter!";
|
||
<STDIN>;
|
||
}
|