Files
2024-10-14 00:08:40 +02:00

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>;
}