1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
#!perl
use Getopt::Std;
use File::Basename;
use Log::Log4perl qw(get_logger);
use Win32::ODBC;
use Net::Ping;
use LMSCorp::Utils::Config qw(ChargerFichierConfiguration);
#-------------------------------------------------------------------------------
# Variables globales
#-------------------------------------------------------------------------------
our $PRG_VERSION = "2.0";
our $PRG_DATE = "04/2006";
our $PRG_DESCRIPTIF = "Recuperation des noms des serveurs";
(our $PRG_NOM, undef, undef) = fileparse($0, '\..*');
our @adrIP; #tableau regroupant les adresses IP dont le ping a réussi
our %nomSERV; #hachage associant les noms des serveurs à leur adresse IP sous la forme "AdresseIP" =>["AdresseIP","Nom","AdresseMAC"]
our $IPnbr = 0;
our $PingTimeout = 0.05;
# Variable pour Log4Perl
our $Logger;
our $Log4PerlCfg = q (
log4perl.logger.LMSCorp = INFO, ScreenApp, FicLog
#log4perl.logger.LMSCorp = DEBUG, ScreenApp, FicLog
log4perl.appender.ScreenApp = Log::Log4perl::Appender::Screen
log4perl.appender.ScreenApp.stderr = 1
log4perl.appender.ScreenApp.layout = PatternLayout
log4perl.appender.ScreenApp.layout.ConversionPattern = %m%n
log4perl.appender.FicLog = Log::Log4perl::Appender::File
log4perl.appender.FicLog.filename = sub { Log4Perl_GetLogFile(); };
log4perl.appender.FicLog.layout = Log::Log4perl::Layout::SimpleLayout
);
# Fichier de configuration
our %Config;
#-------------------------------------------------------------------------------
# Renvoie le nom du fichier log pour Log4Perl
#-------------------------------------------------------------------------------
sub Log4Perl_GetLogFile() { return "$PRG_NOM.log"; }
sub getPING($) {
my $i = 1;
my ($SubNet) = @_[0];
$Logger->info("Traitement du sous-reseau : $SubNet");
#my %Resultat;
open(FIC, ">ping.txt");
while ($i<=254) {
$AdresseIP=($SubNet.$i);
my $Ping = Net::Ping->new("icmp", $PingTimeout);
print FIC "\n****************** Tentative de ping sur $AdresseIP ******************\n";
if ($Ping->ping($AdresseIP))
{
print FIC "$_";
$adrIP[$IPnbr]=$AdresseIP;
$Logger->info("Adresse IP $adrIP[$IPnbr] valide !");
$IPnbr++;
}
$i++;
}
close(FIC);
return(@adrIP);
}
sub getNOM($) {
open(FIC2, ">nbtstat.txt");
foreach $AdresseIP (@_)
{
my $OK=0;
print "\n****************** Interrogation de $AdresseIP ******************\n";
open(NBTSTAT, "NBTStat -a $AdresseIP|");
while(<NBTSTAT>)
{
next if ($OK==1);
if (/UNIQUE/)
{
$OK=1;
s/[ \s|<]+/:/g;
my @Split=split(/:/,$_);
$nomSERV{"$AdresseIP"} = ["$AdresseIP","$Split[1]"];
}
next if ($OK==1);
$nomSERV{"$AdresseIP"} = ["$AdresseIP","_NoName_"];
}
print FIC2 "Serveur $AdresseIP : ";
print FIC2 "$nomSERV{$AdresseIP}[1]\n";
close(NBSTAT);
}
close(FIC2);
return %nomSERV;
}
sub Syntaxe()
{
my $Syntaxe = <<__EOT__;
-------------------------------------------------------------------------------
$PRG_NOM v$PRG_VERSION - $PRG_DATE
$PRG_DESCRIPTIF
Parametres:
[-h] Cet ecran d'aide
-c Fichier de configuration
__EOT__
$Logger->error($Syntaxe);
exit 1;
}
#-------------------------------------------------------------------------------
# Gestion des parametres du script
#-------------------------------------------------------------------------------
my %LG_CMD;
getopts("hc:", \%LG_CMD);
# Initialisation du logging
Log::Log4perl::init(\$Log4PerlCfg);
$Logger = get_logger("LMSCorp");
Syntaxe() if (exists $LG_CMD{'h'});
Syntaxe() if (!exists $LG_CMD{'c'});
# Chargement du fichier de configuration
%Config = %{ChargerFichierConfiguration($LG_CMD{'c'})};
my @SubNet = ("192.168.1.","192.168.2.");
my @ref_adrIP = \@adrIP; #reference vers le tableau adrIP pour la recuperation du resultat de getPING
my %ref_nomSERV = \%nomSERV; #reference vers le hachage nomSERV pour la recuperation du resultat de getNOM
foreach $SubNet (@SubNet)
{#on passe le sous réseau et la référence en paramètres pour les pings et on récupère la liste des IP 'valides'
@ref_adrIP = &getPING($SubNet); }
%ref_nomSERV = &getNOM(@ref_adrIP);
my $NbElem = @adrIP;
print "\nLe tableau \@adrIP contient $NbElem elements\n";
foreach $cle (keys (%nomSERV))
{
print "$cle : @{ $nomSERV{$cle} }";
print "\n";
}
exit 0; |
Partager