[PERL]Réseaux
Stéphanie
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Salut,
j'aurai besoin d'aide concernant cet exo car j'ai du mal à comprendre comment il faut que je m'y prenne.
Si quelqu'un pouvait m'indiquer des pistes pour le démarrer ce serait sympa car je n'y arrive pas.
Merci par avance
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.
A voir également:
- [PERL]Réseaux
- Matthias utilise les réseaux sociaux. que doit-il faire dans chacune des situations suivantes ? - Forum Cloud
- 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 Windows
- 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 ? - Télécharger - Informations & Diagnostic
- Traduire en français image ✓ - Forum Loisirs / Divertissements
- Surprise sur mon réseau, c'est vraiment en cours ? ✓ - Forum SFR / NeufBox / Numéricable
56 réponses
Si tu fait ce que j'ai dit ici perl reseaux#15
l'ip qui est dans le fichier de configuration sera affiché sur STDOUT (l'écran)
lami20j
l'ip qui est dans le fichier de configuration sera affiché sur STDOUT (l'écran)
lami20j
Je te mets ce qui est dans STDOUT
~/perl$ ./daemon.pl
~/perl$ ./daemon.pl
stephanie@ubuntu:~/perl$ Use of uninitialized value in concatenation (.) or string at ./daemon.pl line 77, <CONFIG> line 10. 192.168.1.2 Use of uninitialized value in concatenation (.) or string at ./daemon.pl line 77, <CONFIG> line 10. 192.168.1.2
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Tu utilises quel version de Perl?
Tu es sur quel Ubuntu?
Chez moi sous debian avec perl 5.8.4 ça fonctionne sans problème
Je vais voir demain sur ubuntu
En ce qui concerne le reste des tests, tu ne t'en sors pas?
En ce qui concerne Perl, sur une echelle de 0 à 20 tu es où? Tu n'est pas obligé de repondre.
lami20j
Tu es sur quel Ubuntu?
Chez moi sous debian avec perl 5.8.4 ça fonctionne sans problème
Je vais voir demain sur ubuntu
En ce qui concerne le reste des tests, tu ne t'en sors pas?
En ce qui concerne Perl, sur une echelle de 0 à 20 tu es où? Tu n'est pas obligé de repondre.
lami20j
Tu utilises quel version de Perl?
v5.8.7
Tu es sur quel Ubuntu?
Ubuntu Breezy
Chez moi sous debian avec perl 5.8.4 ça fonctionne sans problème
Je vais voir demain sur ubuntu
En ce qui concerne le reste des tests, tu ne t'en sors pas?
En ce qui concerne Perl, sur une echelle de 0 à 20 tu es où? Tu n'est pas obligé de repondre.
A la fac ou je suis, on a des cours de perl en accélére et cet exo à faire dans la foulée.
Je comprends ce qui est table de hashage, référence, tableau ... mais pour ce qui est des modules et des expressions régulières, ça coince ...
C'est pour ça que j'ai du mal avec l'exo.
v5.8.7
Tu es sur quel Ubuntu?
Ubuntu Breezy
Chez moi sous debian avec perl 5.8.4 ça fonctionne sans problème
Je vais voir demain sur ubuntu
En ce qui concerne le reste des tests, tu ne t'en sors pas?
En ce qui concerne Perl, sur une echelle de 0 à 20 tu es où? Tu n'est pas obligé de repondre.
A la fac ou je suis, on a des cours de perl en accélére et cet exo à faire dans la foulée.
Je comprends ce qui est table de hashage, référence, tableau ... mais pour ce qui est des modules et des expressions régulières, ça coince ...
C'est pour ça que j'ai du mal avec l'exo.
Re,
je viens de tester avec Perl 5.8.7 sous Cygwin et je n'ai pas des erreurs.
Je vois 2 solutions (une possible, la 2ème c'est une utopie
1ère - donc j'ai créer un rép /home/stephanie/perl et j'ai mis tes fichier dédans - chez moi ça fonctionne
Il faut que tu me dises (mais en détails) étape par étape ce que tu fait
2ème - tu me laisse me connecter chez toi par le biais d'un server ssh pour que je voie où est le problème
lami20j
je viens de tester avec Perl 5.8.7 sous Cygwin et je n'ai pas des erreurs.
Je vois 2 solutions (une possible, la 2ème c'est une utopie
1ère - donc j'ai créer un rép /home/stephanie/perl et j'ai mis tes fichier dédans - chez moi ça fonctionne
Il faut que tu me dises (mais en détails) étape par étape ce que tu fait
2ème - tu me laisse me connecter chez toi par le biais d'un server ssh pour que je voie où est le problème
lami20j
Salut,
J'ai la honte, je suis c** :-((
J'ai trouvé l'explication :-))))))))))))))))))))))))))))
Ce message n'est pas un erreur mais seulement un warnning qui nous dit qu'on a une variable qui reste undef au cours d'exécution du script
Use of uninitialized value in concatenation (.) or string at ./daemon.pl line 76, <CONFIG> line 10
Ce qui m'a induit en erreur c'est seulement la vérification de la variable $remotehost qui prend sa valeur depuis le fichier de configuration.
Mais ce n'est pas cette variable qui fait apparaître ce message d'avertissment mais la varible $remote
Et c'est ici que ça coince
La 1ère ligne dit
Et quand on essaie d'écrire avec
Pourtant je t'ai posé la question dans mon message N°20 https://forums.commentcamarche.net/forum/affich-2453825-perl-reseaux#20
As-tu une adresse 192.168.1.2 sur ton réseau?
je n'ai pas écrit un message si la machine n'existe pas
Voilà maintenant ce que tu dois ajouter à ton code pour ne plus avoir ce message d'avertissement (la partie en gras)
si le ping ne fonctionne pas alors $date $remotehost non connecté ou innexistant sera inscrit dans le journal
Les fichiers de ton message 14 https://www.commentcamarche.net/s/http-www-commentcamarche-net-forum-affich-2453825-perl-reseaux-14 sont ok.
En ce qui concernte l'arrêt avec kill
Quand tu fait ps aux | grep daemon.pl tu doit avoir un résultat de genre
lami20j
P.S. des fois il y a des petites choses devant nos yeux et on ne les voit pas :-(
Mais c'est bien quand on les decouvre :-)
Essaie de lire les messages attentivement et de me repondre ce que je te demande, pour eviter les casses tête.
Je parle de ma question As-tu une adresse 192.168.1.2 sur ton réseau?
Je n'ai pas resté toute la nuit pour trouver ça, mais je me suis couché en pensant à ça, et voilà que je me reveille avec l'explication :-))
J'ai la honte, je suis c** :-((
J'ai trouvé l'explication :-))))))))))))))))))))))))))))
Ce message n'est pas un erreur mais seulement un warnning qui nous dit qu'on a une variable qui reste undef au cours d'exécution du script
Use of uninitialized value in concatenation (.) or string at ./daemon.pl line 76, <CONFIG> line 10
Ce qui m'a induit en erreur c'est seulement la vérification de la variable $remotehost qui prend sa valeur depuis le fichier de configuration.
Mais ce n'est pas cette variable qui fait apparaître ce message d'avertissment mais la varible $remote
$remotehost = $1 if /remote\.ping\s*($ip)/i;Jusqu'ici tout vas bien, $remotehost contiendra l'IP depuis le fichier de configuration
Et c'est ici que ça coince
La 1ère ligne dit
#Si tu arrive faire un ping alors $remote va contenir if ($ping->ping($remotehost)){ #cette valeur $remote = "$date $remotehost en vie"; }Comme je n'ai pas traité le cas ou le ping ne fonctionne pas, et comme dans ton cas 192.168.1.2 ,n'existe pas sur ton réseau, alors $remote reste indefini.
Et quand on essaie d'écrire avec
print DAEMON "$date daemon fonctionne\n$local\n$remote\n";On a le message d'avertissement Use of uninitialized value in concatenation (.) or string...................
Pourtant je t'ai posé la question dans mon message N°20 https://forums.commentcamarche.net/forum/affich-2453825-perl-reseaux#20
As-tu une adresse 192.168.1.2 sur ton réseau?
je n'ai pas écrit un message si la machine n'existe pas
Voilà maintenant ce que tu dois ajouter à ton code pour ne plus avoir ce message d'avertissement (la partie en gras)
if ($ping->ping($remotehost)){ $remote = "$date $remotehost en vie"; } else { # $remote contient une valeur si la condition du IF est fausse $remote = "$date $remotehost non connecté ou innexistant"; }Donc je traite le cas else
si le ping ne fonctionne pas alors $date $remotehost non connecté ou innexistant sera inscrit dans le journal
Les fichiers de ton message 14 https://www.commentcamarche.net/s/http-www-commentcamarche-net-forum-affich-2453825-perl-reseaux-14 sont ok.
En ce qui concernte l'arrêt avec kill
Quand tu fait ps aux | grep daemon.pl tu doit avoir un résultat de genre
root 7276 0.0 1.3 6776 3540 ? Ss 08:25 0:00 /usr/bin/perl ./ddd.pltu dois faire kill 7276
lami20j
P.S. des fois il y a des petites choses devant nos yeux et on ne les voit pas :-(
Mais c'est bien quand on les decouvre :-)
Essaie de lire les messages attentivement et de me repondre ce que je te demande, pour eviter les casses tête.
Je parle de ma question As-tu une adresse 192.168.1.2 sur ton réseau?
Je n'ai pas resté toute la nuit pour trouver ça, mais je me suis couché en pensant à ça, et voilà que je me reveille avec l'explication :-))
Ben,
alors j'ai le temps :-))
a savoir que
System.disk(’hda3’,95) ou System.disk(’/home’,90) occupation disque
ne veut pas dire qu'il s'agit d'une fonction Perl, mais de la syntaxe du fichier de configuration
A savoir que
fichier de configuration pour lequel vous utiliserez la syntaxe qui vous semblera la plus judicieuse ; une syntaxe vous est proposée, mais vous êtes libre de l’améliorer ou d’en changer complètement.
lami20j
alors j'ai le temps :-))
a savoir que
System.disk(’hda3’,95) ou System.disk(’/home’,90) occupation disque
ne veut pas dire qu'il s'agit d'une fonction Perl, mais de la syntaxe du fichier de configuration
A savoir que
fichier de configuration pour lequel vous utiliserez la syntaxe qui vous semblera la plus judicieuse ; une syntaxe vous est proposée, mais vous êtes libre de l’améliorer ou d’en changer complètement.
lami20j
J'essaye de coder le System.disk suivant ce que tu avais déjà créer
J'ai écrit dans le fichier de configuration
puis dans le fichier perl (je n'ai écrit que ce que j'ai aouté), j'essaye de récupérer les parametres
Ca ne fonctionne pas
J'ai écrit dans le fichier de configuration
#Systeme linux system.disk('hda3',95)
puis dans le fichier perl (je n'ai écrit que ce que j'ai aouté), j'essaye de récupérer les parametres
use FileSys::Df; my $disk = FileSys::Df->new(); my ($name,$val); while (<CONFIG>){ # on saute les commentaires next if /^#/; # je recupere le nom du fichier et la valeur ($name,$val) = ($1,$2) if /system.\disk\.('(\w+)',(\d+))/i; } open DAEMON,">> /home/stephanie/perl/log.daemon" or die "E/S : $!\n"; if(defined($disk->df($name)){ if($disk->df->{per} == $val){ print "ok\n"; } else{ print "erreur\n"; } }
Ca ne fonctionne pas
Il me semble que ce module ne se trouve pas dans les modules standard.
Ce qui veut dire que le daemon ne pourra pas être exécuter sans avoir d'abord télécharger et ensuite installer ce module.
En ce cas il y a 2 possibilités :
- ma version avec la commande df
- utiliser un bloc BEGIN pour avertir l'utilisateur que le module n'existe pas, mais le daemon pourra continuer sinon le daemon va planter
J'ai utilisé que des modules standard.
Voilà à quoi ça rassemble un bloc BEGIN dans ton code au cas ou le module n'est pas installé.
P.S. Je pense que la version avec df est assez bonne pour eviter le bloc BEGIN
Ce qui veut dire que le daemon ne pourra pas être exécuter sans avoir d'abord télécharger et ensuite installer ce module.
En ce cas il y a 2 possibilités :
- ma version avec la commande df
- utiliser un bloc BEGIN pour avertir l'utilisateur que le module n'existe pas, mais le daemon pourra continuer sinon le daemon va planter
J'ai utilisé que des modules standard.
Voilà à quoi ça rassemble un bloc BEGIN dans ton code au cas ou le module n'est pas installé.
#!/usr/bin/perl use warnings;use strict; BEGIN { unless (eval "use Filesys::Df"){ warn "Le module Filesys::Df n'existe pas sur votre OS.\n" } else { my ($name,$val); while (<CONFIG>){ next if /^#/; ($name,$val) = ($1,$2) if /system.\disk\.('(\w+)',(\d+))/i; } open DAEMON,">> /home/stephanie/perl/log.daemon" or die "E/S : $!\n"; my $disk=df($name,$val); if(defined($disk)){ print "$name $disk->{per}\n"; } else{ print "erreur\n"; } } } print "Le programme continue\n";lami20j
P.S. Je pense que la version avec df est assez bonne pour eviter le bloc BEGIN
Salut,
tu dois être cohérente dans ton fichier de config
au lieu de
system.disk('hda3',95)
mets plutôt
system.disk('hda3',95) ça rassemble plutôt à une fonction qu'à une entrée dans un fichier de configuration :-)
j'ai créé un script shell pour le démarrer le daemon et pour l'arrêter
Pour démarrer il faut utiliser des options
par exemple -f pour journaliser que ftp, -w que http, -l localhost
mais je n'ai pas fini
A savoir que pour l'instant j'ai travaillé dans le même répertoire
Voilà ce que j'ai pour l'instant
1. le script de démarrage ou arrêt exod
tu dois être cohérente dans ton fichier de config
au lieu de
system.disk('hda3',95)
mets plutôt
system.disk hda3 95j'ai avancé un peu ton code
system.disk('hda3',95) ça rassemble plutôt à une fonction qu'à une entrée dans un fichier de configuration :-)
j'ai créé un script shell pour le démarrer le daemon et pour l'arrêter
Pour démarrer il faut utiliser des options
par exemple -f pour journaliser que ftp, -w que http, -l localhost
mais je n'ai pas fini
A savoir que pour l'instant j'ai travaillé dans le même répertoire
Voilà ce que j'ai pour l'instant
1. le script de démarrage ou arrêt exod
#!/bin/bash case $1 in 'start') perl exo ;; 'stop') kill -9 $(cat pid.exo) rm -f pid.exo ;; *) echo "Usage: perl exo {start|stop}" ;; esac2. le daemon exo
#!/usr/bin/perl use warnings;use strict; use POSIX; use Time::HiRes; use Net::Ping; use Net::HTTP; use Net::FTP; use Getopt::Std; my $ping = Net::Ping->new(); my ($dev,$blocks); my ($local,$remote); my $freq; my ($localhost,$remotehost); my ($url,$surl); my ($ftp,$sftp); my (%CODE,%options); # fichier pid.exo # contient le PID du daemon open PID_EXO,">pid.exo" or die "E/S : $!\n"; # fichier de configuration open CONFIG,"exo.conf" or die "E/S : $!\n"; while (<CONFIG>){ # on saute les commentaires next if /^#/; # la frequence $freq=$1 if /frequency\s*(\d+)/i; # l'hôte locale $localhost = $1 if /local\.ping\s*(\w+)/i; # l'hôte distante à vérifiier $remotehost = (split /\s+/,$_)[1] if /^remote\.ping/i; # l'URL a vérifier $surl = (split /\s+/,$_)[1] if /^internet\.url/i; # le serveur ftp à vérifier $sftp = (split /\s+/,$_)[1] if /^internet\.ftp/i; # partition vérifier + taille du block ($dev,$blocks) = (split /\s+/,$_)[1,2] if /^system\.disk/i; } $dev ="/dev/$dev"; # exécution de script en tant que daemon # print PID_EXO $$+1; my $pid=fork; exit if $pid; die "fork impossible : $!" unless defined($pid); POSIX::setsid() or die "Pas de nouvelle session : $!\n"; my $kill_pid = 0; sub gestion_signaux { $kill_pid = 1; } $SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&gestion_signaux; ##################################### # TRAITEMENT CODE # ##################################### # %CODE=( 'all'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; if ($ping->ping($localhost)){ $local = "$date $localhost en vie"; } if ($ping->ping($remotehost)){ $remote = "$date $remotehost en vie"; } else { $remote = "$date $remotehost non connecté ou innexistant"; } if ( ($url = Net::HTTP->new(Host => "$surl")) and ($url->write_request(GET => "/")) ) { print DAEMON "$date $surl valide et existe sur web\n"; } else { print DAEMON "$date $surl inexistant || hors connexion || format invalide\n"; } if($ftp = Net::FTP->new("$sftp", Debug => 0)){ print DAEMON "$date $sftp connexion réussi\n"; } else { print DAEMON "$date $sftp connexion echouée\n"; } $ftp->quit; print DAEMON "$date\n@{ [`df --block-size=$blocks $dev`] }; $local; $remote\n"; FIN 'ftp'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; if($ftp = Net::FTP->new("$sftp", Debug => 0)){ print DAEMON "$date $sftp connexion réussi\n"; close DAEMON; } else { print DAEMON "$date $sftp connexion echouée\n"; close DAEMON; } $ftp->quit; FIN 'http'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; if ( ($url = Net::HTTP->new(Host => "$surl")) and ($url->write_request(GET => "/")) ) { print DAEMON "$date $surl valide et existe sur web\n"; close DAEMON; } else { print DAEMON "$date $surl inexistant || hors connexion || format invalide\n"; close DAEMON; } FIN 'local'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; if ($ping->ping($localhost)){ $local = "$date $localhost en vie\n"; print DAEMON "$local"; close DAEMON; } FIN 'remote'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; if ($ping->ping($remotehost)){ $remote = "$date $remotehost en vie"; print DAEMON "$remote\n"; close DAEMON; } else { $remote = "$date $remotehost non connecté ou innexistant"; print DAEMON "$remote\n" close DAEMON; } FIN 'dev'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; print DAEMON "$date\n@{ [`df --block-size=$blocks $dev`] }\n"; close DAEMON; FIN ); #========FIN TRAITEMENT CODE========# # Traitement des options qu'on puisse passer au script # le message qui s'affice sur STDOUT # si on exécute le script sans aucune option getopts("alrfwhd",\%options); sub utilisation { die <<EOF ______________________________________________ Utilisation: $0 Option Options : -a - tout les options -d - vérification partition -l - ping localhost -r - ping un hôte distant -f - teste une connexion ftp -w - test la validite et l'existence d'un URL -h - aide courte -H - aide longue ______________________________________________ EOF } # le Daemon va exécuter # chaque N secondes # le jurnal log.exo a le format # jj/mm/yyyy hh:mm:ss information # until ($kill_pid) { # calcule la date et l'heure du test my $date =strftime "%d/%m/%Y %H:%M:%S",localtime; SWITCH: { if($options{a}){ eval "$CODE{all}"; sleep($freq); last SWITCH } if($options{l}){ eval "$CODE{local}"; sleep($freq); last SWITCH } if($options{w}){ eval "$CODE{remote}";sleep($freq); last SWITCH } if($options{f}){ eval "$CODE{ftp}"; sleep($freq); last SWITCH } if($options{w}){ eval "$CODE{http}"; sleep($freq); last SWITCH } if($options{d}){ eval "$CODE{dev}"; sleep($freq); last SWITCH } 1 && utilisation(); } } __END__3. le fichier de configuration exo.conf
################################################ # # # EXO DAEMON RESEAU # # # ################################################ # Syntaxe du fichier de configuration # Entre le mot clé et la valeur # on utilise uniquement un espace # on peux avoir plusieurs valeur sur la même ligne # mot valeur valeur valeur # mot.cle valeur valeur valeur # la frequence dont le daemon execute les testes # Ex : Frequenci NN # frequency insensible à la case # NN nombre de secondes frequency 10 # vérification de la connexion # faire un ping vers une machine (locale ou distante) local.ping localhost remote.ping 192.168.1.20 # vérification d'existance et de la validité # d'un URL internet.url google.fr # test d'un serveur FTP internet.ftp ftp.kernel.org # test espace partition system.disk hda7 95lami20j
Dans le message précedente il y a quelques erreurs.
je vais réecrire ce message, ne cherche pas à trouver les erreurs :-)
lami20j
je vais réecrire ce message, ne cherche pas à trouver les erreurs :-)
lami20j
1. le script de démarrage ou arrêt exod
2. le daemon exo
3. le fichier de configuration exo.conf
#!/bin/bash case $1 in 'start') perl exo ;; 'stop') kill -9 $(cat pid.exo) rm -f pid.exo ;; *) echo "Usage: perl exo {start|stop}" ;; esac
2. le daemon exo
#!/usr/bin/perl use warnings;use strict; use POSIX; use Time::HiRes; use Net::Ping; use Net::HTTP; use Net::FTP; use Getopt::Std; my $ping = Net::Ping->new(); my ($dev,$blocks,$local,$remote,$freq); my ($localhost,$remotehost,$url,$surl); my ($ftp,$sftp,$user,$passwd); my (%CODE,%options); # fichier pid.exo # contient le PID du daemon open PID_EXO,">pid.exo" or die "E/S : $!\n"; # fichier de configuration open CONFIG,"exo.conf" or die "E/S : $!\n"; # récupération des données depuis # le fichier de configuratin exo.conf while (<CONFIG>){ next if /^#/; # sauter les commentaires $freq=$1 if /frequency\s*(\d+)/i; $localhost = $1 if /local\.ping\s*(\S+)/i; $remotehost = (split /\s+/,$_)[1] if /^remote\.ping/i; $surl = (split /\s+/,$_)[1] if /^internet\.url/i; ($sftp,$user,$passwd) = (split /\s+/,$_)[1..3] if /^internet\.ftp/i; ($dev,$blocks) = (split /\s+/,$_)[1,2] if /^system\.disk/i; } # exécution de script en tant que daemon print PID_EXO $$+1; my $pid=fork; exit if $pid; die "fork impossible : $!" unless defined($pid); POSIX::setsid() or die "Pas de nouvelle session : $!\n"; my $kill_pid = 0; sub gestion_signaux { $kill_pid = 1; } $SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&gestion_signaux; # consomation disque $dev ="/dev/$dev"; my $d=(`df --block-size=$blocks $dev`)[1]; my @d = split /\s+/,$d; ##################################### # TRAITEMENT CODE # ##################################### # %CODE=( 'all'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; if ($ping->ping($localhost)){ $local = "$date $localhost en vie"; } if ($ping->ping($remotehost)){ $remote = "$date $remotehost en vie"; } else { $remote = "$date $remotehost non connecté ou innexistant"; } if ( ($url = Net::HTTP->new(Host => "$surl")) and ($url->write_request(GET => "/")) ) { print DAEMON "$date $surl valide et existe sur web\n"; } else { print DAEMON "$date $surl inexistant || hors connexion || format invalide\n"; } if($ftp = Net::FTP->new("$sftp") and $ftp->login($user,$passwd)){ print DAEMON "$date $sftp connexion réussi\n"; } else { print DAEMON "$date $sftp connexion echouée\n"; } $ftp->quit; print DAEMON "$date Sys. de fichiers : $d[0] $date ${blocks}B-blocs : $d[1] $date Occupé : $d[2] $date Disponible : $d[3] $date Capacité : $d[4] $date Monté sur : $d[5] $local; $remote\n"; close DAEMON; FIN 'ftp'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; if($ftp = Net::FTP->new("$sftp") and $ftp->login($user,$passwd)){ print DAEMON "$date $sftp connexion réussi\n"; close DAEMON; } else { print DAEMON "$date $sftp connexion echouée\n"; close DAEMON; } $ftp->quit; FIN 'http'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; if ( ($url = Net::HTTP->new(Host => "$surl")) and ($url->write_request(GET => "/")) ) { print DAEMON "$date $surl valide et existe sur web\n"; close DAEMON; } else { print DAEMON "$date $surl inexistant || hors connexion || format invalide\n"; close DAEMON; } FIN 'local'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; if ($ping->ping($localhost)){ $local = "$date $localhost en vie\n"; print DAEMON "$local"; close DAEMON; } FIN 'remote'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; if ($ping->ping($remotehost)){ $remote = "$date $remotehost en vie"; print DAEMON "$remote\n"; close DAEMON; } else { $remote = "$date $remotehost non connecté ou innexistant"; print DAEMON "$remote\n"; } FIN 'dev'=> <<'FIN', open DAEMON,">> log.exo" or die "E/S : $!\n"; print DAEMON "$date Sys. de fichiers : $d[0] $date ${blocks}B-blocs : $d[1] $date Occupé : $d[2] $date Disponible : $d[3] $date Capacité : $d[4] $date Monté sur : $d[5]\n"; close DAEMON; FIN ); #==========TRAITEMENT CODE==========# # # Traitement des options qu'on puisse passer au script # le message qui s'affice sur STDOUT # si on exécute le script sans aucune option getopts("alrfwhdH",\%options); sub utilisation { die <<EOF Utilisation: $0 Option Options : -a - tout les options -d - vérification partition -l - ping localhost -r - ping un hôte distant -f - teste une connexion ftp -w - test la validite et l'existence d'un URL -h - aide courte -H - aide longue EOF } # le Daemon va exécuter # chaque N secondes il va écrire # le journal log.exo a le format #jj/mm/yyyy hh:mm:ss information # until ($kill_pid) { # calcule la date et l'heure du test my $date =strftime "%d/%m/%Y %H:%M:%S",localtime; SWITCH: { if($options{a}){ eval "$CODE{all}"; sleep($freq); last SWITCH } if($options{l}){ eval "$CODE{local}"; sleep($freq); last SWITCH } if($options{r}){ eval "$CODE{remote}";sleep($freq); last SWITCH } if($options{f}){ eval "$CODE{ftp}"; sleep($freq); last SWITCH } if($options{w}){ eval "$CODE{http}"; sleep($freq); last SWITCH } if($options{d}){ eval "$CODE{dev}"; sleep($freq); last SWITCH } 1 && utilisation(); } } __END__
3. le fichier de configuration exo.conf
################################################ # # # EXO DAEMON RESEAU # # # ################################################ # Syntaxe du fichier de configuration # Entre le mot clé et la valeur # on utilise uniquement un espace # on peux avoir plusieurs valeur sur la même ligne # mot valeur valeur valeur # mot.cle valeur valeur valeur # la frequence dont le daemon execute les testes # Ex : Frequenci NN # frequency insensible à la case # NN nombre de secondes frequency 10 # vérification de la connexion # faire un ping vers une machine (locale ou distante) local.ping 127.0.0.1 remote.ping 192.168.1.2 # vérification d'existance et de la validité # d'un URL internet.url www.commentcamarche.net # test d'un serveur FTP internet.ftp ftp.fr.debian.org anonymous user@yahoo.fr # test espace partition system.disk hda7 954. le fichier log.exo rassemble à
05/11/2006 23:39:15 www.commentcamarche.net valide et existe sur web 05/11/2006 23:39:15 ftp.fr.debian.org connexion réussi 05/11/2006 23:39:15 Sys. de fichiers : /dev/hda7 05/11/2006 23:39:15 95B-blocs : 106915215 05/11/2006 23:39:15 Occupé : 64492986 05/11/2006 23:39:15 Disponible : 36903581 05/11/2006 23:39:15 Capacité : 64% 05/11/2006 23:39:15 Monté sur : /home 05/11/2006 23:39:15 127.0.0.1 en vie 05/11/2006 23:39:15 192.168.1.2 en vielami20j
Merci lami20j
J'ai essayé de compiler le code mais ça m'indique que je n'avais pas le module Net::HTTP.
J'ai donc voulu l'installer avec cette commande mais ça me met ceci :
ESt-ce que c'est bien le paquet libwww-perl qu'il faut installer ?
Si c'est le cas, sais-tu comment résoudre cela ?
J'ai essayé de compiler le code mais ça m'indique que je n'avais pas le module Net::HTTP.
~$ ./exo.pl Can't locate Net/HTTP.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.7 /usr/local/share/perl/5.8.7 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at ./exo.pl line 7. BEGIN failed--compilation aborted at ./exo.pl line 7.
J'ai donc voulu l'installer avec cette commande mais ça me met ceci :
stephanie@ubuntu:~$ sudo apt-get install libwww-perl Password: Lecture des listes de paquets... Fait Construction de l'arbre des dépendances... Fait Les paquets supplémentaires suivants seront installés : libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl liburi-perl Paquets suggérés : libio-socket-ssl-perl Paquets recommandés : libmailtools-perl libhtml-format-perl libcompress-zlib-perl Les NOUVEAUX paquets suivants seront installés : libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl liburi-perl libwww-perl 0 mis à jour, 5 nouvellement installés, 0 à enlever et 139 non mis à jour. Il est nécessaire de prendre 0o/769ko dans les archives. Après dépaquetage, 2322ko d'espace disque supplémentaires seront utilisés. Souhaitez-vous continuer [O/n] ? O Changement de support : veuillez insérer le disque « Ubuntu 5.10 _Breezy Badger_ - Release i386 (20051012) » dans le lecteur « /cdrom/ » et appuyez sur la touche Entrée
ESt-ce que c'est bien le paquet libwww-perl qu'il faut installer ?
Si c'est le cas, sais-tu comment résoudre cela ?
En principe, s'il n'y a pas d'erreur avec Net::Ping et Net::FTP, c'est que le module Net est présent.
L'erreur est donc bizzarre
L'erreur est donc bizzarre
Attention Net n'est pas un module mais un répertoire qui contient des modules.
Quand tu vois Net::HTTP en fait il s'agit du moduel Net::HTTP qui veut dire qu'il y a un répertoire parmi ce qui se trouve dans @INC qui contient le module HTTP.pm
Ici tu trouves le module Net::HTTP https://metacpan.org/search?q=net%3A%3Ahttp
J'ai avancé ton daemon. J'ai écrit l'envoie du mail.
Si ça t'interesse j'affiche le code ainsi que le fichier de configuration (j'ai changer la mise en page). De toute façon ce week-end je vais le finir.
A savoir que j'ai mis des options.
Si tu fait ./exo.pl tu auras un message qui va t'afficher les options disponibles (mais je n'ai pas fini encore)
par exemple
./exo.pl -a -prends en compte tout les options
./exo.pl -l - teste le ping localhost
etc...
Il faut contrôler un peu le daemon.
En plus l'option -a n'exécute pas l'envoie de mail, mais je peux l'inclure.
Encore une chose. Le fichier de configuration est traiter par le script pour une seule ligne mais on peut le personnaliser pour prendre en compte plusieurs
par exemple si j'écrit
internet.ping xxx.xxx.xxx.xxx
internet.ping xxx.xxx.xxx.xxx
le daemon ne va pas tester les deux
Tu as du remarquer que j'ai mis le code à exécuter dans un hachage ensuite dans SWITCH je fait un eval{$hachage{cle}
Si tu veux que je continue fait un signe, sinon je vais m'arrêter là.
A toi.
lami20j
Quand tu vois Net::HTTP en fait il s'agit du moduel Net::HTTP qui veut dire qu'il y a un répertoire parmi ce qui se trouve dans @INC qui contient le module HTTP.pm
Ici tu trouves le module Net::HTTP https://metacpan.org/search?q=net%3A%3Ahttp
J'ai avancé ton daemon. J'ai écrit l'envoie du mail.
Si ça t'interesse j'affiche le code ainsi que le fichier de configuration (j'ai changer la mise en page). De toute façon ce week-end je vais le finir.
A savoir que j'ai mis des options.
Si tu fait ./exo.pl tu auras un message qui va t'afficher les options disponibles (mais je n'ai pas fini encore)
par exemple
./exo.pl -a -prends en compte tout les options
./exo.pl -l - teste le ping localhost
etc...
Il faut contrôler un peu le daemon.
En plus l'option -a n'exécute pas l'envoie de mail, mais je peux l'inclure.
Encore une chose. Le fichier de configuration est traiter par le script pour une seule ligne mais on peut le personnaliser pour prendre en compte plusieurs
par exemple si j'écrit
internet.ping xxx.xxx.xxx.xxx
internet.ping xxx.xxx.xxx.xxx
le daemon ne va pas tester les deux
Tu as du remarquer que j'ai mis le code à exécuter dans un hachage ensuite dans SWITCH je fait un eval{$hachage{cle}
Si tu veux que je continue fait un signe, sinon je vais m'arrêter là.
A toi.
lami20j