[PERL]Réseaux

Stéphanie -  
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Salut,

j'aurai besoin d'aide concernant cet exo car j'ai du mal à comprendre comment il faut que je m'y prenne.
Si quelqu'un pouvait m'indiquer des pistes pour le démarrer ce serait sympa car je n'y arrive pas.

Merci par avance

Le but est de surveiller un certain nombre de services (en local ou en réseau) et de provoquer des actions en cas de d´efaillance d’un service.
Votre logiciel devra prendre en compte un fichier de configuration pour lequel vous utiliserez la syntaxe qui vous semblera la plus judicieuse ; une syntaxe vous est proposée, mais vous êtes libre de l’améliorer ou d’en changer complètement.
Le fichier de configuration devra permettre de configurer des paramétres généraux :Frequency(60) Surveillance toutes les 60 secondes
Mail.config(’mailetud’,’admin@foo.com’)Serveur et destinataire pour les courriels sortants
Database.config(’dbi:Pg:host=sqletud;dbname=maBaseAMoi’,’user’,’pass’)
Internet.ftpconfig(’serveur’,’user’,’pass’)

La configuration de votre moteur devra permettre de surveiller :
 • le système Linux sur lequel il est exécuté :
    System.disk(’hda3’,95) ou System.disk(’/home’,90) occupation disque
    System.process(’apache’) vérification de l’existence d’un processus
    System.cpuload(10) charge du processeur (faisable facilement ?)
 • des services réseau :
   Internet.ping(’192.168.0.10’) machine en vie ?
   Internet.tcp(’192.168.0.10’,’25’) port toujours ouvert ?
   Internet.url(’http://foo/bar’) existence d’une URL (idem en ftp)
   Internet.url(’http://foo/bar’,’/path/to/file’) contenu d’une page web
 • la base de données :
    Database.alive() base en fonctionnement ?
    Database.request(’select * from c where a>100’)
    teste la non existence de résultat ; erreur si des lignes sont renvoyées
   Voici les actions que le logiciel pourrait déclencher :
 • Action.mail(’sujet’,’texte’) envoi d’un courriel
 • Action.ftp(’/full/path/to/local/file’,’/pub/directory’) envoi d’un fichier
 • Action.database(’update c set a=10 where a>100’) commande SQL

Les combinaisons entre les tests et les actions se font ainsi : test => action. Par exemple :
Internet.ping(’192.168.0.10’) => Action.mail(’HS’,’Machine 192.168.0.10 HS’)
System.disk(’/home’,99) => Action.ftp(’/home/user/plein.html’,’/var/www/’)
Votre logiciel devra fonctionner en tâche de fond et déclencher les tests demandés à la fréquence demandée. Il effectura les actions demandées le cas échéant. Il écrira un journal de son activité (log)
sous la forme d’un fichier texte indiquant les tests faits et les actions entreprises.

56 réponses

lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Si tu fait ce que j'ai dit ici perl reseaux#15
l'ip qui est dans le fichier de configuration sera affiché sur STDOUT (l'écran)

lami20j
0
Sthéphanie
 
Le message apparait toujours
0
Stéphanie
 
Je te mets ce qui est dans STDOUT
~/perl$ ./daemon.pl
stephanie@ubuntu:~/perl$ Use of uninitialized value in concatenation (.) or string at ./daemon.pl line 77, <CONFIG> line 10.
192.168.1.2
Use of uninitialized value in concatenation (.) or string at ./daemon.pl line 77, <CONFIG> line 10.
192.168.1.2
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
affiche le résultat de cette commande
tail -1 mon_daemon.conf | perl -ne 'print length,"\n"'
lami20j
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Stéphanie
 
~/perl$ tail -1 mon_daemon.conf | perl -ne 'print length,"\n"'
23
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Tu utilises quel version de Perl?
Tu es sur quel Ubuntu?

Chez moi sous debian avec perl 5.8.4 ça fonctionne sans problème

Je vais voir demain sur ubuntu

En ce qui concerne le reste des tests, tu ne t'en sors pas?
En ce qui concerne Perl, sur une echelle de 0 à 20 tu es où? Tu n'est pas obligé de repondre.

lami20j
0
Stéphanie
 
Tu utilises quel version de Perl?
v5.8.7
Tu es sur quel Ubuntu?
Ubuntu Breezy
Chez moi sous debian avec perl 5.8.4 ça fonctionne sans problème
Je vais voir demain sur ubuntu
En ce qui concerne le reste des tests, tu ne t'en sors pas?
En ce qui concerne Perl, sur une echelle de 0 à 20 tu es où? Tu n'est pas obligé de repondre.

A la fac ou je suis, on a des cours de perl en accélére et cet exo à faire dans la foulée.
Je comprends ce qui est table de hashage, référence, tableau ... mais pour ce qui est des modules et des expressions régulières, ça coince ...
C'est pour ça que j'ai du mal avec l'exo.
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

je viens de tester avec Perl 5.8.7 sous Cygwin et je n'ai pas des erreurs.

Je vois 2 solutions (une possible, la 2ème c'est une utopie

1ère - donc j'ai créer un rép /home/stephanie/perl et j'ai mis tes fichier dédans - chez moi ça fonctionne

Il faut que tu me dises (mais en détails) étape par étape ce que tu fait

2ème - tu me laisse me connecter chez toi par le biais d'un server ssh pour que je voie où est le problème

lami20j
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

J'ai la honte, je suis c** :-((

J'ai trouvé l'explication :-))))))))))))))))))))))))))))

Ce message n'est pas un erreur mais seulement un warnning qui nous dit qu'on a une variable qui reste undef au cours d'exécution du script

Use of uninitialized value in concatenation (.) or string at ./daemon.pl line 76, <CONFIG> line 10

Ce qui m'a induit en erreur c'est seulement la vérification de la variable $remotehost qui prend sa valeur depuis le fichier de configuration.

Mais ce n'est pas cette variable qui fait apparaître ce message d'avertissment mais la varible $remote
$remotehost = $1 if /remote\.ping\s*($ip)/i;
Jusqu'ici tout vas bien, $remotehost contiendra l'IP depuis le fichier de configuration

Et c'est ici que ça coince

La 1ère ligne dit
#Si tu arrive faire un ping alors $remote va contenir
  if ($ping->ping($remotehost)){

#cette valeur
     $remote = "$date $remotehost en vie";
  }
Comme je n'ai pas traité le cas ou le ping ne fonctionne pas, et comme dans ton cas 192.168.1.2 ,n'existe pas sur ton réseau, alors $remote reste indefini.

Et quand on essaie d'écrire avec
print DAEMON "$date daemon fonctionne\n$local\n$remote\n"; 
On a le message d'avertissement Use of uninitialized value in concatenation (.) or string...................

Pourtant je t'ai posé la question dans mon message N°20 https://forums.commentcamarche.net/forum/affich-2453825-perl-reseaux#20

As-tu une adresse 192.168.1.2 sur ton réseau?
je n'ai pas écrit un message si la machine n'existe pas


Voilà maintenant ce que tu dois ajouter à ton code pour ne plus avoir ce message d'avertissement (la partie en gras)
  if ($ping->ping($remotehost)){
     $remote = "$date $remotehost en vie";
  } 
  else { # $remote contient une valeur si la condition du IF est fausse
     $remote = "$date $remotehost non connecté ou innexistant";
  }
Donc je traite le cas else

si le ping ne fonctionne pas alors $date $remotehost non connecté ou innexistant sera inscrit dans le journal

Les fichiers de ton message 14 https://www.commentcamarche.net/s/http-www-commentcamarche-net-forum-affich-2453825-perl-reseaux-14 sont ok.

En ce qui concernte l'arrêt avec kill

Quand tu fait ps aux | grep daemon.pl tu doit avoir un résultat de genre
root  7276  0.0  1.3  6776 3540 ?  Ss  08:25  0:00 /usr/bin/perl ./ddd.pl
tu dois faire kill 7276

lami20j

P.S. des fois il y a des petites choses devant nos yeux et on ne les voit pas :-(
Mais c'est bien quand on les decouvre :-)
Essaie de lire les messages attentivement et de me repondre ce que je te demande, pour eviter les casses tête.
Je parle de ma question As-tu une adresse 192.168.1.2 sur ton réseau?
Je n'ai pas resté toute la nuit pour trouver ça, mais je me suis couché en pensant à ça, et voilà que je me reveille avec l'explication :-))
0
Stéphanie
 
Ok, désolé, de ne pas avoir vu la question ...
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Ce n'est pas grave.
Tu as besoin pour quand de ton exo?

lami20j
0
Stéphanie
 
C'est à rendre avant le 19 novembre
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Ben,

alors j'ai le temps :-))

a savoir que

System.disk(’hda3’,95) ou System.disk(’/home’,90) occupation disque


ne veut pas dire qu'il s'agit d'une fonction Perl, mais de la syntaxe du fichier de configuration

A savoir que
fichier de configuration pour lequel vous utiliserez la syntaxe qui vous semblera la plus judicieuse ; une syntaxe vous est proposée, mais vous êtes libre de l’améliorer ou d’en changer complètement.

lami20j
0
Stéphanie
 
J'essaye de coder le System.disk suivant ce que tu avais déjà créer

J'ai écrit dans le fichier de configuration
#Systeme linux
system.disk('hda3',95)


puis dans le fichier perl (je n'ai écrit que ce que j'ai aouté), j'essaye de récupérer les parametres
use FileSys::Df;
my $disk = FileSys::Df->new();
my ($name,$val);

while (<CONFIG>){
# on saute les commentaires
  next if /^#/;
# je recupere le nom du fichier et la valeur
  ($name,$val) = ($1,$2) if /system.\disk\.('(\w+)',(\d+))/i; 
}

 open DAEMON,">> /home/stephanie/perl/log.daemon"
     or die "E/S : $!\n";

  if(defined($disk->df($name)){
      if($disk->df->{per} == $val){
	  print "ok\n";
      }
      else{
	  print "erreur\n";
      }
  }

Ca ne fonctionne pas
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Il me semble que ce module ne se trouve pas dans les modules standard.
Ce qui veut dire que le daemon ne pourra pas être exécuter sans avoir d'abord télécharger et ensuite installer ce module.
En ce cas il y a 2 possibilités :

- ma version avec la commande df
- utiliser un bloc BEGIN pour avertir l'utilisateur que le module n'existe pas, mais le daemon pourra continuer sinon le daemon va planter

J'ai utilisé que des modules standard.

Voilà à quoi ça rassemble un bloc BEGIN dans ton code au cas ou le module n'est pas installé.
#!/usr/bin/perl
use warnings;use strict;
BEGIN {
   unless (eval "use Filesys::Df"){
     warn "Le module Filesys::Df n'existe pas sur votre OS.\n"
   } else {
     my ($name,$val);

     while (<CONFIG>){
       next if /^#/;
       ($name,$val) = ($1,$2) if /system.\disk\.('(\w+)',(\d+))/i; 
     }

     open DAEMON,">> /home/stephanie/perl/log.daemon"
       or die "E/S : $!\n";

     my $disk=df($name,$val);

     if(defined($disk)){
       print "$name $disk->{per}\n";
     } else{
       print "erreur\n";
     }
   }
}
print "Le programme continue\n";
lami20j

P.S. Je pense que la version avec df est assez bonne pour eviter le bloc BEGIN
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

tu dois être cohérente dans ton fichier de config

au lieu de
system.disk('hda3',95)

mets plutôt
system.disk hda3 95
j'ai avancé un peu ton code

system.disk('hda3',95) ça rassemble plutôt à une fonction qu'à une entrée dans un fichier de configuration :-)

j'ai créé un script shell pour le démarrer le daemon et pour l'arrêter
Pour démarrer il faut utiliser des options
par exemple -f pour journaliser que ftp, -w que http, -l localhost

mais je n'ai pas fini

A savoir que pour l'instant j'ai travaillé dans le même répertoire

Voilà ce que j'ai pour l'instant

1. le script de démarrage ou arrêt exod
#!/bin/bash

case $1 in
'start')
       perl exo
       ;;
'stop')
       kill -9 $(cat pid.exo)
       rm -f pid.exo
       ;;
*)
       echo "Usage: perl exo {start|stop}"
       ;;
esac
2. le daemon exo
#!/usr/bin/perl
use warnings;use strict;

use POSIX;
use Time::HiRes;
use Net::Ping;
use Net::HTTP;
use Net::FTP;
use Getopt::Std;


my $ping = Net::Ping->new();
my ($dev,$blocks);
my ($local,$remote);
my $freq;
my ($localhost,$remotehost);
my ($url,$surl);
my ($ftp,$sftp);
my (%CODE,%options);



# fichier pid.exo
# contient le PID du daemon

open PID_EXO,">pid.exo"
  or die "E/S : $!\n";


# fichier de configuration
open CONFIG,"exo.conf"
   or die "E/S : $!\n";

while (<CONFIG>){
# on saute les commentaires
  next if /^#/;
# la frequence
  $freq=$1                               if /frequency\s*(\d+)/i;
# l'hôte locale
  $localhost = $1                        if /local\.ping\s*(\w+)/i;
# l'hôte distante à vérifiier
  $remotehost = (split /\s+/,$_)[1]      if /^remote\.ping/i;
# l'URL a vérifier
  $surl = (split /\s+/,$_)[1]            if /^internet\.url/i;
# le serveur ftp à vérifier
  $sftp = (split /\s+/,$_)[1]            if /^internet\.ftp/i;
# partition vérifier + taille du block
  ($dev,$blocks) = (split /\s+/,$_)[1,2] if /^system\.disk/i;
}
$dev ="/dev/$dev";

# exécution de script en tant que daemon
# 
print PID_EXO $$+1;
my $pid=fork;
exit if $pid;
die "fork impossible : $!" unless defined($pid);
POSIX::setsid()
    or die "Pas de nouvelle session : $!\n";

my $kill_pid = 0;

sub gestion_signaux {
    $kill_pid = 1;
}

$SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&gestion_signaux;

#####################################
#        TRAITEMENT CODE            #  
#####################################
#
%CODE=( 

'all'=> <<'FIN',
  open DAEMON,">> log.exo"
     or die "E/S : $!\n";

	
  if ($ping->ping($localhost)){
     $local = "$date $localhost en vie";
  }
  if ($ping->ping($remotehost)){
     $remote = "$date $remotehost en vie";
  } 
  else {
    $remote = "$date $remotehost non connecté ou innexistant";
  }
  
  if ( ($url = Net::HTTP->new(Host => "$surl")) and
	   ($url->write_request(GET => "/")) ) {
    print DAEMON "$date $surl valide et existe sur web\n";
  }
  else {
    print DAEMON "$date $surl inexistant || hors connexion || format invalide\n";
  }
  
  if($ftp = Net::FTP->new("$sftp", Debug => 0)){
    print DAEMON "$date $sftp connexion réussi\n";
  } 
  else {
    print DAEMON "$date $sftp connexion echouée\n";
  }  
  $ftp->quit;
     
print DAEMON 
"$date\n@{ [`df --block-size=$blocks $dev`] };
$local;
$remote\n";
FIN

'ftp'=> <<'FIN',
  open DAEMON,">> log.exo"
     or die "E/S : $!\n";
	
  if($ftp = Net::FTP->new("$sftp", Debug => 0)){
    print DAEMON "$date $sftp connexion réussi\n";
    close DAEMON;
  } 
  else {
    print DAEMON "$date $sftp connexion echouée\n";
    close DAEMON;
	}  
  $ftp->quit;
FIN

'http'=> <<'FIN',
  open DAEMON,">> log.exo"
     or die "E/S : $!\n";
  if ( ($url = Net::HTTP->new(Host => "$surl")) and
       ($url->write_request(GET => "/")) ) {
    print DAEMON "$date $surl valide et existe sur web\n";
    close DAEMON;
  }
  else {
    print DAEMON "$date $surl inexistant || hors connexion || format invalide\n";
    close DAEMON;
  }
FIN

'local'=> <<'FIN',
  open DAEMON,">> log.exo"
     or die "E/S : $!\n";
  if ($ping->ping($localhost)){
    $local = "$date $localhost en vie\n";
    print DAEMON "$local";
    close DAEMON;
  }
FIN

'remote'=> <<'FIN',
  open DAEMON,">> log.exo"
     or die "E/S : $!\n";
  if ($ping->ping($remotehost)){
    $remote = "$date $remotehost en vie";
    print DAEMON "$remote\n";
    close DAEMON;
  } 
  else {
    $remote = "$date $remotehost non connecté ou innexistant";
    print DAEMON "$remote\n"
    close DAEMON;
  }
FIN

'dev'=> <<'FIN',
  open DAEMON,">> log.exo"
     or die "E/S : $!\n";
    print DAEMON "$date\n@{ [`df --block-size=$blocks $dev`] }\n";
    close DAEMON;
FIN
);
#========FIN TRAITEMENT CODE========#

# Traitement des options qu'on puisse passer au script
# le message qui s'affice sur STDOUT
# si on exécute le script sans aucune option
getopts("alrfwhd",\%options);
sub utilisation {
die <<EOF
______________________________________________
Utilisation: $0 Option

Options :
  -a - tout les options
  -d - vérification partition
  -l - ping localhost
  -r - ping un hôte distant
  -f - teste une connexion ftp
  -w - test la validite et l'existence d'un URL
  -h - aide  courte
  -H - aide longue
______________________________________________

EOF
}


# le Daemon va exécuter
# chaque N secondes
# le jurnal log.exo a le format
# jj/mm/yyyy hh:mm:ss  information
#   

until ($kill_pid) {
# calcule la date et l'heure du test
  my $date =strftime "%d/%m/%Y %H:%M:%S",localtime;
	
SWITCH: {	
	
    if($options{a}){ eval "$CODE{all}";   sleep($freq); last SWITCH }
    if($options{l}){ eval "$CODE{local}"; sleep($freq); last SWITCH }
    if($options{w}){ eval "$CODE{remote}";sleep($freq); last SWITCH }
    if($options{f}){ eval "$CODE{ftp}";   sleep($freq); last SWITCH }
    if($options{w}){ eval "$CODE{http}";  sleep($freq); last SWITCH }
    if($options{d}){ eval "$CODE{dev}";   sleep($freq); last SWITCH }
    1 && utilisation();
	
}
}
__END__
3. le fichier de configuration exo.conf
################################################
#                                              # 
#             EXO DAEMON RESEAU                #
#                                              # 
################################################

# Syntaxe du fichier de configuration
# Entre le mot clé et la valeur
# on utilise uniquement un espace
# on peux avoir plusieurs valeur sur la même ligne

# mot valeur valeur valeur
# mot.cle valeur valeur valeur

# la frequence dont le daemon execute les testes
# Ex : Frequenci NN  
# frequency insensible à la case
# NN nombre de secondes
frequency 10

# vérification de la connexion
# faire un ping vers une machine (locale ou distante)
local.ping localhost
remote.ping 192.168.1.20

# vérification d'existance et de la validité 
# d'un URL
internet.url google.fr

# test d'un serveur FTP
internet.ftp ftp.kernel.org

# test espace partition
system.disk hda7 95
lami20j
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Dans le message précedente il y a quelques erreurs.
je vais réecrire ce message, ne cherche pas à trouver les erreurs :-)

lami20j
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
1. le script de démarrage ou arrêt exod
#!/bin/bash

case $1 in
'start')
       perl exo
       ;;
'stop')
       kill -9 $(cat pid.exo)
       rm -f pid.exo
       ;;
*)
       echo "Usage: perl exo {start|stop}"
       ;;
esac

2. le daemon exo
#!/usr/bin/perl
use warnings;use strict;

use POSIX;
use Time::HiRes;
use Net::Ping;
use Net::HTTP;
use Net::FTP;
use Getopt::Std;


my $ping = Net::Ping->new();
my ($dev,$blocks,$local,$remote,$freq);
my ($localhost,$remotehost,$url,$surl);
my ($ftp,$sftp,$user,$passwd);
my (%CODE,%options);

# fichier pid.exo
# contient le PID du daemon

open PID_EXO,">pid.exo"
  or die "E/S : $!\n";


# fichier de configuration
open CONFIG,"exo.conf"
   or die "E/S : $!\n";

# récupération des données depuis 
# le fichier de configuratin exo.conf
while (<CONFIG>){
  next if /^#/; # sauter les commentaires
  $freq=$1 if /frequency\s*(\d+)/i;
  $localhost = $1 if /local\.ping\s*(\S+)/i;
  $remotehost = (split /\s+/,$_)[1] if /^remote\.ping/i;
  $surl = (split /\s+/,$_)[1] if /^internet\.url/i;
  ($sftp,$user,$passwd) = (split /\s+/,$_)[1..3] if /^internet\.ftp/i;
  ($dev,$blocks) = (split /\s+/,$_)[1,2] if /^system\.disk/i;
}

# exécution de script en tant que daemon
print PID_EXO $$+1;
my $pid=fork;
exit if $pid;
die "fork impossible : $!" unless defined($pid);
POSIX::setsid()
    or die "Pas de nouvelle session : $!\n";

my $kill_pid = 0;

sub gestion_signaux {
    $kill_pid = 1;
}

$SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&gestion_signaux;

# consomation disque
$dev ="/dev/$dev";
my $d=(`df --block-size=$blocks $dev`)[1];
my @d = split /\s+/,$d;

#####################################
#        TRAITEMENT CODE            #  
#####################################
#
%CODE=( 

'all'=> <<'FIN',
open DAEMON,">> log.exo"
    or die "E/S : $!\n";
	
if ($ping->ping($localhost)){
    $local = "$date $localhost en vie";
}
  
if ($ping->ping($remotehost)){
   $remote = "$date $remotehost en vie";
} 
else {
   $remote = "$date $remotehost non connecté ou innexistant";
}
  
if ( ($url = Net::HTTP->new(Host => "$surl")) and
    ($url->write_request(GET => "/")) ) {
   print DAEMON "$date $surl valide et existe sur web\n";
}
else {
    print DAEMON "$date $surl inexistant || hors connexion || format invalide\n";
}
  
if($ftp = Net::FTP->new("$sftp") and
   $ftp->login($user,$passwd)){
   print DAEMON "$date $sftp connexion réussi\n";
} 
else {
   print DAEMON "$date $sftp connexion echouée\n";
}  
$ftp->quit;
     
print DAEMON "$date Sys. de fichiers : $d[0]
$date ${blocks}B-blocs : $d[1]
$date Occupé : $d[2]
$date Disponible : $d[3]
$date Capacité : $d[4]
$date Monté sur : $d[5]
$local;
$remote\n";
close DAEMON;
FIN

'ftp'=> <<'FIN',
open DAEMON,">> log.exo"
    or die "E/S : $!\n";
	
if($ftp = Net::FTP->new("$sftp") and
   $ftp->login($user,$passwd)){
   print DAEMON "$date $sftp connexion réussi\n";
   close DAEMON;
} 
else {
   print DAEMON "$date $sftp connexion echouée\n";
   close DAEMON;
}  
$ftp->quit;
FIN

'http'=> <<'FIN',
open DAEMON,">> log.exo"
    or die "E/S : $!\n";
if ( ($url = Net::HTTP->new(Host => "$surl")) and
	   ($url->write_request(GET => "/")) ) {
   print DAEMON "$date $surl valide et existe sur web\n";
   close DAEMON;
}
else {
   print DAEMON "$date $surl inexistant || hors connexion || format invalide\n";
   close DAEMON;
}
FIN

'local'=> <<'FIN',
open DAEMON,">> log.exo"
    or die "E/S : $!\n";
if ($ping->ping($localhost)){
    $local = "$date $localhost en vie\n";
   print DAEMON "$local";
   close DAEMON;
}
FIN

'remote'=> <<'FIN',
open DAEMON,">> log.exo"
    or die "E/S : $!\n";
  
if ($ping->ping($remotehost)){
    $remote = "$date $remotehost en vie";
   print DAEMON "$remote\n";
   close DAEMON;
}
else {
   $remote = "$date $remotehost non connecté ou innexistant";
   print DAEMON "$remote\n";
}

FIN

'dev'=> <<'FIN',
open DAEMON,">> log.exo"
    or die "E/S : $!\n";

print DAEMON "$date Sys. de fichiers : $d[0]
$date ${blocks}B-blocs : $d[1]
$date Occupé : $d[2]
$date Disponible : $d[3]
$date Capacité : $d[4]
$date Monté sur : $d[5]\n";
     close DAEMON;
FIN
);
#==========TRAITEMENT CODE==========#  
#

# Traitement des options qu'on puisse passer au script
# le message qui s'affice sur STDOUT
# si on exécute le script sans aucune option
getopts("alrfwhdH",\%options);
sub utilisation {
die <<EOF

Utilisation: $0 Option

Options :
  -a - tout les options
  -d - vérification partition
  -l - ping localhost
  -r - ping un hôte distant
  -f - teste une connexion ftp
  -w - test la validite et l'existence d'un URL
  -h - aide  courte
  -H - aide longue

EOF
}


# le Daemon va exécuter
# chaque N secondes il va écrire
# le journal log.exo a le format
#jj/mm/yyyy hh:mm:ss  information
#   

until ($kill_pid) {
# calcule la date et l'heure du test
  my $date =strftime "%d/%m/%Y %H:%M:%S",localtime;
	
SWITCH: {	
	
	if($options{a}){ eval "$CODE{all}";   sleep($freq); last SWITCH }
	if($options{l}){ eval "$CODE{local}"; sleep($freq); last SWITCH }
	if($options{r}){ eval "$CODE{remote}";sleep($freq); last SWITCH }
	if($options{f}){ eval "$CODE{ftp}";   sleep($freq); last SWITCH }
	if($options{w}){ eval "$CODE{http}";  sleep($freq); last SWITCH }
	if($options{d}){ eval "$CODE{dev}";   sleep($freq); last SWITCH }
	1 && utilisation();
	
}
}
__END__

3. le fichier de configuration exo.conf
################################################
#                                              # 
#             EXO DAEMON RESEAU                #
#                                              # 
################################################

# Syntaxe du fichier de configuration
# Entre le mot clé et la valeur
# on utilise uniquement un espace
# on peux avoir plusieurs valeur sur la même ligne

# mot valeur valeur valeur
# mot.cle valeur valeur valeur

# la frequence dont le daemon execute les testes
# Ex : Frequenci NN  
# frequency insensible à la case
# NN nombre de secondes
frequency 10

# vérification de la connexion
# faire un ping vers une machine (locale ou distante)
local.ping 127.0.0.1
remote.ping 192.168.1.2

# vérification d'existance et de la validité 
# d'un URL
internet.url www.commentcamarche.net

# test d'un serveur FTP
internet.ftp ftp.fr.debian.org anonymous user@yahoo.fr

# test espace partition
system.disk hda7 95
4. le fichier log.exo rassemble à
05/11/2006 23:39:15 www.commentcamarche.net valide et existe sur web
05/11/2006 23:39:15 ftp.fr.debian.org connexion réussi
05/11/2006 23:39:15 Sys. de fichiers : /dev/hda7
05/11/2006 23:39:15 95B-blocs : 106915215
05/11/2006 23:39:15 Occupé : 64492986
05/11/2006 23:39:15 Disponible : 36903581
05/11/2006 23:39:15 Capacité : 64%
05/11/2006 23:39:15 Monté sur : /home
05/11/2006 23:39:15 127.0.0.1 en vie
05/11/2006 23:39:15 192.168.1.2 en vie
lami20j
0
Stéphanie
 
Merci lami20j
J'ai essayé de compiler le code mais ça m'indique que je n'avais pas le module Net::HTTP.
~$ ./exo.pl
Can't locate Net/HTTP.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.7 /usr/local/share/perl/5.8.7 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at ./exo.pl line 7.
BEGIN failed--compilation aborted at ./exo.pl line 7.

J'ai donc voulu l'installer avec cette commande mais ça me met ceci :
stephanie@ubuntu:~$ sudo apt-get install libwww-perl
Password:
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Les paquets supplémentaires suivants seront installés :
  libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl liburi-perl
Paquets suggérés :
  libio-socket-ssl-perl
Paquets recommandés :
  libmailtools-perl libhtml-format-perl libcompress-zlib-perl
Les NOUVEAUX paquets suivants seront installés :
  libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl liburi-perl
  libwww-perl
0 mis à jour, 5 nouvellement installés, 0 à enlever et 139 non mis à jour.
Il est nécessaire de prendre 0o/769ko dans les archives.
Après dépaquetage, 2322ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ? O
Changement de support : veuillez insérer le disque
« Ubuntu 5.10 _Breezy Badger_ - Release i386 (20051012) »
dans le lecteur « /cdrom/ » et appuyez sur la touche Entrée

ESt-ce que c'est bien le paquet libwww-perl qu'il faut installer ?
Si c'est le cas, sais-tu comment résoudre cela ?
0
Stéphanie
 
En principe, s'il n'y a pas d'erreur avec Net::Ping et Net::FTP, c'est que le module Net est présent.
L'erreur est donc bizzarre
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Attention Net n'est pas un module mais un répertoire qui contient des modules.

Quand tu vois Net::HTTP en fait il s'agit du moduel Net::HTTP qui veut dire qu'il y a un répertoire parmi ce qui se trouve dans @INC qui contient le module HTTP.pm

Ici tu trouves le module Net::HTTP https://metacpan.org/search?q=net%3A%3Ahttp

J'ai avancé ton daemon. J'ai écrit l'envoie du mail.
Si ça t'interesse j'affiche le code ainsi que le fichier de configuration (j'ai changer la mise en page). De toute façon ce week-end je vais le finir.

A savoir que j'ai mis des options.

Si tu fait ./exo.pl tu auras un message qui va t'afficher les options disponibles (mais je n'ai pas fini encore)

par exemple
./exo.pl -a -prends en compte tout les options
./exo.pl -l - teste le ping localhost
etc...

Il faut contrôler un peu le daemon.
En plus l'option -a n'exécute pas l'envoie de mail, mais je peux l'inclure.


Encore une chose. Le fichier de configuration est traiter par le script pour une seule ligne mais on peut le personnaliser pour prendre en compte plusieurs

par exemple si j'écrit
internet.ping xxx.xxx.xxx.xxx
internet.ping xxx.xxx.xxx.xxx
le daemon ne va pas tester les deux


Tu as du remarquer que j'ai mis le code à exécuter dans un hachage ensuite dans SWITCH je fait un eval{$hachage{cle}

Si tu veux que je continue fait un signe, sinon je vais m'arrêter là.


A toi.

lami20j
0