aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2025-11-21 21:33:02 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2025-11-21 21:33:02 +0100
commit818fc4c700f04f8e178caeb109e2336ed01b7a5a (patch)
tree02e76eb0b34c047ec4cd618f8840bf33e5a67899
parent268c093799d2546a38769ec9a364b53f423ad87a (diff)
downloaddabmux-818fc4c700f04f8e178caeb109e2336ed01b7a5a.tar.gz
dabmux-818fc4c700f04f8e178caeb109e2336ed01b7a5a.tar.bz2
dabmux-818fc4c700f04f8e178caeb109e2336ed01b7a5a.zip
Remove broken Xymon retodrs.plnext
-rw-r--r--README.md2
-rw-r--r--doc/README.md4
-rw-r--r--doc/retodrs.pl645
3 files changed, 3 insertions, 648 deletions
diff --git a/README.md b/README.md
index 90d6402..97417e5 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@ The `src/` directory contains the source code of ODR-DabMux and the additional
tools.
The `doc/` directory contains the ODR-DabMux documentation, a few example
-configuration files, and the munin and xymon scripts for the statistics server.
+configuration files, and the munin script for the statistics server.
The `lib/` directory contains source code of libraries needed to build
ODR-DabMux.
diff --git a/doc/README.md b/doc/README.md
index 31f6378..beabf3a 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -49,8 +49,8 @@ An explanation on how to use the remote control is in *remote_control.txt*, and
*zmq_remote.py* illustrates how to control ODR-DabMux using the ZMQ remote
control interface.
-Two scripts are used for monitoring systems: *stats_dabmux_munin.py* for Munin,
-and *retodrs.pl* for Xymon. You can use *show_dabmux_stats.py* to print the
+The *stats_dabmux_munin.py* script is used for the munin monitoring systems.
+You can use *show_dabmux_stats.py* to print the
statistics to console. The values are described in *STATS.md*
*DabMux.1* is an old manpage that describes the command line options that
diff --git a/doc/retodrs.pl b/doc/retodrs.pl
deleted file mode 100644
index f457ca2..0000000
--- a/doc/retodrs.pl
+++ /dev/null
@@ -1,645 +0,0 @@
-#!/usr/bin/perl -w
-#
-# RETrieve_Open_Digital_Radio_Status, retodrs:
-# Retrieve the status and statistics of an Opendigitalradio service and report
-# the results to Xymon. The information is retrieved from the management server
-# within ODR-DabMux.
-#
-# NOTE: This script MUST be run on the same machine as DabMux is running! The
-# management server within DabMux is only accessible from localhost.
-# Moreover, the check on availability only works for localhost.
-#
-# Written by W.J.M. Nelis, wim.nelis@ziggo.nl, 2016.12
-#
-use strict ;
-use Time::Piece ; # Format time
-use ZMQ::LibZMQ3 ; # Message passing
-use ZMQ::Constants qw(ZMQ_REQ) ;
-use JSON::PP ; # Decode server message
-
-#
-# Installation constants.
-# -----------------------
-#
-my $XyDisp = $ENV{XYMSRV} ; # Name of monitor server
-my $XySend = $ENV{XYMON} ; # Monitor interface program
-my $FmtDate = "%Y.%m.%d %H:%M:%S" ; # Default date format
- $FmtDate = $ENV{XYMONDATEFORMAT} if exists $ENV{XYMONDATEFORMAT} ;
-my $HostName= 'OzoNop' ; # 'Source' of this test
-my $TestName= 'odr_mux' ; # Test name
-my $XyInfo = "hostinfo host=$HostName" ; # Extract host info from xymon
-
-my @ColourOf= ( 'red', 'yellow', 'clear', 'green' ) ;
-
-#
-# Define the URL to access the management server in DabMux. The access is
-# limited to access from localhost!
-#
-my $ODRMgmtSrvr= 'tcp://127.0.0.1:12720' ; # URL of server
-
-#
-# Define the parameters to show in the table and how to enter them in an RRD.
-# From this definition a list of counter-like variables is compiled in hash
-# %Counters. The values of these variables need to be saved from one pass of
-# this script to the next.
-#
-my @Params= (
-# OdrName TableName RrdDefinition
- [ 'state' , 'State' , '' ],
- [ 'peak_left' , 'Peak left [dB]' , 'DS:PeakLeft:GAUGE:600:-100:100' ],
- [ 'peak_right' , 'Peak right [dB]', 'DS:PeakRight:GAUGE:600:-100:100' ],
- [ 'num_underruns', '' , 'DS:Underrun:DERIVE:600:0:U' ],
- [ 'num_overruns' , '' , 'DS:Overrun:DERIVE:600:0:U' ],
- [ 'rate_underruns', 'Underrun [/s]' , '' ],
- [ 'rate_overruns' , 'Overrun [/s]' , '' ],
- [ 'min_fill' , '' , 'DS:BufferMin:GAUGE:600:-1:U' ],
- [ 'max_fill' , '' , 'DS:BufferMax:GAUGE:600:0:U' ]
-) ;
-my %Counters= () ;
-foreach ( @Params ) {
- next unless $$_[2] =~ m/DERIVE/ ;
- $Counters{$$_[0]}= $$_[0] ; # Save name of counter-like variable
- $Counters{$$_[0]}=~ s/^num_/rate_/ ; # Build name of derived variable
-} # of foreach
-
-#
-# Define the thresholds for the various DabMux statistics and any derived
-# value.
-#
-my %Thresholds= (
- state => { red => qr/^(?:NoData)$/ },
- rate_underruns => { red => '20.0'},
- rate_overruns => { red => '20.0'},
-# peak_left => { yellow => ['< -80', '80'] },
-# peak_right => { yellow => ['< -80', '80'] }
-) ;
-
-#
-# Define the name of the file to hold the values of the counter-type variables.
-#
-my $SaveFile= '/usr/lib/xymon/client/ext/retodrs.sav' ;
-
-#
-# Global variables.
-# -----------------
-#
-my $Now= localtime ; # Timestamp of tests
- $Now= $Now->strftime( $FmtDate ) ;
-my $Colour= $#ColourOf ; # Test status
-my $Result= '' ; # Message to sent to Xymon
-
-my %HostInfo ; # Host information from xymon
-my %Table0= () ; # Tables with results
-my %Table1= () ;
-my @SubChannel= () ; # Subchannel assignment
-my %SubChannel= () ; # in both directions
-my %ErrMsg ; # Error messages
- $ErrMsg{$_}= [] foreach ( @ColourOf ) ;
-my ($CurTime,$PrvTime) ; # Times of measurement
-my %Prev= () ; # Variables in previous pass
-
-#
-# Save an error message in intermediate list %ErrMsg. Function InformXymon will
-# move these messages to the start of the xymon status message.
-#
-sub LogError($$) {
- my $clr= shift ; # Status/colour of message
- my $msg= shift ; # Error message
- return unless defined $msg ;
- return unless $msg ;
-
- chomp $msg ; # Clean up message, just to be sure
- $msg=~ s/^\s+// ; $msg=~ s/\s+$// ;
-
- if ( exists $ErrMsg{$clr} ) {
- push @{$ErrMsg{$clr}}, $msg ;
- } else {
- push @{$ErrMsg{clear}}, $msg ;
- } # of else
-} # of LogError
-
-#
-# Issue a message the the logfile. As this script is run periodically by Xymon,
-# StdOut will be redirected to the logfile.
-#
-sub LogMessage {
- my $Msg= shift ;
- my @Time= (localtime())[0..5] ;
- $Time[4]++ ; $Time[5]+= 1900 ;
- chomp $Msg ;
- printf "%4d%02d%02d %02d%02d%02d %s\n", reverse(@Time), $Msg ;
-} # of LogMessage
-
-sub max($$) { return $_[0] > $_[1] ? $_[0] : $_[1] ; }
-sub min($$) { return $_[0] < $_[1] ? $_[0] : $_[1] ; }
-
-
-#
-# Function AnError is given a short description and a boolean value, whose value
-# is false if the operation associated with the description failed. The result
-# of this function is the opposite of the boolean value supplied. If failed, the
-# description is entered in the error message list %ErrMsg, including the
-# content of $!, if the latter is not empty.
-#
-sub AnError($$) {
- if ( $_[1] ) {
- return 0 ; # Return a false value
- } else {
- my $msg= $! ; # Retrieve any error message
- if ( $msg eq '' ) {
- LogError( 'clear', "$_[0] failed" ) ;
- } else {
- LogError( 'clear', "$_[0] failed:" ) ;
- LogError( 'clear', " $msg" ) ;
- } # of else
- return 1 ; # Return a true value
- } # of else
-} # of AnError
-
-#
-# Function ApplyThresholds determines for which channels threshold checks should
-# be performed. Then it checks the collected statistics against their
-# thresholds, and sets the status of those statistics accordingly. The status of
-# the statistics which are not checked against a threshold are set to 'clear'.
-#
-sub ApplyThresholds() {
- my $hr ; # Reference in a multi-level hash
-
- #
- # Set flag ThresholdCheck at each subchannel. It is set to true if threshold
- # checks should be performed.
- #
- if ( exists $HostInfo{select}{list} ) {
- $hr= $HostInfo{select}{list} ;
- $Table1{$_}{ThresholdCheck}= exists $$hr{$_} ? 1 : 0 foreach ( keys %Table1 ) ;
- } else {
- $Table1{$_}{ThresholdCheck}= 1 foreach ( keys %Table1 ) ;
- } # of else
-
- #
- # Invoke function CheckValue for each pair {subchannel,statistic} for which a
- # threshold check should and can be performed.
- #
- foreach my $sub ( keys %Table1 ) {
- next unless $Table1{$sub}{ThresholdCheck} ;
- $hr= $Table1{$sub} ; # Ref to subchannel info
- foreach my $var ( keys %Thresholds ) {
- next unless exists $$hr{$var} ;
- CheckValue( $$hr{$var}, $Thresholds{$var} ) ;
- } # of foreach
- } # of foreach
-} # of ApplyThresholds
-
-#
-# Function BuildMessage takes the the status and statistics in hash %Table and
-# builds a message for Xymon.
-#
-sub BuildMessage() {
- my $RrdMsg ; # RRD message
- my $sub ; # Name of a sub channel
- my ($Value,$Status) ; # Value and status of one statistic
- my @Values ; # Values of one subchannel
- my $hr ; # Reference into a hash
-
- #
- # Check the subchannel assignment against the list of named subchannels. They
- # should match.
- #
- for ( my $i= 0 ; $i<= $#SubChannel ; $i++ ) {
- $hr= $SubChannel[$i] ;
- next unless defined $hr ;
- next if exists $Table1{$hr} ;
- $SubChannel[$i]= undef ;
- delete $SubChannel{$hr} ;
- } # of for
- foreach my $sub ( sort keys %Table1 ) {
- next if exists $SubChannel{$sub} ;
- $hr= $#SubChannel + 1 ;
- $SubChannel[$hr]= $sub ;
- } # of foreach
-
- #
- # Build a table showing the services.
- #
- $Result = "<table border=0>\n" ;
- foreach ( sort keys %Table0 ) {
- $Result.= " <tr> <td>$_</td> <td>$Table0{$_}</td> </tr>\n" ;
- } # of foreach
- $Result.= "</table>\n\n" ;
-
- #
- # Build the first part of the table to enter the statistics into RRD's and
- # ultimately into graphs.
- #
- $RrdMsg = "<!-- linecount=" . scalar(keys %Table1) . " -->\n" ;
- $RrdMsg.= "<!--DEVMON RRD: $TestName 0 0\n" ;
- $hr= join( ' ', map { $$_[2] } @Params ) ; # Extract RRD definitions
- $hr=~ s/^\s+// ; $hr=~ s/\s+$// ;
- $hr=~ s/\s{2,}/ /g ; # Remove superfluous spaces
- $RrdMsg.= "$hr\n" ;
-
- #
- # Build the table showing the subchannel status and statistics.
- #
- $Result.= "<table border=1 cellpadding=5>\n" ;
- $Result.= " <tr> <th>Nr.</th> <th>Subchannel</th>" ;
- foreach ( @Params ) {
- next unless $$_[1] ne '' ;
- $Result.= " <th>$$_[1]</th>" ;
- } # of foreach
- $Result.= " </tr>\n" ;
-
-# foreach my $sub ( sort keys %Table1 ) {
- for ( my $i= 0 ; $i<= $#SubChannel ; $i++ ) {
- $sub= $SubChannel[$i] ; # Next subchannel, numeric
- next unless defined $sub ;
- $hr= $Table1{$sub} ; # Ref into subchannel statistics
-
- $Result.= " <tr> <td align='right'>$i</td> <td>$sub</td>" ;
- foreach my $fld ( @Params ) {
- next unless $$fld[1] ne '' ;
- if ( exists $$hr{$$fld[0]} ) {
- $Value = $$hr{$$fld[0]}{Value} ;
- $Status= $$hr{$$fld[0]}{Status} ;
- if ( defined $Status ) {
- if ( $$fld[0] eq 'state' and $Status < 2 ) {
- LogError( $ColourOf[$Status], "$sub is $Value" ) ;
- } elsif ( $$fld[1] =~ m/^(\w+run) \[.+?\]$/ and $Status < 2 ) {
- LogError( $ColourOf[$Status], "$sub high " .lc($1) .": $Value $2" ) ;
- } # of elsif
- $Colour= min( $Colour, $Status ) ;
- $Status= " &$ColourOf[$Status] " ;
- } else {
- $Status= '' ;
- } # of else
-
- if ( $Value =~ m/^[-+]?\d+(:?\.\d+)?$/ ) {
- $Result.= " <td align='right'>$Status$Value</td>" ;
- } else {
- $Result.= " <td>$Value$Status</td>" ;
- } # of else
- } else {
- $Result.= " <td>Unknown</td>" ;
- } # of else
- } # of foreach
- $Result.= " </tr>\n" ;
-
- @Values= () ;
- foreach my $fld ( @Params ) {
- next unless $$fld[2] ne '' ;
- if ( exists $$hr{$$fld[0]} ) {
- $Value= $$hr{$$fld[0]}{Value} ;
- push @Values, $Value ;
- } else {
- push @Values, 'U' ;
- } # of else
- } # of foreach
- $RrdMsg.= "$sub " . join( ':', @Values ) . "\n" ;
-
- } # of foreach
- $Result.= "</table>\n" ;
- $RrdMsg.= "-->" ;
- $Result.= $RrdMsg ;
-} # of BuildMessage
-
-#
-# Function CheckPortStatus checks if the TCP port to access the management
-# server is available in listen mode. The function result is true if the TCP
-# port is found in the listen state, false otherwise.
-#
-sub CheckPortStatus($) {
- my $url= shift ; # The url to check
- my $Found= 0 ; # Function result
- my @F ; # Fields of a line image
-
- my @netstat= `netstat -ln4` ; # Retrieve port status info
- foreach ( @netstat ) {
- chomp ;
- @F= split ;
-# next unless @F == 6 ;
-# next unless $F[5] eq 'LISTEN' ;
- next unless "$F[0]://$F[3]" eq $url ;
- $Found= 1 ; # Port in listen state found
- last ; # Terminate search
- } # of foreach
- return $Found ;
-} # of CheckPortStatus
-
-#
-# Function CheckValue checks the value of a statistic against its threshold(s).
-# A reference to the value and a reference to the threshold definition are
-# passed.
-#
-sub CheckValue($$) {
- my $vr= shift ; # Reference to the variable
- my $tr= shift ; # Reference to the threshold descriptor
- my $clr ;
-
- $$vr{Status}= $#ColourOf ; # Default result
- return if $$vr{Value} eq 'wait' ;
-
- for ( my $i= $#ColourOf ; $i >= 0 ; $i-- ) {
- $clr= $ColourOf[$i] ;
- next unless exists $$tr{$clr} ;
- if ( ref($$tr{$clr}) eq 'ARRAY' ) {
- foreach ( @{$$tr{$clr}} ) {
- if ( ref($_) eq 'Regexp' ) { # Text check
- $$vr{Status}= $i if $$vr{Value} =~ m/$_/ ;
- } elsif ( m/^[-+\d\.]+$/ ) { # Numeric upperbound
- $$vr{Status}= $i if $$vr{Value} > $_ ;
- } elsif ( m/^<\s*([-+\d\.]+)$/ ) { # Numeric lowerbound
- $$vr{Status}= $i if $$vr{Value} < $1 ;
- } # of elsif
- } # of foreach
- } else {
- if ( ref($$tr{$clr}) eq 'Regexp' ) { # Text check
- $$vr{Status}= $i if $$vr{Value} =~ m/$$tr{$clr}/ ;
- } elsif ( $$tr{$clr} =~ m/^[-+\d\.]+$/ ) { # Numeric upperbound
- $$vr{Status}= $i if $$vr{Value} > $$tr{$clr} ;
- } elsif ( $$tr{$clr} =~ m/^<\s*([-+\d\.]+)$/ ) { # Numeric lowerbound
- $$vr{Status}= $i if $$vr{Value} < $1 ;
- } # of elsif
- } # of else
- } # of for
-
-} # of CheckValue
-
-#
-# Function ComputeRates computes the the rate of change of the counter-like
-# variables.
-#
-sub ComputeRates() {
- my $hr ;
- my $val ;
-
- foreach my $sub ( keys %Table1 ) {
- $hr= $Table1{$sub} ; # Ref into hash
-
- foreach my $var ( keys %Counters ) {
- $$hr{$Counters{$var}}{Value}= 'wait' ;
- $$hr{$Counters{$var}}{State}= undef ;
- if ( exists $Prev{$sub}{$var} and
- defined $$hr{$var}{Value} and
- defined $PrvTime ) {
- if ( $$hr{$var}{Value} >= $Prev{$sub}{$var} ) {
- $val= ( $$hr{$var}{Value} - $Prev{$sub}{$var} ) /
- ( $CurTime - $PrvTime ) ;
- $$hr{$Counters{$var}}{Value}= sprintf( '%.2f', $val ) ;
- } # of if
- } # of if
- } # of foreach
-
- } # of foreach
-} # of ComputeRates
-
-#
-# Function GetOneReply sends the supplied request to the management server and
-# returns the result as a reference to a hash. If something went wrong, the
-# result will be undef and an (appropiate?) error message is entered in %ErrMsg.
-#
-sub GetOneReply($$) {
- my $socket = shift ; # Socket object
- my $request= shift ; # Request string
-
- my $reqlng= length( $request ) ; # Length of request string
- my $rc= zmq_send( $socket, $request, $reqlng ) ;
- return undef if AnError( "Request \"$request\"", $rc == $reqlng ) ;
-
- my $reply= zmq_recvmsg( $socket ) ;
- return undef if AnError( "Reply on \"$request\"", defined $reply ) ;
-
- $reply= decode_json( zmq_msg_data($reply) ) ; # Convert to Perl structure
- return $reply ;
-} # of GetOneReply
-
-#
-# Function GetStatistics retrieves both the status and the statistics from the
-# server within the DabMux. The results are collected in hash %Table. Subhash
-# %{$Table{0}} will contain the service information, %{$Table{1}} will contain
-# the subchannel status and statistics.
-#
-sub GetStatistics() {
- my ($ctxt,$socket) ; # Connection variables
- my ($reply,$rv) ; # Request/reply variables
- my ($hr,$vr) ; # Refs into multi-level hash
-
- $CurTime= undef ; # No data collected yet
- #
- # Build a connection to the DabMux server.
- #
- $ctxt= zmq_ctx_new ;
- return undef if AnError( 'Building context object', defined $ctxt ) ;
- $socket= zmq_socket( $ctxt, ZMQ_REQ ) ;
- return undef if AnError( 'Creating socket', defined $socket ) ;
- $rv= zmq_connect( $socket, $ODRMgmtSrvr ) ;
- return undef if AnError( 'Connecting to DabMux', $rv == 0 ) ;
-
- $reply= GetOneReply( $socket, 'info' ) ;
- return undef unless defined $reply ;
- %Table0= %$reply ; # Save overview of services
-
- my $Once= 1 ; # Loop control variable
- while ( $Once ) {
- $Once= 0 ; # Only one iteration.
- #
- # Retrieve the subchannel assignment.
- #
- $reply= GetOneReply( $socket, 'getptree' ) ;
- if ( defined $reply ) {
- foreach my $sub ( keys %{$$reply{subchannels}} ) {
- $hr= $$reply{subchannels}{$sub} ;
- next unless exists $$hr{id} ;
- next unless $$hr{id} =~ m/^\d+$/ ;
- $SubChannel[$$hr{id}]= $sub ;
- $SubChannel{$sub}= $$hr{id} ;
- } # of foreach
- } else {
- next ; # Skip rest of retrievals
- } # of else
-
- #
- # Retrieve the status and the statistics.
- #
- $reply= GetOneReply( $socket, 'state' ) ;
- if ( defined $reply ) {
- foreach my $sub ( keys %$reply ) {
- $Table1{$sub}= {} ; # Preset result area
- $hr= $Table1{$sub} ;
- foreach ( keys %{$$reply{$sub}} ) {
- $$hr{$_}{Value} = $$reply{$sub}{$_} ;
- $$hr{$_}{Status}= undef ;
- } # of foreach
- } # of foreach
- } else {
- next ; # Skip retrieval of statistics
- } # of else
-
- $reply= GetOneReply( $socket, 'values' ) ;
- if ( defined $reply and exists $$reply{values} ) {
- $CurTime= time ; # Save time of retrieval
- foreach my $sub ( keys %{$$reply{values}} ) {
- next unless exists $Table1{$sub} ;
- next unless exists $$reply{values}{$sub}{inputstat} ;
- $hr= $Table1{$sub} ; # Ref to destination
- $vr= $$reply{values}{$sub}{inputstat} ; # Ref to source
- foreach ( keys %$vr ) {
- $$hr{$_}{Value} = $$vr{$_} ;
- $$hr{$_}{Status}= undef ;
- } # of foreach
- } # of foreach
-# } else {
-# next ;
- } # of else
-
- #
- # Terminate the connection to the DabMux server.
- #
- } continue {
- $rv= zmq_close( $socket ) ;
- AnError( 'Closing socket', $rv == 0 ) ;
- return 0 ; # Return a defined value
- } # of continue / while
-} # of GetStatistics
-
-
-#
-# Function GetXymonHostInfo retrieves the configuration of host $HostName from
-# the xymon configuration file hosts.cfg. If tag ODR is present, it is handled.
-#
-sub GetXymonHostInfo() {
- %HostInfo= ( select => { default => '^.+$' } ) ; # Default result
-
- my @Lines= `$XySend $XyDisp \"$XyInfo\"` ; # Retrieve host info
- if ( @Lines != 1 ) { # Handle error condition
- LogError( 'clear', 'Retrieval of host information from Xymon failed' ) ;
- return ;
- } # of if
-
- my ($Tag)= $Lines[0] =~ m/\b(ODR[^\s\|]+)/ ; # Extract tag ODR
- return unless defined $Tag ;
-# return if $Tag eq 'ODR' ;
-
- $Tag=~ s/^ODR\:// ; # Remove tag header
- foreach my $sub ( split( /,/, $Tag ) ) {
- if ( $sub =~ m/select\((.+)\)$/ ) {
- $HostInfo{select}{list}{$_}= 0 foreach ( split(/;/,$1) ) ;
- delete $HostInfo{select}{default} ;
- } # of if
- } # of foreach
-
-} # of GetXymonHostInfo
-
-#
-# Function InformXymon sends the message, in global variable $Result, to the
-# Xymon server. Any error messages in %ErrMsg are prepended to the message and
-# the status (colour) of the message is adapted accordingly.
-#
-sub InformXymon() {
- my $ErrMsg= '' ;
- my $Clr ; # Colour of one sub-test
-
- for ( my $i= 0 ; $i < @ColourOf ; $i++ ) {
- $Clr= $ColourOf[$i] ;
- next unless @{$ErrMsg{$Clr}} ;
- $Colour= min( $Colour, $i ) ;
- $ErrMsg.= "&$Clr $_\n" foreach ( @{$ErrMsg{$Clr}} ) ;
- } # of foreach
- $ErrMsg.= "\n" if $ErrMsg ;
-
- $Colour= $ColourOf[$Colour] ;
- $Result= "\"status $HostName.$TestName $Colour $Now\n" .
- "<b>Open Digital Radio DabMux status</b>\n\n" .
- "$ErrMsg$Result\"\n" ;
- `$XySend $XyDisp $Result` ; # Inform Xymon
-
- $Result= '' ; # Reset message parameters
- $Colour= $#ColourOf ;
- $ErrMsg{$_}= [] foreach ( @ColourOf ) ;
-} # of InformXymon
-
-
-#
-# Function RestoreCounters restores the values of counter-like variables,
-# collected in the previous pass of this script, in hash %Prev. However, if the
-# information is too old, nothing is restored.
-#
-sub RestoreCounters() {
- my @F ; # Fields in a line image
-
- %Prev= () ; # Clear save area
- $PrvTime= undef ;
- unless ( open( FH, '<', $SaveFile ) ) {
- LogError( 'yellow', "Can't read file $SaveFile : $!" ) ;
- LogMessage( "Can't read file $SaveFile : $!" ) ;
- return ;
- } # of unless
-
- while ( <FH> ) {
- chomp ;
- @F= split ;
- if ( $F[0] eq 'Time' ) {
- last unless ( time - $F[1] < 1000 ) ;
- $PrvTime= $F[1] ;
- } elsif ( $F[0] eq 'Counter' ) {
- $Prev{$F[1]}{$F[2]}= $F[3] ;
- } # of elsif
- } # of while
- close( FH ) ;
-} # of RestoreCounters
-
-# Function SaveCounters saves the counter-type variables in a file. They are
-# retrieved in the next pass of this script, and will be used to calculate the
-# rate in which these variables increase.
-#
-sub SaveCounters() {
- #
- # If the retrieval of the statistics failed, nothing should be saved. Perhaps
- # the information saved at the (a?) previous pass is usable in the next pass.
- #
- return unless defined $CurTime ;
-
- unless ( open( FH, '>', $SaveFile ) ) {
- LogError( 'yellow', "Can't write file $SaveFile : $!" ) ;
- LogMessage( "Can't write file $SaveFile : $!" ) ;
- return ;
- } # of unless
-
- print FH "Time $CurTime\n" ;
- foreach my $sub ( sort keys %Table1 ) {
- foreach my $var ( sort keys %{$Table1{$sub}} ) {
- next unless exists $Counters{$var} ;
- next unless defined $Table1{$sub}{$var}{Value} ;
- print FH "Counter $sub $var $Table1{$sub}{$var}{Value}\n" ;
- } # of foreach
- } # of foreach
- close( FH ) ;
-} # of SaveCounters
-
-
-#
-# MAIN PROGRAM.
-# =============
-#
-unless ( CheckPortStatus($ODRMgmtSrvr) ) { # If server down,
- LogMessage( "URL \"$ODRMgmtSrvr\" is not available" ) ;
- LogError( 'red', 'Server is not available' ) ;
- InformXymon ; # report error via xymon
- exit ; # and stop
-} # of unless
-
-unless ( defined GetStatistics ) { # If retrieval fails,
- InformXymon ; # report error via xymon
- exit ; # and stop
-} # of unless
-
-GetXymonHostInfo ; # Retrieve additional host info
-if ( keys %Counters ) {
- RestoreCounters ; # Get counters from previous pass
- ComputeRates ; # Compute their rate of change
- SaveCounters ; # Save counters for next pass
-} # of if
-
-ApplyThresholds ; # Check for out-of-range values
-BuildMessage ; # Build xymon message
-InformXymon ; # Send message to xymon
-