[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
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
A voir également:
- [PERL]Réseaux
- Denon perl pro test - Accueil - Audio
- Sandra a décidé de mieux contrôler son image et sa présence sur différents réseaux sociaux. qu’est-il possible de faire sur ces réseaux ? - Forum Études / Formation High-Tech
- Problème réseaux - Forum WiFi
- Frédéric cherche à faire le buzz sur les réseaux sociaux. il a ajouté une image de manchots sur une image de plage. retrouvez l'image originale de la plage. que cachent les manchots ? - Forum Graphisme
- Comment ca marche les liens miniatures sur les réseaux sociaux - Forum Réseaux sociaux
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
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
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
7 nov. 2006 à 20:52
Pour le mail j'ai téléchargé le module MIME::Lite
Voici le fichier de config
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
Salut,
lorsque je tape :
j'ai ce message :
ça ne revient pas au ~$ puis je tape ./exo.pl - a et ça me met les mesages suivants :
J'arrete tout en faisant :
Ensuite, j'essaye en lançant :
Je tape donc : perl exo.pl start
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
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
11 nov. 2006 à 10:58
Salut,
affiche le résultat de la commande mount
merci.
lami20j
affiche le résultat de la commande mount
merci.
lami20j
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
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 ;-)
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 ;-)
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)
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
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
donc au lieu de hda7 tu doit mettre hdc1
/dev/hdc1 on / type ext3 (rw,errors=remount-ro)
lami20j
Ok, je vais me créer un compte
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
11 nov. 2006 à 12:11
ok, j'attends des nouvelles.
lami20j
lami20j
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 ?
Pour les requets sql, tu sais comment ça se passe ?
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
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 :-))
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 :-))
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 :
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
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
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
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
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
P.S. lorsque je lance ./exod.pl,
appele le seulement exod il s'agit d'un script shell et pas perl
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
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
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
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)
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}" ;; esaclami20j
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)
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
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
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}" ;; esacLe 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
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
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
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
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
12 nov. 2006 à 19:30
Salut,
voilà la dernière version
1. Fichier de configuration
2. Script de démarrage
3. 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
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