Bonjour à tous,

Je suis actuellement entrain d'écrire un petit script pour vérifier qu'un serveur DHCP fonctionne. Si il fonctionne je dois indiquer le temps pris par la requête. Si il ne fonctionne pas (ou si il prend + de X secondes), je dois mettre un message d'erreur.

Pour ce faire, j'utilise le module NET:HCP::WATCH (http://search.cpan.org/~ejdrs/Net-DH...-2.03/Watch.pm et le module Object:estroyer (conseillé par Jedai : http://www.developpez.net/forums/d36...-timeout-perl/).

J'ai d’abord créé un petit script pour vérifier que mon implémentation de l'alarm fonctionne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use Object::Destroyer;
 
eval {
 
    local $SIG{ALRM} = sub { die("alarm\n") };
 
    alarm(4);
	my $sentry = Object::Destroyer->new( sub {alarm(0)} );
 
	#Get Status
    sleep (2)
 
};
 if ($@) {
 
		print "Je rentre via l'alarm";
 
}
else {
   print "je ne rentre pas via l'alarm";}
Ce script fonctionne donc le code pour l'alarm aussi.

Je passe donc au script pour tester le serveur DHCP :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use Time::HiRes;
use Object::Destroyer;
use Net::DHCP::Watch;
 
 
  # server name
  my $Server = '192.168.1.1';
  # this machine ip and ethernet address
  my $IP     = '192.168.1.2';
  my $Ether  = '00:23:CD:CE:43:DC';
  my $timeout = 5;
 
  my $stat ='';
 
 # Net::DHCP::Watch object
  my $dhcpw = new Net::DHCP::Watch({
                server => $Server,
                client => $IP,
                ether  => $Ether,
		timeout => $timeout
        });
 
  # Open network
  $dhcpw->watch();
 
  my $start = [ Time::HiRes::gettimeofday( ) ];
 
eval {
 
    local $SIG{ALRM} = sub { die("alarm\n") };
 
    alarm(4);
	my $sentry = Object::Destroyer->new( sub {alarm(0)} );
 
	#Get Status
    $stat = $dhcpw ->status;
 
};
 if ($@) {
 
		print "Error";
}
else {
 
  $elapsed = Time::HiRes::tv_interval( $start );
  $elapsed = $elapsed * 1000;
 
  # print results
 
  if ( $stat->{Ok}  ) 
  {  
    print "Remote DHCP $Server online.\n";
	print "Dhcptime;$elapsed;ms";
 }
 else 
 { print "Error";
 }
}
Quand je mets un bon serveur DHCP qui fonctionne, il m'indique assez rapidement la bonne réponse.

Quand j'indique un serveur qui n'est pas bon (et donc sans service DHCP), il reste coincé dans la fonction "$dhcpw ->status;" et ne veut pas en sortir malgré mon alarm et mon timeout.

Je n'arrive pas à le faire sortir de cette fonction. Est-ce relatif au module DHCP? Si c'est le cas, je n'arrive pas à comprendre pourquoi je ne sais pas le faire stopper.

Un grand merci pour votre aide!