NetSaint -> Nagios: Retention data conversion
Ramiro Morales
rm-rpms at gmx.net
Wed Sep 25 19:17:17 CEST 2002
Hi all,
I've just finished putting together (attached) a quick script
to convert the status.sav NetSaint retention data file to the
new format used by Nagios.
This n2n-* script is the third of a set I made for inclusion on
my Nagios RPM package that helps in migrate from NetSaint
(the other two scripts migrate log files [using the rename command
as suggested by the Nagios doc] and object definition files
[using Ethan's convertcfg tool] respectively).
The script works great for me with both file formats used by
different NetSaint version but I have no previous Perl progra-
mming experience and I'm posting it so people can test/use and
contribute changes and enhancements.
Ethan may even want to include [a variation of it] in the Nagios
tarball, perhaps filling the value of the $nagios_version
variable with a appropiate Nagios version token at ./configure
time so it keeps synchronized with future software/retention
data file format versions.
For people going to test the script: Dont'forget to stop
NetSaint before using the retention data as the NetSaint
process updates it on exit.
Thanks.
-
Ramiro
-------------- next part --------------
#!/usr/bin/perl -wT
# n2n-retention.pl
#
# Convert NetSaint retention data files to the new Nagios format.
#
# Ramiro Morales <rm-rpms at gmx.net>
no strict 'refs';
sub usage {
print <<EOT;
Usage:
$0 [options...] [<NetSaint-status-retention-file>]
Options:
--pfp <program-level failure prediction setting default value>
--ppp <program-level process performance data setting default value>
--hfp <host-level failure prediction setting default value>
--hpp <host-level process performance data setting default value>
--sfp <service-level failure prediction setting default value>
--spp <service-level process performance data setting default value>
--soos <service-level obsess over service setting default value>
--sct <service-level check type setting default value>
EOT
exit 1;
}
my ($ftype, $ldata, $ltype, @fields, $i, $limit);
$ftype = 0;
$pfp = $ppp = $hfp = $hpp = $sfp = $spp = $soos = $sct = 0;
my $nagios_version = "1.0";
# Process command line options
while (@ARGV && $ARGV[0] =~ /^--(.+)/ && (shift, ($_ = $1), 1)) {
/^(pfp|ppp|hfp|hpp|sfp|spp|soos|sct)$/ && ($$1 = shift @ARGV);
usage if (!defined $$1 || $$1 !~ /[01]/);
}
@ARGV = ($ARGV[0]) unless @ARGV <= 1;
unshift (@ARGV, '-') unless @ARGV;
while (<>) {
chomp;
$ldata = $_;
# Detect the format of the input file
#Trying to process an already converted file?
if ($ldata =~ /#\ Nagios.+Retention\ File/) {
die "This file is already a Nagios status retention file";
}
# Status retention data file, pre NetSaint 0.0.7a5 format
if ($ldata =~ /#\ NetSaint\ Host\/Service/) {
$ftype = 1;
}
# status retention data file, post NetSaint 0.0.7a5 format
if ($ldata =~ /#\ NetSaint.+Retention\ File/) {
$ftype = 2;
}
die "Unknown file type" if ($ftype == 0);
if ($. == 1) {
print "# Nagios $nagios_version Retention File\n";
next;
}
# If the record has retention data for an entity, detect the type
if ($ldata =~ /^(PROGRAM|HOST|SERVICE): /) {
$ltype = $1;
$ldata =~ s/^$ltype: //;
}
# Process records that have retention data for an entity,
# the rest of the records will fall thru
if (defined ( $ltype ) ) {
if ($ltype eq "PROGRAM") {
@fields = split(';', $ldata, 8);
# Insert new fields as required by the new format
if (@fields == 5) {
push(@fields, 1);
}
if (@fields < 8) {
push(@fields, $pfp, $ppp);
}
}
if ($ltype eq "HOST") {
$limit = ($ftype == 1)?13:15;
@fields = split(';', $ldata, $limit);
# Insert new fields as required by the new format
if ($ftype == 1) {
$fields[16] = $fields[12];
$fields[12] = 1;
$fields[15] = time;
} else {
@fields[15,16] = @fields[13,14];
}
$fields[13] = $hfp;
$fields[14] = $hpp;
}
if ($ltype eq "SERVICE") {
$limit = ($ftype == 1)?16:18;
@fields = split(';', $ldata, $limit);
# Insert new fields as required by the new format
if ($ftype == 1) {
$fields[21] = $fields[15];
@fields[5..15] = @fields[4..14];
$fields[16] = 1;
$fields[20] = time;
} else {
@fields[20,21] = @fields[16,17];
@fields[5..16] = @fields[4..15];
}
$fields[4] = $sct;
$fields[17] = $sfp;
$fields[18] = $spp;
$fields[19] = $soos;
}
# Assemble the new record
if ( defined ( @fields ) ) {
$ldata = "$ltype: $fields[0]";
for ($i = 1; $i < @fields; $i++) {
$ldata .= ";$fields[$i]";
}
}
}
undef @fields;
undef $ltype;
print "$ldata\n";
close ARGV if eof;
}
#eof
More information about the Users
mailing list