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 :
Ce script fonctionne donc le code pour l'alarm aussi.
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";}
Je passe donc au script pour tester le serveur DHCP :
Quand je mets un bon serveur DHCP qui fonctionne, il m'indique assez rapidement la bonne réponse.
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 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!
Partager