|
|
|
|
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.
Salut,
# la frequence dont le daemon execute les testes # Ex : Frequenci NN # frequency insensible à la case # NN nombre de secondes frequency 10 2. le script daemon.pl Le daemon va écrire tous les 10 secondes dans /var/log/log.daemon jj/mm/yyyy hh:mm:ss daemon fonctionne jj/mm/yyyy hh:mm:ss localhost en vie #!/usr/bin/perl
use warnings;use strict;
use POSIX;
use Time::HiRes;
use Net::Ping;
my $ping = Net::Ping->new();
my $resultat;
my $freq;
# fichier de configuration
open CONFIG,"/etc/mon_daemon.conf"
or die "E/S : $!\n";
while (<CONFIG>){
# on saute les commentaires
next if /^#/;
# je recupere la frequence
$freq=$1 if /frequency\s*(\d+)/i;
}
# exécution du script en tant que daemon
#
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;
# les taches que le daemon exécute
# chaque 10 secondes il va écrire
# dans /var/log/log.daemon
# dans le format
#jj/mm/yyyy hh:mm:ss daemon fonctionne
#jj/mm/yyyy hh:mm:ss localhost en vie
#
until ($kill_pid) {
# calcule la date et l'heure du teste
# pour affichage dans journal
my ($s,$mm,$h,$j,$m,$y) = (localtime)[0..5];
$j = sprintf("%02d",$j);
$m = sprintf("%02d",$m +=1);
$y +=1900;
$s = sprintf("%02d",$s);
$mm = sprintf("%02d",$mm);
$h = sprintf("%02d",$h);
my $date = "$j/$m/$y $h:$mm:$s";
open DAEMON,">> /var/log/log.daemon"
or die "E/S : $!\n";
if ($ping->ping("localhost")){
$resultat = "$date localhost en vie\n";
}
print DAEMON "$date daemon fonctionne\n$resultat";
sleep($freq);
}3. le fichier /var/log/log.daemon02/11/2006 22:15:34 daemon fonctionne 02/11/2006 22:15:34 localhost en vie 02/11/2006 22:15:44 daemon fonctionne 02/11/2006 22:15:44 localhost en vie 02/11/2006 22:15:54 daemon fonctionne 02/11/2006 22:15:54 localhost en vie 02/11/2006 22:16:04 daemon fonctionne 02/11/2006 22:16:04 localhost en vie 02/11/2006 22:16:14 daemon fonctionne 02/11/2006 22:16:14 localhost en vieTu remarques que le résultat est enregistré toutes les 10 secondes dans le fichier de configuration tu peux changer la fréquence de test lami20j |
Bien sûr ce n'est qu'un début.
|
J'ai ajouté dans le fichier de configuration localhost et un ip depuis mon LAN
# 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.22. le script modifié #!/usr/bin/perl
use warnings;use strict;
use POSIX;
use Time::HiRes;
use Net::Ping;
my $ping = Net::Ping->new();
my ($local,$remote);
my $freq;
my ($localhost,$remotehost);
my $ip = qr/(?:\d{1,3}\.){3}\d{1,3}/;
# fichier de configuration
open CONFIG,"/etc/mon_daemon.conf"
or die "E/S : $!\n";
while (<CONFIG>){
# on saute les commentaires
next if /^#/;
# je recupere la frequence
$freq=$1 if /frequency\s*(\d+)/i;
# je recupere l'hôte locale
$localhost = $1 if /local\.ping\s*(\w+)/i;
# je recupere l'hôte distante à vérifiier
$remotehost = $1 if /remote\.ping\s*($ip)/i;
}
# exécution de script en tant que daemon
#
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;
# les taches que le daemon exécute
# chaque 10 secondes il va écrire
# dans /var/log/log.daemon
# dans le format
#jj/mm/yyyy hh:mm:ss daemon fonctionne
#jj/mm/yyyy hh:mm:ss localhost en vie
#
until ($kill_pid) {
# calcule la date et l'heure du teste
# pour affichage dans journal
my ($s,$mm,$h,$j,$m,$y) = (localtime)[0..5];
$j = sprintf("%02d",$j);
$m = sprintf("%02d",$m +=1);
$y +=1900;
$s = sprintf("%02d",$s);
$mm = sprintf("%02d",$mm);
$h = sprintf("%02d",$h);
my $date = "$j/$m/$y $h:$mm:$s";
open DAEMON,">> /var/log/log.daemon"
or die "E/S : $!\n";
if ($ping->ping($localhost)){
$local = "$date $localhost en vie";
}
if ($ping->ping($remotehost)){
$remote = "$date $remotehost en vie";
}
print DAEMON "$date daemon fonctionne\n$local\n$remote\n";
sleep($freq);
}
3. le journal /var/log/log.daemon02/11/2006 23:10:26 daemon fonctionne 02/11/2006 23:10:26 localhost en vie 02/11/2006 23:10:26 192.168.1.2 en vie 02/11/2006 23:10:36 daemon fonctionne 02/11/2006 23:10:36 localhost en vie 02/11/2006 23:10:36 192.168.1.2 en vie 02/11/2006 23:10:46 daemon fonctionne 02/11/2006 23:10:46 localhost en vie 02/11/2006 23:10:46 192.168.1.2 en vie 02/11/2006 23:10:56 daemon fonctionne 02/11/2006 23:10:56 localhost en vie 02/11/2006 23:10:56 192.168.1.2 en vie 02/11/2006 23:11:06 daemon fonctionne 02/11/2006 23:11:06 localhost en vie 02/11/2006 23:11:06 192.168.1.2 en vielami20j |
Merci beaucoup lami20j pour ton aide.
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)
...
Dans l'énoncé, les Internet. et System. indiquent en faite le module a utilisé pour pouvoir utilisé les fonctions ping, tcp etc ... c'est bien cela ? Comment on fait pour savoir dans quel module se trouve une fonction qu'il me faudra utiliser ? |
Re,
|
Pour System.disk(’hda3’,95) ou System.disk(’/home’,90) occupation disque voilà ce que j'ai trouvé sur cpan
|
Salut,
Use of uninitialized value in concatenation (.) or string at ./daemon.pl line 76, <CONFIG> line 10 Est-ce que c'est pareil chez toi et est-ce que tu as pu regarder de plus pret ? |
Dit plutôt ce que tu fait.
|
J'ai écrit les fichiers .conf et .pl dans un repétoire perl qui est dans mon /home/ en modifant les chemins pour que ce soit pris en compte.
Use of uninitialized value in concatenation (.) or string at ./daemon.pl line 76, <CONFIG> line 10 J'ai aussi rajouté l'option -w dans #!/usr/bin/perl -w |
La ligne 76 du script
|
Le fichier de configuration est le même que celui que tu avais écrit :
# 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.2 |
Les 2 fichiers:
# la frequence dont le daemon execute les testes # Ex : Frequenci NN # frequency insensible à la case # NN nombre de secondes frequency 60 # vérification de la connexion # faire un ping vers une machine (locale ou distante) local.ping localhost remote.ping 192.168.1.2 et #!/usr/bin/perl
use warnings;
use strict;
use POSIX;
use Time::HiRes;
use Net::Ping;
my $ping = Net::Ping->new();
my ($local,$remote);
my $freq;
my ($localhost,$remotehost);
my $ip = qr/(?:\d{1,3}\.){3}\d{1,3}/;
# fichier de configuration
open CONFIG,"/home/stephanie/perl/mon_daemon.conf"
or die "E/S : $!\n";
while (<CONFIG>){
# on saute les commentaires
next if /^#/;
# je recupere la frequence
$freq=$1 if /frequency\s*(\d+)/i;
# je recupere l'hôte locale
$localhost = $1 if /local\.ping\s*(\w+)/i;
# je recupere l'hôte distante à vérifiier
$remotehost = $1 if /remote\.ping\s*($ip)/i;
}
# exécution de script en tant que daemon
#
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;
# les taches que le daemon exécute
# chaque 60 secondes il va écrire
# dans /var/log/log.daemon
# dans le format
#jj/mm/yyyy hh:mm:ss daemon fonctionne
#jj/mm/yyyy hh:mm:ss localhost en vie
#
until ($kill_pid) {
# calcule la date et l'heure du teste
# pour affichage dans journal
my ($s,$mm,$h,$j,$m,$y) = (localtime)[0..5];
$j = sprintf("%02d",$j);
$m = sprintf("%02d",$m +=1);
$y +=1900;
$s = sprintf("%02d",$s);
$mm = sprintf("%02d",$mm);
$h = sprintf("%02d",$h);
my $date = "$j/$m/$y $h:$mm:$s";
open DAEMON,">> /home/stephanie/perl/log.daemon"
or die "E/S : $!\n";
if ($ping->ping($localhost)){
$local = "$date $localhost en vie";
}
if ($ping->ping($remotehost)){
$remote = "$date $remotehost en vie";
}
print DAEMON "$date daemon fonctionne\n$local\n$remote\n";
sleep($freq);
}
|
J'ai mis frequancy a 20 pour avoir plus de résultats.
03/11/2006 22:11:13 daemon fonctionne 03/11/2006 22:11:13 localhost en vie 03/11/2006 22:11:38 daemon fonctionne 03/11/2006 22:11:38 localhost en vie 03/11/2006 22:12:03 daemon fonctionne 03/11/2006 22:12:03 localhost en vie 03/11/2006 22:12:28 daemon fonctionne 03/11/2006 22:12:28 localhost en vie 03/11/2006 22:12:53 daemon fonctionne 03/11/2006 22:12:53 localhost en vie 03/11/2006 22:13:18 daemon fonctionne 03/11/2006 22:13:18 localhost en vie 03/11/2006 22:13:27 daemon fonctionne 03/11/2006 22:13:27 localhost en vie 03/11/2006 22:13:43 daemon fonctionne 03/11/2006 22:13:43 localhost en vie 03/11/2006 22:13:52 daemon fonctionne 03/11/2006 22:13:52 localhost en vie 03/11/2006 22:14:03 daemon fonctionne 03/11/2006 22:14:03 localhost en vie 03/11/2006 22:14:17 daemon fonctionne 03/11/2006 22:14:17 localhost en vie 03/11/2006 22:14:28 daemon fonctionne 03/11/2006 22:14:28 localhost en vie 03/11/2006 22:14:42 daemon fonctionne 03/11/2006 22:14:42 localhost en vie |
Pour ce qui est des différentes options qu'il faut coder :
• 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 :Frequency(60) while (<CONFIG>){
# on saute les commentaires
next if /^#/;
# je recupere la frequence
$freq=$1 if /frequency\s*(\d+)/i;
# je recupere l'hôte locale
$localhost = $1 if /local\.ping\s*(\w+)/i;
# je recupere l'hôte distante à vérifiier
$remotehost = $1 if /remote\.ping\s*($ip)/i;
}
... Ici, c'est le résultat des lignes.
open DAEMON,">> /home/stephanie/perl/log.daemon"
or die "E/S : $!\n";
if ($ping->ping($localhost)){
$local = "$date $localhost en vie";
}
if ($ping->ping($remotehost)){
$remote = "$date $remotehost en vie";
}
Dans le fichier de configuration, comment doivent s'écrire toutes les commandes pour analyse ? # la frequence dont le daemon execute les testes # Ex : Frequenci NN # frequency insensible à la case # NN nombre de secondes frequency 20 # vérification de la connexion # faire un ping vers une machine (locale ou distante) local.ping localhost remote.ping 192.168.1.2 |