Obtenir le hostname d'un serveur Linux sous DOS
Tout d'abord bonjour à tous et merci de prêter attention à mon post.
Je débute en perl et j'ai un petit soucis pour la mise en oeuvre d'un script que l'on m'a demandé de faire pour mon projet de stage.
Je travaille sur un poste Windows2000, et la version finale du script doit être implémentée sur un serveur Windows 2000 Pro. Je dois rappatrier tous les noms des serveurs dans une base de donnée (pour l'instant je rappatrie seulement dans des fichiers pour les tests).
J'arrive sans problème à obtenir les noms des serveurs Windows via la commande NTBStat. (dans un autre script je fais la même chose pour les postes à IP dynamiques via des requêtes DHCP).
Cependant je n'arrive pas à obtenir les noms des serveurs tournant sous Linux (rien que le hostname me serait grandement utile). Je tiens à préciser que je ne peux pas intérroger les serveurs DNS aux vues de leur fréquence de mise à jour (on va être gentils, on va dire environ tous les 2 ans, et encore ...) et je n'y ai pas accès ... De plus la plupart des serveurs vont migrer sous Linux (sauf celui sur lequel les scripts tourneront) après mon départ (mi Juin) et donc mes scripts risquent de ne plus servir à grand chose ...
Voici où j'en suis dans mon code (pour vous aider à comprendre la logique de la démarche) :
Code:
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; |
J'ai tenté ceci :
Code:
1 2 3
|
use Socket;
my $hostname = gethostbyaddr($AdresseIP, af_inet); |
...mais en vain (ça ne me renvoit rien du tout, même pour les serveurs windows...)
Donc si vous avez des indications à me fournir, je suis preneur !
Encore merci de votre attention !