195 lines
4.7 KiB
Perl
195 lines
4.7 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;
|
|
|
|
my $community="con";
|
|
|
|
|
|
while (1) {
|
|
|
|
my @switches=();
|
|
my @routers=();
|
|
my @cutoffs=();
|
|
|
|
##### 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ö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;
|
|
|
|
|
|
##### Auszublendende Switch/Port einlesen
|
|
open CUTOFF, "<cutoff.conf";
|
|
while (<CUTOFF>) {
|
|
chomp;
|
|
next unless ($_ =~ /^[0-9]/);
|
|
@cutoffs=(@cutoffs, $_);
|
|
}
|
|
close CUTOFF;
|
|
|
|
##### 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 $community $router .1.3.6.1.2.1.4.22.1`;
|
|
##### Alle ARP Einträge zusammenfassen
|
|
my @oneroutermac;
|
|
foreach (@onerouter) {
|
|
if ($_=~/[0-9a-f]{2} [0-9a-f]{2} [0-9a-f]{2} [0-9a-f]{2} [0-9a-f]{2} [0-9a-f]{2}/i) {
|
|
push @oneroutermac, $_;
|
|
}
|
|
}
|
|
@array = (@array, @oneroutermac);
|
|
}
|
|
|
|
|
|
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);
|
|
last;
|
|
}
|
|
}
|
|
|
|
|
|
##### 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) {
|
|
#print "\n";
|
|
savepos();
|
|
print "Durchsuche Switch $switch";
|
|
my $ergebnis = `snmpwalk -mall -c $community "$switch" "$oid"`; # Suche MAC auf akt Switch
|
|
#print "$ergebnis\n";
|
|
my $tmp;
|
|
my $mac2="";
|
|
($tmp,$mac2) = split /: /,$ergebnis;
|
|
chomp $mac2;
|
|
#print "$gesmac|$mac2|\n";
|
|
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 $community "$switch" "$oid2"`;
|
|
my ($tmp,$intindex) = split /=/,$intind;
|
|
chomp $intindex;
|
|
$intindex =~ s/ //,$intindex;
|
|
|
|
#print "\n";
|
|
loadpos;
|
|
#print "MAC-Adresse auf Switch $switch gefunden\n";
|
|
my $oid3=".1.3.6.1.2.1.2.2.1.2.$intindex";
|
|
#print "$oid3";
|
|
#print "snmpwalk -mall -c $community $switch $oid3\n";
|
|
my $intname=`snmpwalk -mall -c $community "$switch" "$oid3"`;
|
|
#print "$intname\n";
|
|
my ($tmp,$intnam) = split /=/,$intname;
|
|
$intnam =~ s/"//,$intnam;
|
|
$intnam =~ s/ //,$intnam;
|
|
$intnam =~ s/"//,$intnam;
|
|
chomp $intnam;
|
|
|
|
#print "INTNAME:$intnam;";
|
|
|
|
unless ($intnam =~ /Trk/ or $intnam =~ /Mesh/ or $intnam =~ /net/ or length($intnam)==0) {
|
|
my $cutoffmarker=0;
|
|
|
|
foreach my $cutoff (@cutoffs) {
|
|
if ($cutoff eq "$switch,$intnam") {
|
|
$cutoffmarker=1;
|
|
}
|
|
}
|
|
unless ($cutoffmarker == 1) {
|
|
print "MAC-Adresse auf Switch $switch gefunden\n";
|
|
print "Port gefunden: $intnam\n\n" ;
|
|
savepos;
|
|
}
|
|
}
|
|
}
|
|
loadpos();
|
|
#print "\e[1A";
|
|
clline();
|
|
}
|
|
print "<Enter> für weiter!";
|
|
<STDIN>;
|
|
}
|