#!/usr/bin/perl -w ################################################################ # # Dieses Tool durchsucht die Switches nach MAC-Adressen # # ############## # Version 1.0 # ################################################################# ################################################################# # Module ################################################################# use Net::Ping; use DBI; use strict; ################################################################# # globale Variablen ################################################################# use vars qw($MIBPATH_MAC $MIBPATH_NUMBER_OF_PORT $COMMUNITY @SWITCHS $OUTPUTFILE); $MIBPATH_MAC = ".1.3.6.1.2.1.17.4.3.1.1"; $MIBPATH_NUMBER_OF_PORT =".1.3.6.1.2.1.17.4.3.1.2"; $COMMUNITY = "public"; #@SWITCHS = ("switch1b|1-24|n", # "switch2c|1-24|n", # "switch2f|1-24|n", # "switch2g|1-12|n", # "switch3a|1-24|switch3a;Unit1;0", # "switch3b|1-24|switch3a;Unit2;25", # "switch3c|1-24|switch3a;Unit3;49", # "switch3d|1-24|switch3a;Unit4;73", # "switch3e|1-48|n", # "switch3f|1-24|n", # "switch3g|1-12|n", # "switch3i|1-12|n", @SWITCHS = ("switch3l|1-12|n" ); $OUTPUTFILE="/data/pcfinder/MacToPort.dat"; ################################################################## # main ################################################################## for(my $i = 0; $i < scalar(@SWITCHS); $i++) { my @aszSwitch = split(/\|/,$SWITCHS[$i]); my $szSwitchName = $aszSwitch[0]; my $szPortsToScan = $aszSwitch[1]; my $szStack = $aszSwitch[2]; my $ping = Net::Ping->new("icmp",2); # Ueberpruefen, ob Switch verfuegbar ist if($ping->ping($szSwitchName)) { &get_mac($szSwitchName, $szPortsToScan, $szStack); } else { print "Switch: ".$szSwitchName." unavailable!\n"; } } ################################################################# # Liesst die Mac-Adressen aus den Switchs aus ################################################################# sub get_mac { my $szSwitchName = $_[0]; my @aszPortsToScan = split(/;/,$_[1]); my $szStackName = ""; my $nPortOffset = 0; if($_[2] ne "n") { my @aszStack = split(/;/,$_[2]); $szStackName = "$aszStack[0]-$aszStack[1]"; $nPortOffset = $aszStack[2]; } my @anPort; my @aszMAC; my @aszPID; my @aszMID; my @aszPortMac; my @splitLine; my @temp; my @anMinMaxPort; my $nIndex = 0; my $nPortPos = 0; my $nPortMacPos=0; my $szSplit; my $bScanPort = "false"; my $nPort; my $szLine; my @count_sw = `/usr/bin/snmpwalk -v 1 $szSwitchName -c $COMMUNITY $MIBPATH_NUMBER_OF_PORT`; my @snmpwalk_res = `/usr/bin/snmpwalk -v 1 $szSwitchName -c $COMMUNITY $MIBPATH_MAC`; foreach $szLine(@count_sw) { chomp($szLine); @splitLine = split(/=/, $szLine); @temp = split(/:/, $splitLine[1]); #$temp[1] =~ s/\s+$//g; #Leerzeichen am Ende entfernen #$temp[1] =~ s/^\s+//g; #Leerzeichen am Anfang entfernen $anPort[$nIndex] = $temp[1]; $szSplit = substr($MIBPATH_NUMBER_OF_PORT,12); @temp = split(/$szSplit/, $splitLine[0]); #$temp[1] =~ s/\s+$//g; #Leerzeichen am Ende entfernen #$temp[1] =~ s/^\s+//g; #Leerzeichen am Anfang entfernen $aszPID[$nIndex] = $temp[1]; $nIndex++; } $nIndex = 0; foreach $szLine(@snmpwalk_res) { chomp($szLine); @splitLine = split(/=/, $szLine); @temp = split(/:/, $splitLine[1]); $temp[1] =~ s/\s+$//g; #Leerzeichen am Ende entfernen $temp[1] =~ s/^\s+//g; #Leerzeichen am Anfang entfernen $temp[1] =~ tr/ /:/; $aszMAC[$nIndex] = $temp[1]; $szSplit = substr($MIBPATH_MAC,12); @temp = split(/$szSplit/, $splitLine[0]); #$temp[1] =~ s/\s+$//g; #Leerzeichen am Ende entfernen #$temp[1] =~ s/^\s+//g; #Leerzeichen am Anfang entfernen $aszMID[$nIndex] = $temp[1]; $nIndex++; } for($nPortPos=0; $nPortPos= $anMinMaxPort[0] && $nPort <= $anMinMaxPort[1])) { $bScanPort = "true"; last; } } if($bScanPort eq "true") { for($nIndex=0; $nIndex) { push(@aszData,$_); } close(INPUTFILE); for($nIndex=0; $nIndex$OUTPUTFILE") or die("Die Datei konnte nicht geoeffnet werden"); for(@aszData) { print OUTPUTFILE $_; } close(OUTPUTFILE); } ################################################################# # Rueckgabe des aktuellen Datums ################################################################# sub get_date{ (my $sec, my $min, my $hour, my $mday, my $mon, my $year, my $wday, my $yday, my $idst) = localtime(time); $year += 1900; $mon++; $wday = $yday = $idst = ""; my $found = sprintf("%4d-%02d-%02d %02d:%02d:%02d", $year, $mon, $mday, $hour, $min,$sec); return $found; }