TINA steht für Tausend(s) IP-gesteuerte Nagios Ampel und stellt mit einer ausrangierten Verkehrsampel den Status des von Nagios ermittelten Systemstatus dar. Die bisherigen Erfahrungen zeigen, dass die Reaktionszeiten auf Störungen durch TINA deutlich verkürzt wurden, da Störungen einerseits schneller auffallen, andererseits die Motivation der Mitarbeiter gesteigert wird, den (für alle Kollegen sichtbaren) Status möglichst schnell wieder "grün" zu bekommen... .
Einkaufsliste:
- Koukaam NETIO-230B Steckdosenleiste mit integriertem LAN-Anschluss
- ausgediente Verkehrsampel mit 220V Birnen (z.B. bei Ebay ab ca. 30 €)
- ggf. je 3x Birnen, Schuko-Stecker, ausreichend Elektrokabel
Je nach Ausführung der Verkehrsampel verfügen diese bereits über 220V-Anschlüsse. Da viele der angebotenen Ampeln als Partykeller-Beleuchtung genutzt wurden, sind evtl. die 3 Farben parallel verschalten oder über Schalter geführt. Ziel ist letztendlich pro Farbe eine eigene Zuleitung mit einem Schuko-Stecker zur Verfügug zu haben. Praktischerweise gibt es Schukostecker auch schon in verschiedenen Farben, so dass man diese auch gleich in rot/gelb/grün kaufen kann.
Das Perl-Plugin für die Ansteuerung der Ampel:
#! /usr/bin/perl -w # # T.I.N.A: Tausend's Intelligente Nagios Ampel - nagios addon # # Version for Koukaam NETIO-230 LAN-controlled Power-Switch x4 # # Copyright (C) 2012 Thomas Tausend # by
Diese E-Mail-Adresse ist gegen Spambots geschützt! JavaScript muss aktiviert werden, damit sie angezeigt werden kann.
# # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
use POSIX; use strict; use Getopt::Long; use LWP::UserAgent; use Data::Dumper; use File::Basename; use Time::HiRes qw/usleep/; use Net::Telnet;
&Getopt::Long::config('bundling');
my %PATTERNS = ( 'green' => '1000', 'yellow' => '0100', 'red' => '0010', 'orange' => '0110', 'black' => '0000', 'all' => '1111' );
my $PROGNAME = basename($0); my $opt_url; my $opt_user; my $opt_passwd; my $opt_all; my $opt_pattern; my $ip;
my $opt_hostgroup; my $opt_servicegroup;
my $opt_h; my $status; my $debug = undef; my $force = 1;
$status = GetOptions( "ip=s" => \$ip, "a" => \$opt_all, "all" => \$opt_all, "url=s" => \$opt_url, "hostgroup=s" => \$opt_hostgroup, "servicegroup=s" => \$opt_servicegroup, "help|h" => \$opt_h, "user=s" => \$opt_user, "passwd=s" => \$opt_passwd, "debug" => \$debug, # "force" => \$force, "pattern=s" => \$opt_pattern, );
if ( $opt_h || $status == 0 || !$opt_url ) { print_help(); exit 0; }
my $device = "test"; # find_light();
my $auth = "";
if ($opt_user) { $opt_url =~ s/http:\/\///;
$auth = "http://" . $opt_user . ":" . $opt_passwd . "@"; }
# OLD ... # my $url = $auth . $opt_url . "/cgi-bin/status.cgi?host=all&type=detail&servicestatustypes=20&serviceprops=42&noheader=1&embedded=1&hostprops=42";
$url .= "&hostgroup=" . $opt_hostgroup."&style=all" if ( $opt_hostgroup && $opt_hostgroup ne "" && $opt_hostgroup ne "--servicegroup" ); $url .= "&servicegroup=" . $opt_servicegroup if ( $opt_servicegroup && $opt_servicegroup ne "" );
my $ua = new LWP::UserAgent; $ua->agent( "TLightW-Agent/0.1 " . $ua->agent );
my $req = new HTTP::Request GET => $url;
my $res = $ua->request($req);
if ( $res->is_success ) { my $content = $res->content;
my $status = 'green'; my $matches; my @lines;
@lines = split( /\n/, $content );
my $device_status = 'green'; foreach (@lines) { if ( /<\/TR><\/TABLE><\/TD>/ ... /<\/TR>/ ) {
$device_status = 'green' if (/<\/TR><\/TABLE><\/TD>/); $device_status = 'yellow' if (m/statusWARNING/); $device_status = 'red' if (m/statusCRITICAL/);
# Only Hardstate are interesting if (m/>([0-9]+)\/([0-9]+)<\/TD>/) { $device_status = 'green' if ( $1 ne $2 ); }
if (/<\/TR>/) { $status = $device_status if ( $device_status eq 'red' ); $status = $device_status if ( $device_status eq 'yellow' and $status eq 'green' ); } } } $status = 'red' if ( $content =~ m/statusHOSTDOWN/ );
my $perfdata = "|green="; my $bulb = $PATTERNS{$status};
my $result = lightshow($status);
print "OK - Status \"" . $status . "\"|pattern: $bulb\n";
} else { print "Cannot reach nagios webinterface. Please check url, user and password!\n\n"; exit 2; # CRITICAL; }
sub print_help { printf "\nusage: \n"; printf "$PROGNAME --url <url> [--user <user>] [--passwd <passwd>] [--hostgroup <hostgroup>] [--servicegroup <servicegroup>] \n\n"; printf " --url url to nagios\n"; printf " --user nagios user for the webinterface\n"; printf " --passwd password for the nagios user\n"; printf " --hostgroup nagios hostgroup\n"; printf " --servicegroup nagios servicegroup\n"; printf " --debug show debugging\n"; printf "\n"; printf "$PROGNAME comes with ABSOLUTELY NO WARRANTY\n"; printf "This program is licensed under the terms of the "; printf "GNU General Public License\n(check source code for details)\n"; printf "\n\n"; exit 0;
}
sub cleaner { my $text = shift; $text =~ s/ //g; # remove blanks $text =~ s/<html>//g; # remove HTML-Start-Tag $text =~ s/<\/html>//g; # remove HTML-End-Tag return($text); }
sub lightshow { my $color = shift; my $erg; if ($opt_pattern) { $color = $opt_pattern; print "Overwrite $color with $opt_pattern\n"; } # Login to Power-Switch $erg = new HTTP::Request GET => "http://$ip/tgi/control.tgi?l=p:$opt_user:$opt_passwd"; my $antwort = $ua->request($erg); #print "aktueller Status: " . cleaner($antwort->content) . "\n";
# read Status from Power-Switch $erg = new HTTP::Request GET => "http://$ip/tgi/control.tgi?p=l"; $antwort = $ua->request($erg);
# Set Color to given Parameter # print "Ermittelte Farbe fuer Parameter '$opt_pattern': " . $PATTERNS{$color}; $erg = new HTTP::Request GET => "http://$ip/tgi/control.tgi?p=" . $PATTERNS{$color}; $antwort = $ua->request($erg); print "Content: " . cleaner($antwort->content) . "\n"; # print "Pattern $color aus Array: " . $PATTERNS{$color} . "\n"; # Quit $erg = new HTTP::Request GET => "http://$ip/tgi/control.tgi?q=q"; $antwort = $ua->request($erg); #print "Content: " . cleaner($antwort->content) . "\n";
}
Das Script kann z.B. unter
/usr/local/nagios/libexec/check_tina.pl
abgelegt werden.
Sobald die Steckdosenleiste konfiguriert wurde, kann der Test beginnen. Die URL der Nagios-Oberfläche und der benötigten Passwörter wird ebenfalls benötigt.
Ein Test ist mit der Zeile
/usr/local/nagios/libexec/check_tina.pl --url <Nagios-Web-Interface-URL> --user <nagiosuser> --passwd <nagios-password> --ip <steckdosen-IP> --pattern all
möglich.
Als Pattern können dabei übergeben werden:
- red
- yellow
- green
- orange (red + yellow)
- black (alles aus)
- all (alles an)
Das folgende Script wird dann z.B. in
/usr/local/nagios/etc/objects/tina/tina.cfg
abgelegt:
######################################################################################## # Configuration File for T.I.N.A.: Tausends IP Nagios Alert (or "Ampel" for us Germans # ######################################################################################## # Create a new hostgroup for T.I.N.A.
define hostgroup{ hostgroup_name T.I.N.A. ; The name of the hostgroup alias Tausends IP Nagios Ampel ; Long name of the group }
define host{ use generic-switch ; Inherit default values from a template host_name TINA alias T.I.N.A. Nagios Ampel ; A longer name associated with the switch address <IP-of-Power-Switch> ; IP address of the switch hostgroups T.I.N.A. ; Host groups this switch is associated with max_check_attempts 10 ; Check each server 10 times (max) }
define service{ use generic-service host_name TINA service_description status max_check_attempts 10 ; Check each server 10 times (max) check_interval 1 normal_check_interval 1 retry_interval 1 check_command check_tina!<url-to-nagios-webinterface>!<nagios-user>!<nagios-password> }
Die Parameter in <xxx> müssen natürlich noch angepasst werden!
In der command.cfg - meist unter
/usr/local/nagios/etc/objects/commands.cfg
zu finden, müssen noch die folgenden Zeilen ergänzt werden:
# command 'check_tina' define command{ command_name check_tina command_line $USER1$/check_tina.pl --ip $HOSTADDRESS$ --url $ARG1$ --user $ARG2$ --passwd $ARG3$ }
Es würde mich natürlich sehr freuen, wenn ich Feedback bekomme wo TINA inzwischen überall ein Zuhause gefunden hat.
Entsprechende Erfahrungsberichte und Bilder bitte an
Diese E-Mail-Adresse ist gegen Spambots geschützt! JavaScript muss aktiviert werden, damit sie angezeigt werden kann.
- Tausend(s) Dank im Voraus! |