finit.pl

Author Wim Nelis
Compatibility Xymon 4.2
Requirements Perl, unix
Download None
Last Update 2010-05-31

Tests in Xymon may result in time-series of data, which are stored in RRD databases. As the configuration changes, tests are changed and hosts come and go, a number of RRD databases are no longer updated. Xymon contains a tool to cleanup outdated (historical) data, but it does not remove the associated RRD databases. Script finit.pl generates a list of RRD databases which have not been updated for some time. This list is sorted on the date of the last update.

The result of script finit.pl is a list, but formatted as a shell script which removes those RRD databases. The list can be reviewed and edited if necessary before it is executed by a shell. The user of the script thus can control which inactive RRD database are retained and which are removed.

Save the perl script at a suitable directory on the server containing the RRD files, for instance in ~xymon/bin. Then change the variable $HomeDir to point to the directory containing the collection of RRD files, typically ~xymon/data/rrd

Script finit.pl can be used in the following way:

  • cd <ScriptDir>
  • ./finit.pl > finit.out
  • vi finit.out
  • ksh finit.out

finit.pl

Show finit.pl ⇲

Hide finit.pl ⇱

finit.pl
#!/usr/bin/perl
#
# FINd_Inactive_Tests, finit:
#  Make a list of the RRD databases, which have not been updated for some
#  time. The tests (measurements) are organised per host. If all tests of
#  one host are not updated for some time, the host rather than the tests
#  is reported.
#
# The report is written to standard output, and is in fact a shell script
# which contains the commands to delete the outdated RRD databases. This
# intermediate file allows for inspection and modification, before the
# RRD databases are actually deleted.
#
use strict ;
 
#
# Installation constants.
#
my $HomeDir= '/home/xymon/data/rrd/' ;  # Top of dir tree to search
my $Threshold= 7 * 86400 ;      # Minimum age of old measurement
 
#
# Global variables.
#
my %Host= () ;                  # List of inactive hosts
my %Test= () ;                  # List of inactive tests
my $FullName ;                  # Full path name of a file
my $TotFileCnt= 0 ;             # Number of files checked
my $TotInactCnt= 0 ;            # Number of inactive tests
 
#
# Function GetTime returns the date in "yyyymmdd" notation, given a timestamp.
#
sub GetTime($) {
  my $TimeStamp= shift ;        # Unix time stamp
  my @Time= (localtime($TimeStamp))[3..5] ;
  $Time[1]++ ;  $Time[2]+=1900 ;
  return sprintf '%4d%02d%02d', reverse @Time ;
}  # of GetTime
 
#
# Function ScanDir scans the given directory, and all of its subdirectories,
# for RRD files, which are not updated for at least $Threshold seconds. The
# results are stored in %Test and %Host.
#
sub ScanDir($) ;                # Prototype definition
sub ScanDir($) {
#
# Scan the supplied directory for (a) subdirectories and (b) RRD database
# files. The last modification date of the database is compared with the
# current time. If old enough, it is reported as an inactive measurement.
#
  my $FullDir= shift ;          # Absolute pathname of directory to scan
  my @Files ;                   # Files and subdirectories
  my %Old ;
  my $LastModTime ;             # Time of last modification of a file
  my ($FileCnt,$InactCnt) ;     # Count number of files & inactive tests
 
  opendir( DH, $FullDir )       or die "Can't open $FullDir : $!\n" ;
  @Files= grep /^[^\.]/, readdir( DH ) ;
  closedir( DH ) ;
 #
 # Check each subdirectory within this subdirectory too.
 #
  foreach ( sort @Files ) {
    $FullName= $FullDir . $_ . '/' ;
    next                unless -d $FullName ;   # Skip non-directories
    ScanDir( $FullName ) ;      # Scan this directory too
  }  # of foreach
 #
 # Check the files in the current subdirectory.
 #
# print "# Scanning $FullDir\n" ;
  $FileCnt= $InactCnt= 0 ;      # Preset counters
  %Old= () ;                    # Preset list
  foreach ( sort @Files ) {
    $FullName= $FullDir . $_ ;
    next                unless -f $FullName ;   # Skip non-files
    $FileCnt++ ;
    next                unless m/\.rrd$/ ;      # Skip non-RRD files
 
    $LastModTime= (stat($FullName))[9] ;
    if ( time - $LastModTime > $Threshold ) {
      $InactCnt++ ;
      push @{$Old{GetTime($LastModTime)}}, $FullName ;
    }  # of if
  }  # of foreach
  $TotFileCnt += $FileCnt  ;
  $TotInactCnt+= $InactCnt ;
  if ( $FileCnt == $InactCnt  and  $InactCnt > 0 ) {
    $LastModTime= (sort keys %Old)[-1] ;
    push @{$Host{$LastModTime}}, $FullDir ;
  } else {
    foreach ( keys %Old ) {
      push @{$Test{$_}}, @{$Old{$_}} ;
    }  # of foreach
  }  # of else
}  # of scanDir
 
print "# Searching for inactive RRD measurements\n" ;
ScanDir( $HomeDir ) ;
printf "#   %5d files scanned\n", $TotFileCnt ;
printf "#   %5d inactive tests found\n", $TotInactCnt ;
 
if ( keys %Host ) {
  print "#\n" ;
  print "# List of formerly tested hosts.\n" ;
  foreach ( sort keys %Host ) {
    print "\n" ;
    print "# Not updated since $_\n" ;
    foreach $FullName ( @{$Host{$_}} ) {
      print "rm -rf $FullName\n" ;
    }  # of foreach
  }  # of foreach
} #  of if
 
if ( keys %Test ) {
  print "\n#\n" ;
  print "# List of inactive tests.\n" ;
  foreach ( sort keys %Test ) {
    print "\n" ;
    print "# Not updated since $_\n" ;
    foreach $FullName ( @{$Test{$_}} ) {
      print "rm $FullName\n" ;
    }  # of foreach
  }  # of foreach
}  # of if
 
__END__
 
=head1 NAME
 
finit.pl - The name of the script is an acronym of FINd_Inactive_Tests. It
generates on standard output a list of RRD database which have not been
updated for some time, indicating that the associated tests are not active
any more. 
 
=head1 DESCRIPTION
 
Test in Xymon may result in time-series of data, which are stored in RRD
databases. As the configuration changes, tests are changed and hosts come
and go, a number of RRD databases are no longer updated. Xymon contains
a tool to cleanup outdated (historical) data, but it does not remove the
associated RRD databases. Script finit.pl generates a list of RRD databases
which have not been updated for some time. This list is sorted on the date
of the last update.
 
The result of script finit.pl is a list, but formatted as a shell script
which removes those RRD databases. The list can be reviewed and edited if
necessary before it is executed by a shell. The user of the script thus
can control which inactive RRD database are retained and which are removed.
 
=head1 AUTHOR
 
Wim Nelis, nelis@nlr.nl, 2009.08

None known.

  • 2010-05-31
    • Initial release
  • addons/finit.txt
  • Last modified: 2012/07/11 15:00
  • (external edit)