#! /usr/bin/perl use strict ; use warnings ; package Probe::Ping ; use base 'Probe' ; # ping_server msec ping server sub ITEMS { [ { name => 'ping_server' , kind => 'msec' , args => [ qw(server) ] } , { name => 'ping_client' , kind => 'int' , args => [ qw(client) ] } ] ; } ; # save last_state ; last N pings [{fine=>0,sick=>1}], including current ping ; # init : last_state = undef ; last_pings = [] ; # result : last_pings all fine ? 1 : ( last_pings all sick ? 0 : last_state ) our $N = 5 ; our %last_pings ; our %last_value ; sub all { my $row = shift ; my $val = shift ; not scalar grep { $_ != $val } @$row ; } sub main { my $self = shift ; my $itms = shift ; # items to probe : [ item, ... ] my $clnt = shift ; # main::CLIENT for my $item ( sort { $a -> name cmp $b -> name } @$itms ) { my $clas = $item -> args -> [ 0 ] ; if ( $clas eq 'server' ) { my $ping = $clnt -> server -> ping ( 5 ) ; OBB::TT 'ping %s %s', $clnt -> server, $ping ; $item -> set_val ( $ping ) if defined $ping ; } elsif ( $clas eq 'client' ) { my $hnam = $item -> hnam ; my $ping = defined ( Util::ping $hnam, 5 ) ? 0 : 1 ; OBB::TT 'ping %s %s', 'client', $hnam ; $last_pings { $hnam } = [] unless $last_pings { $hnam } ; my $pings = $last_pings { $hnam } ; my $lastv = $last_value { $hnam } ; push @$pings, $ping ; while ( @$pings > $N ) { shift @$pings ; } my $val = ( all ( $pings, 0 ) ? 0 : ( all ( $pings, 1 ) ? 1 : ( defined $lastv ? $lastv : $ping ) ) ) ; $last_value { $hnam } = $val ; $item -> set_val ( $val ) ; } } } 1 ;