#! /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, beendet: "; my $ip=; 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. f�r weiter!\n"; ; next; } print "$ip zu $a aufgel�st\n\n"; $ip = $a; } ##### Konfig der Switches lesen open SWITCHES, ") { chomp; next unless ($_ =~ /^[0-9]/); @switches=(@switches, $_); } close SWITCHES; ##### Konfig der Router lesen open 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�ge eines Routers lesen @onerouter = `snmpwalk -mall -c public $router .1.3.6.1.2.1.4.22.1.2`; ##### Alle ARP Eintr�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�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 " f�r weiter!"; ; }