#!/usr/bin/perl -w

# $Id: map_states,v 1.2 2006/11/27 13:04:35 fany Exp $

use 5.008;
use strict;
use warnings;

use Text::Abbrev qw(abbrev);

use constant STATES => { OK => 0, WARNING => 1, UNKNOWN => 255, CRITICAL => 2 };
use constant STATES_ABBREV => scalar abbrev keys %{ +STATES };
use constant STATES_RE => qr/${\ join '|', keys %{+STATES_ABBREV}, '\d+' }/i;

sub state($) {
    my ($state) = @_;
    return $state if $state =~ /^\d+\z/;
    defined( my $n = STATES->{ STATES_ABBREV->{ uc $state } } )
      or die qq("Unbekannter Status "$state".\n);
    $n;
}

exec perldoc => -F => $0 unless @ARGV;

my @remap;
while ( defined( my $arg = shift ) ) {
    unless ( $arg =~ /=/ ) {
        unshift @ARGV, $arg;
        last;
    }
    elsif ( $arg eq '=' ) { last }
    elsif ( $arg =~ /^(${\STATES_RE})=(${\STATES_RE})\z/ ) {
        push @remap, [ state($1), state($2) ];
    }
    elsif ( $arg =~ m#^/(.*)/=(${\STATES_RE})\z# ) {
        my $qr = eval "qr/$1/";
        if ( length $@ ) {
            die "Ungltiger regulrer Ausdruck: /$1/ ($@)\n";
        }
        push @remap, [ $qr, state($2) ];
    }
    else {
        die "Unbekanntes Argument: $arg\n";
    }
}

open my $proc, '-|', @ARGV or die "open('-|', '@ARGV'): $!\n";
undef $/;
my $text = <$proc>;
close $proc;
print $text;
my $exitcode = $? >> 8;

ref $_->[0] ? $text =~ $_->[0] : $exitcode == $_->[0] and exit $_->[1]
  for @remap;
exit $exitcode;

=head1 NAME

map_states -- Status-Umbasteleien fr Nagios-Plugins

=head1 SYNOPSIS

  map_states /foo/=OK Crit=Warn OK=42 = plugin arg1 arg2 ...

=head1 BESCHREIBUNG

Dies ist ein Wrapper zum Aufruf von Nagios-Plugins, mit dem der Rckgabestatus
des Plugins nachtrglich verndert werden kann, und zwar nach folgenden
Kriterien:

=over 4

=item Status=Status

Liefert das Plugin den links vom Gleichheitszeichen stehenden Status, so wird
dieser durch den rechts angegebenen ersetzt.

=item /RegExp/=Status

Passt der angegebene regulre Ausdruck auf den Rckgabetext des aufgerufenen
Plugins, wird dessen ursprnglicher Rckgabestatus durch den angegebenen
ersetzt.

=item =

Ein isoliertes Gleichheitszeichen fhrt zum Abbruch der Analyse der
Kommandozeilenargumente, d. h. das nchste Argument wird dann als Name des
aufzurufenden Plugins betrachtet und alle weiteren als dessen Argumente.
Im Allgemeinen wird dies allerdings nicht erforderlich sein, da die Verarbeitung
beim ersten Argument, das kein Gleichheitszeichen enthlt, ebenfalls abgebrochen
wird.

=back

Die Regeln werden dabei von links nach rechts abgearbeitet; bei der ersten
passenden wird die Verarbeitung abgebrochen, d. h. es gilt dann der dort
definierte Status.
Stati knnen dabei wahlweise numerisch oder ber ihren Namen, der dabei auch
abgekrzt werden darf, spezifiziert werden.

Der Rckgabetext des Plugins bleibt hingegen grundstzlich unverndert.

=head1 AUTOR

 Martin H. Sluka <sluka@noris.net>
 fr die noris network AG

=cut
