[PERL]Réseaux

Fermé
Stéphanie - 2 nov. 2006 à 18:12
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 12 nov. 2006 à 19:30
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

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

Tu utilises quelle version de Perl?

J'ai la version v5.8.7

Ici tu trouves le module Net::HTTP https://metacpan.org/search?q=net%3A%3Ahttp
Ok, je vais aller le prendre

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.

Ca m'interesse

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 vas pas tester les deux


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

J'ai regardé le code mais comme je l'ai indiqué, je n'avais pas pu le tester.
Merci bien pour toutes ses précisions et pour ce que tu fais
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
7 nov. 2006 à 20:52
Pour le mail j'ai téléchargé le module MIME::Lite
Voici le fichier de config
################################################
#                                              # 
#             EXO DAEMON RESEAU                #
#                                              # 
################################################

# Fichier de configuration pour le daemon exo
# la frequence dont le daemon execute les testes
# Ex : Frequenci NN  
# NN nombre de secondes
frequency 10

# La structure du fichier de configuration
# Les options sont insensibles à la case

###############################################
# Les entrées pour le système

# system.parametre valeur

# il peut avoir plusieurs valeurs
# les valeurs doivent être séparéé par un espace
# la valeur de doit pas contenir des espaces

# Ex:
# system.disk hda3 95

# test espace partition
system.disk hda7 95

##############################################
# Les entrées pour les services réseau

# internet.parametre valeur

# il peut avoir plusieurs valeurs
# les valeurs doivent être séparéé par un espace
# la valeur de doit pas contenir des espaces

# Ex:
#internet.ping 192.168.1.1 

# 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

##############################################
# Les entrées pour les champs action 
#
# action.param 'valeur' 'valeur'

# Ex:
# action.mail 'sujet' 'texte'
# envoie mail
action.mail 'Daemon exo test' 'Commentcamarche? :-)'
et le script
#!/usr/bin/perl
use warnings;use strict;

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

my $ping = Net::Ping->new();
my ($dev,$blocks,$local,$remote,$freq);
my ($localhost,$remotehost,$url,$surl);
my ($ftp,$sftp,$user,$passwd);
my ($sujet,$texte);
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;
  ($sujet,$texte) = ($1,$2) if /^action\.mail\s*'([^']*)'\s*'([^']*)'/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

'mail'=> <<'FIN'
MIME::Lite->send('smtp','smtp.free.fr');
my $msg = new MIME::Lite
        From    => 'lami20j@free.fr',
	To      => 'lami20j@yahoo.fr',
	Subject =>  $sujet,
	Type    =>  'TEXT',
	Data    => "$texte";
$msg->send();
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("alrfwhdHm",\%options);
sub utilisation {
die <<EOF

Utilisation: $0 Option

Options :
  -a - tout les options
  -d - vérification partition
  -f - teste une connexion ftp
  -h - aide  courte
  -l - ping localhost
  -r - ping un hôte distant
  -w - test la validite et l'existence d'un URL
  -m - envoie d'un mail (le sujet et le messages sont dans exo.conf)
  -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 }
	if($options{m}){ eval "$CODE{mail}";  sleep($freq); last SWITCH }
	1 && utilisation();
	
}
}
__END__

lami20j
0
Salut,

lorsque je tape :
./exo.pl

j'ai ce message :
stephanie@ubuntu:~$ df: `/dev/hda7': Aucun fichier ou répertoire de ce type
Use of uninitialized value in split at ./exo.pl line 62, <CONFIG> line 63.

Utilisation: ./exo.pl Option

Options :
  -a - tout les options
  -d - verification partition
  -f - teste une connexion ftp
  -h - aide  courte
  -l - ping localhost
  -r - ping un hote distant
  -w - test la validite et l'existence d'un URL
  -m - envoie d'un mail (le sujet et le messages sont dans exo.conf)
  -H - aide longue

ça ne revient pas au ~$ puis je tape ./exo.pl - a et ça me met les mesages suivants :
./exo.pl -a
df: `/dev/hda7': Aucun fichier ou répertoire de ce type
Use of uninitialized value in split at ./exo.pl line 62, <CONFIG> line 63.
stephanie@ubuntu:~$ Use of uninitialized value in concatenation (.) or string at (eval 14) line 32, <CONFIG> line 63.Use of uninitialized value in concatenation (.) or string at (eval 14) line 32, <CONFIG> line 63.
Use of uninitialized value in concatenation (.) or string at (eval 14) line 32, <CONFIG> line 63.
Use of uninitialized value in concatenation (.) or string at (eval 14) line 32, <CONFIG> line 63.
Use of uninitialized value in concatenation (.) or string at (eval 14) line 32, <CONFIG> line 63.
Use of uninitialized value in concatenation (.) or string at (eval 14) line 32, <CONFIG> line 63.

J'arrete tout en faisant :
ps aux | grep exo.pl
kill PID


Ensuite, j'essaye en lançant :
./exod.pl
Usage: perl exo.pl {start|stop}

Je tape donc : perl exo.pl start
~$ df: `/dev/hda7': Aucun fichier ou répertoire de ce type
Use of uninitialized value in split at exo.pl line 62, <CONFIG> line 63.

Utilisation: exo.pl Option

Options :
  -a - tout les options
  -d - verification partition
  -f - teste une connexion ftp
  -h - aide  courte
  -l - ping localhost
  -r - ping un hote distant
  -w - test la validite et l'existence d'un URL
  -m - envoie d'un mail (le sujet et le messages sont dans exo.conf)
  -H - aide longue
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
11 nov. 2006 à 10:58
Salut,

affiche le résultat de la commande mount
merci.

lami20j
0

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

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
11 nov. 2006 à 11:10
Re,

comme je ne vais pas rester longtemps devant l'ordi, voilà ce que je te conseille

1. crée un répertoire
mkdir /home/stephanie

2. dédans tu mets les 3 fichiers

exo ( le daemon )
exod ( le script de démarrage/arrêt)
exo.conf ( le fichier de configuration)

3. vérifie ton fichier de configuration (j'ai mis hda7 puisque j'ai un hda7, si tu n'as pas mets ce que tu as, il me semble que tu as une partition hda3)

lami20j

P.S. Je t'ai dit que je n'ai pas gérer les erreurs. Ca devient trop compliquer pour un exo de passage (ton prof doit être ou f** ou c**)
et ça ne vaut pas le coup

Donc pour eviter les erreurs il faut comprendre ce qui ce passe et il faut avoir un bon fichier de configuration.

Une mauvaise syntaxe dans le fichier de configuration ne permettra pas l'exécution de script.

D'ailleurs mettre le message dans mail dans un fichier de configuration me fait rire un peu :-))


Il me semble que c'est le moment de te créer un compte sur CCM ;-)
0
Résultat de la commande mount
/dev/hdc1 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
usbfs on /proc/bus/usb type usbfs (rw)
tmpfs on /lib/modules/2.6.12-9-386/volatile type tmpfs (rw,mode=0755)
tmpfs on /dev type tmpfs (rw,size=10M,mode=0755)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
11 nov. 2006 à 11:42
Re,

donc au lieu de hda7 tu doit mettre hdc1
/dev/hdc1 on / type ext3 (rw,errors=remount-ro)

lami20j
0
Ok, je vais me créer un compte
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
11 nov. 2006 à 12:11
ok, j'attends des nouvelles.

lami20j
0
Il y a un souci pour la création d'un compte, j'essaierai plus tard.
Pour les requets sql, tu sais comment ça se passe ?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
11 nov. 2006 à 12:22
Re,


Database.config(’dbi:Pg:host=sqletud;dbname=maBaseAMoi’,’user’,’pass’)

• 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.database(’update c set a=10 where a>100’) commande SQL


Oui, je sais le faire, mais ça sera pour un peu plus tard.
Pour l'instant vaut mieux que tu arrives à exécuter ce qu'on a déjà fait.

lami20j

P.S. Je n'ai pas oublie que le terme c'est le 19/11 :-))
0
Toutes les options fonctionnent correctement mais pour l'envoi de mail, le résultat de s'affiche pas dans log.exo et lorsque je donne comme action seulement envoyer un mail, le fichier log.exo ne se créer pas

De plus, lorsque je lance ./exod.pl, ça me donne l'affichage de la manière de procéder :
./exod.pl
Usage: perl exo.pl {start|stop}

ensuite, je fais perl exo.pl start, ça donne la manière de procéder et les options disponibles. Je lance quelques options

Lorsque je fais perl exo.pl stop, les processus ne s'arretent pas et je dois les arreter avec ps aux | grep exo.pl puis kill
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
11 nov. 2006 à 15:15
Re,

je vois que tu ne me laisse pas partir de la maison :-)

Toutes les options fonctionnent correctement
ok
mais pour l'envoi de mail, le résultat de s'affiche pas dans log.exo et lorsque je donne comme action seulement envoyer un mail, le fichier log.exo ne se créer pas

Oui, je sais. Je n'ai pas écrit dans le code.


Lorsque je fais perl exo.pl stop, les processus ne s'arretent pas et je dois les arreter avec ps aux | grep exo.pl puis kill

Ca parce qu'il y a plusieurs instances qui sont démarrées.

Pour l'instant tu démarres le daemon et si tu veux tester une autre options d'abord tu l'arrêtes avec exod stop sinon quand tu fait ps aux | grep exo.pl tu as toutes les instances à tuer

J'ai modifier le script de démarrage.
Par défaut il démarre avec toutes les options -a

Si tu veux le démarrer avec une options particulière alors il faut l'exécuter directement.

J'ai modifier le script de démarrage ainsi que le daemon.
1. Script de démarrage
je teste si le daemon est démaré
si oui je ne le redémarre pas
si non je le démarre
#!/bin/bash

case $1 in
'start')
       if [ -e pid.exo ];then 
         echo "le daemon est déjà démarré";
         exit
         else
         perl exo -a
       fi
       ;;
'stop')
       if [ ! -e pid.exo ];then 
         echo "le daemon n'est pas démarré";
         exit
       else
         kill -9 $(cat pid.exo)
         rm -f pid.exo
       fi
       ;;
*)
       echo "Usage: perl exo {start|stop}"
       ;;
esac

2. le script
si le fichier pid.exo existe alors le daemon est démarrer
donc je ne le redémarre pas
ainsi on evitera d'avoir lancer le daemon plusieurs fois
#!/usr/bin/perl
use warnings;use strict;

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

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

# fichier pid.exo
# contient le PID du daemon
# tester l'existence 
# si existe alors le daemon est déjà démarrée 
die "Le daemon \e[2mexo\e[m est déjà démarré!\n"
   if open LIRE_PID_EXO,"pid.exo";
close(LIRE_PID_EXO);

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;
	($sujet,$texte) = ($1,$2) if /^action\.mail\s*'([^']*)'\s*'([^']*)'/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

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

MIME::Lite->send('smtp','smtp.free.fr');
my $msg = new MIME::Lite
  From    => 'lami20j@free.fr',
	To      => 'lami20j@yahoo.fr',
	Subject =>  $sujet,
	Type    =>  'TEXT',
	Data    => "$texte";
if($msg->send()){print DAEMON "$date Message envoyé\n"}
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("alrfwhdHm",\%options);
sub utilisation {
die <<EOF

Utilisation: $0 Option

Options :
  -a - tout les options
  -d - vérification partition
  -f - teste une connexion ftp
  -h - aide  courte
  -l - ping localhost
  -r - ping un hôte distant
  -w - test la validite et l'existence d'un URL
  -m - envoie d'un mail (le sujet et le messages sont dans exo.conf)
  -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 }
	if($options{m}){ eval "$CODE{mail}";  sleep($freq); last SWITCH }
	1 && utilisation();
	
}
}
__END__

lami20j

P.S. lorsque je lance ./exod.pl,

appele le seulement exod il s'agit d'un script shell et pas perl
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
11 nov. 2006 à 16:00
Re,

j'ai ajouter 2 options au script de démarrage
status - voir si le daemon fonctionne ou pas
restart - arrêt et redémarrage de daemon
#!/bin/bash

case $1 in
'start')
       if [ -e pid.exo ];then 
         echo "le daemon exo est déjà démarré";
         exit
         else
         perl exo -a
         echo "démarrage d'exo avec toutes les options OK"
       fi
       ;;
'stop')
       if [ ! -e pid.exo ];then 
         echo "le daemon n'est pas démarré"
         exit
       else
         kill -9 $(cat pid.exo)
         rm -f pid.exo
       fi
       ;;
'restart')
       if [ -e pid.exo ];then 
         kill -9 $(cat pid.exo)
         rm -f pid.exo
         echo "arrête de daemon exo"
         perl exo -a
         echo "redémarrage d'exo avec toutes les options OK"
       else
         echo "le daemon n'est pas démarré"			 
       fi
       ;;
'status')
       if [ -e pid.exo ];then
         echo $(cat pid.exo) exo run
       else
         echo "le daemon exo n'est pas démarré"
       fi
       ;;
*)
       echo "Usage: perl exo {start|stop|restart|status}"
       ;;
esac
lami20j

P.S. Tu n'as à démarrer le daemon en lançant le script que si tu veux le démarrer avec une option particulère

Nomme les fichiers comment je l'ai fait
exo - le daemon (script perl)
exod - le script de démarrage (script shell)
exo.conf - le fichier de config (fichier texte)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
11 nov. 2006 à 16:47
Re,

pour aujourd'hui je m'arrête ici.
Voilà les dernières modifications

- quand tu essaie de démarrer le daemon d'abord je vérifie s'il est en marche
si oui il va t'afficher aussi avec quelle option il fonctionne

Utilise le script de démarrage pour arrêter pour démarrer pour redémarrer pour vérifier le status

Si tu veux le démarrer avec une option particulière démarre le daemon avec l'option choisie

Par exemple
exo -f

Le script exod
#!/bin/bash

case $1 in
'start')
       if [ -e pid.exo ];then 
         echo "le daemon exo est déjà démarré avec " $(cat pid.exo | grep -Eo '[^0-9]+')
         exit
         else
         perl exo -a
         echo "démarrage d'exo avec toutes les options OK"
       fi
       ;;
'stop')
       if [ ! -e pid.exo ];then 
         echo "le daemon n'est pas démarré"
         exit
       else
         kill -9 $(cat pid.exo | grep -Eo '[0-9]+')
         rm -f pid.exo
       fi
       ;;
'restart')
       if [ -e pid.exo ];then 
         kill -9 $(cat pid.exo | grep -Eo '[0-9]+')
         rm -f pid.exo
         echo "arrête de daemon exo"
         perl exo -a
         echo "redémarrage d'exo avec toutes les options OK"
       else
         echo "le daemon n'est pas démarré"			 
       fi
       ;;
'status')
       if [ -e pid.exo ];then
         echo $(cat pid.exo) exo run
       else
         echo "le daemon exo n'est pas démarré"
       fi
       ;;
*)
       echo "Usage: perl exo {start|stop|restart|status}"
       ;;
esac
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;
use MIME::Lite;

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

getopts("alrfwhdHm",\%options);

# fichier pid.exo
# contient le PID du daemon
# tester l'existence 
# si existe alors le daemon est déjà démarrée 
die "Le daemon \e[2mexo\e[m est déjà démarré avec l'",(split /:/,(`cat pid.exo`))[1]," !\n"
   if open LIRE_PID_EXO,"pid.exo";
close(LIRE_PID_EXO);

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;
	($sujet,$texte) = ($1,$2) if /^action\.mail\s*'([^']*)'\s*'([^']*)'/i;
}
# exécution de script en tant que daemon
print PID_EXO $$+1," :option -",keys %options;
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

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

MIME::Lite->send('smtp','smtp.free.fr');
my $msg = new MIME::Lite
  From    => 'lami20j@free.fr',
	To      => 'lami20j@yahoo.fr',
	Subject =>  $sujet,
	Type    =>  'TEXT',
	Data    => "$texte";
if($msg->send()){print DAEMON "$date Message envoyé\n"}
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
sub utilisation {
die <<EOF

Utilisation: $0 Option

Options :
  -a - tout les options
  -d - vérification partition
  -f - teste une connexion ftp
  -h - aide  courte
  -l - ping localhost
  -r - ping un hôte distant
  -w - test la validite et l'existence d'un URL
  -m - envoie d'un mail (le sujet et le messages sont dans exo.conf)
  -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 }
	if($options{m}){ eval "$CODE{mail}";  sleep($freq); last SWITCH }
	1 && utilisation();
	
}
}
__END__

lami20j
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
11 nov. 2006 à 16:51
Il nous reste à faire

System.process(’apache’) vérification de l’existence d’un processus
System.cpuload(10) charge du processeur (faisable facilement ?)

Internet.tcp(’192.168.0.10’,’25’) port toujours ouvert ?
Internet.url(’http://foo/bar’,’/path/to/file’) contenu d’une page web


Database.alive() base en fonctionnement ?
Database.request(’select * from c where a>100’)


• 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


lami20j
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 nov. 2006 à 19:30
Salut,

voilà la dernière version

1. Fichier de configuration
################################################
#                                              # 
#             EXO DAEMON RESEAU                #
#                                              # 
################################################

# Fichier de configuration pour le daemon exo
# la frequence dont le daemon execute les testes
# Ex : Frequenci NN  
# NN nombre de secondes
frequency 20

# La structure du fichier de configuration
# Les options sont insensibles à la case

###############################################
# Les entrées pour le système

# system.parametre valeur

# il peut avoir plusieurs valeurs
# les valeurs doivent être séparéé par un espace
# la valeur de doit pas contenir des espaces

# Ex:
# system.disk hda3 95
# system.disk home 95
# test espace partition
system.disk /home 95

# test existence processus
system.process httpd
##############################################
# Les entrées pour les services réseau

# internet.parametre valeur

# il peut avoir plusieurs valeurs
# les valeurs doivent être séparéé par un espace
# la valeur de doit pas contenir des espaces

# Ex:
#internet.ping 192.168.1.1 

# 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

# tester port
internet.tcport www.commentcamarche.net 80

# récupération page web
# syntaxe : internet.tcp|url|/chemin/vers/fichier
internet.tcp|https://www.google.fr/?gws_rd=ssl|gethttp

##############################################
#Les entrées pour la base de données
#
# Ex:
# database.alive nombase utilisateur motdepasse

database.alive exobase postgres azerty

# Ex
# database.request 'select * from nomtable where champ>100'

database.request 'select * from stock where quantite>100'

##############################################
# Les entrées pour les champs action 
#
# action.param 'valeur' 'valeur'

# Ex:
# action.mail 'sujet' 'texte'
# envoie mail
action.mail 'Daemon exo test' 'Commentcamarche? :-)'

2. Script de démarrage
#!/bin/bash

if [ -e pid.exo ];then 
  pid=$(cat pid.exo | grep -Eo '[0-9]+')
fi

case $1 in
'start')
       if [ -e pid.exo ];then 
         echo "le daemon exo est déjà démarré avec " $(cat pid.exo | grep -Eo '[^0-9]+')
         exit
         else
         perl exo -a
         echo "démarrage d'exo avec toutes les options OK"
       fi
       ;;
'stop')
       if [ ! -e pid.exo ];then 
         echo "le daemon n'est pas démarré"
         exit
       else
         echo "le daemon exo (PID $pid) arrêté avec succes"
         kill -9 $(cat pid.exo | grep -Eo '[0-9]+')
         rm -f pid.exo
       fi
       ;;
'restart')
       if [ -e pid.exo ];then 
         kill -9 $(cat pid.exo | grep -Eo '[0-9]+')
         rm -f pid.exo
         echo "arrête de daemon exo"
         perl exo -a
         echo "redémarrage d'exo avec toutes les options OK"
       else
         echo "le daemon n'est pas démarré"			 
       fi
       ;;
'status')
       if [ -e pid.exo ];then
         echo "$(cat pid.exo) exo en marche"
       else
         echo "le daemon exo n'est pas démarré"
       fi
       ;;
*)
       echo "Usage: perl exo {start|stop|restart|status}"
       ;;
esac

3. Daemon
#!/usr/bin/perl
use strict;use warnings;

use POSIX;
use Time::HiRes;
use Net::Ping;
use Net::HTTP;
use Net::FTP;
use Getopt::Std;
use MIME::Lite;
use DBI;
use IO::Socket::INET;
use LWP::Simple;

my $ping = Net::Ping->new();
my ($dev,$blocks,$local,$remote,$freq);
my ($localhost,$remotehost,$url,$surl);
my ($ftp,$sftp,$user,$passwd);
my ($sujet,$texte);
my (%CODE,%options);
my ($db,$dbuser,$dbuserpasswd,$req);
my ($ip,$port,$web,$d_web);
my  $proc;

getopts("adflmprwDPRW",\%options);

# fichier pid.exo
# contient le PID du daemon
# tester l'existence 
# si existe alors le daemon est déjà démarrée 
die "Le daemon \e[2mexo\e[m est déjà démarré avec l'",(split /:/,(`cat pid.exo`))[1]," !\n"
   if open LIRE_PID_EXO,"pid.exo";
close(LIRE_PID_EXO);

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;
  $req = $1                if /^database\.request\s+'([^']*)'/i;
 ($sujet,$texte) = ($1,$2) if /^action\.mail\s*'([^']*)'\s*'([^']*)'/i;
  
 ($ip,$port) =    (split /\s+/,$_)[1,2]  if /^internet\.tcport/i;
 ($web,$d_web) =  (split /\|/,$_)[1,2],1 if /^internet\.tcp/i;
  $remotehost =   (split /\s+/,$_)[1]    if /^remote\.ping/i;
 ($dev,$blocks) = (split /\s+/,$_)[1,2]  if /^system\.disk/i;
  $surl =         (split /\s+/,$_)[1]    if /^internet\.url/i;
  $proc =         (split /\s+/,$_)[1]    if /^system\.process/i;
 
 ($sftp,$user,$passwd) =       (split /\s+/,$_)[1..3]  if /^internet\.ftp/i;
 ($db,$dbuser,$dbuserpasswd) = (split /\s+/,$_)[1,2,3] if /^database\.alive/i;
}


# exécution de script en tant que daemon
print PID_EXO $$+1," :option -",keys %options;
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
unless ($dev =~/\//){
  $dev="/dev/$dev";
}
my $d=(`df --block-size=$blocks $dev`)[1];
my @d = split /\s+/,$d;
#####################################
#        TRAITEMENT CODE            #  
#####################################
#
%CODE=( 

'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";
   close DAEMON;
}

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

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

MIME::Lite->send('smtp','smtp.free.fr');
my $msg = new MIME::Lite
        From    => 'lami20j@free.fr',
	To      => 'lami20j@yahoo.fr',
	Subject =>  $sujet,
	Type    =>  'TEXT',
	Data    => "$texte";
if($msg->send()){print DAEMON "$date Message envoyé\n"}
   close DAEMON;
FIN

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

if(my $dbh=DBI->connect("dbi:Pg:dbname=$db","$dbuser","$dbuserpasswd",{
   PrintError => 0,
   RaiseError => 0,})){
  print DAEMON "$date utilisateur $dbuser connecté à la base $db\n";
   close DAEMON;
}else {
  print DAEMON "$date $DBI::errstr";
   close DAEMON;
}
FIN

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

if(my $dbh=DBI->connect("dbi:Pg:dbname=$db","$dbuser","$dbuserpasswd",{
   PrintError => 0,
   RaiseError => 0,})){
	my $t = $dbh->prepare("$req");
	$t->execute();
  if ($t->fetchrow_array){
    print DAEMON "$date $req OK\n";
   close DAEMON;
  }else {
	  print DAEMON "$date $DBI::state $DBI::err $DBI::errstr";
   close DAEMON;
	}
}
FIN

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

my $sock=IO::Socket::INET->new(PeerAddr =>$ip,
                               PeerPort =>$port);
if ($sock){ 
print DAEMON "$date port $port sur $ip ouvert\n";
   close DAEMON;
}else {
print DAEMON "$date port $port sur $ip n'est pas ouvert\n";
   close DAEMON;
}
FIN

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

# écriture de la page web récupérée

my $r_url = get($web);
if($r_url){
print DAEMON "$date page d'index $web récupérée\n";
   close DAEMON;
open URL_R,">>$d_web" or die "E/S : $!\n";
print URL_R "\n==========$date DEBUT $web ==========\n$r_url\n==========FIN==========\n";
}else {
print DAEMON "$date page d'index $web n'a pas été récupérée\n";
   close DAEMON;
}
FIN

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

if( `ps -A | grep $proc` ){
  print DAEMON "$date $proc est en marche\n";
   close DAEMON;
}else{
  print DAEMON "$date $proc n'est pas en marche\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
sub utilisation {
die <<EOF

Utilisation: $0 Option

Options :
  -a - toutes les options
  -d - vérification partition
  -f - teste une connexion ftp
  -l - ping localhost
  -m - envoie d'un mail (le sujet et le messages sont dans exo.conf)
  -p - vérification d'existence d'un processus
  -r - ping un hôte distant
  -w - test la validite et l'existence d'un URL
  -D - connexion à une base de données POSTGRESQL
  -P - vérifier un port
  -R - requete base de données
  -W - récupération page web

EOF
}
if((scalar keys %options) > 1){ unlink glob("pid.exo") and utilisation () and die}

# 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}){ for(keys %CODE){eval "$CODE{$_}"};
	                                       sleep($freq); last SWITCH }
	if($options{d}){ eval "$CODE{dev}";    sleep($freq); last SWITCH }
	if($options{f}){ eval "$CODE{ftp}";    sleep($freq); last SWITCH }
	if($options{l}){ eval "$CODE{local}";  sleep($freq); last SWITCH }
	if($options{m}){ eval "$CODE{mail}";   sleep($freq); last SWITCH }
	if($options{p}){ eval "$CODE{proc}";   sleep($freq); last SWITCH }
	if($options{r}){ eval "$CODE{remote}"; sleep($freq); last SWITCH }
	if($options{w}){ eval "$CODE{http}";   sleep($freq); last SWITCH }
	if($options{D}){ eval "$CODE{dbpsql}"; sleep($freq); last SWITCH }
	if($options{P}){ eval "$CODE{port}";   sleep($freq); last SWITCH }
	if($options{R}){ eval "$CODE{dbreq}";  sleep($freq); last SWITCH }
	if($options{W}){ eval "$CODE{gethttp}";sleep($freq); last SWITCH }
	unlink glob("pid.exo") and utilisation() and die;
	
}
}
__END__
une autre méthode pour récupérer le contenu d'une page web

use LWP::UserAgent;

my $agent = LWP::UserAgent->new();
my $req = HTTP::Request->new(GET => 'http://www.commentcamarche.net');

my $res = $agent->request($req);
print $res->content;

a savoir que pour exécuter un programme Perl en tant que daemon
il y a sur CPAN le module Proc::Daemon

Il reste

• 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
• System.cpuload(10) charge du processeur (faisable facilement ?)


lami20j

P.S. si tu ne t'en sors pas fait un signe
0