pregos blog /me… prego!

4Feb/125

Howto: Nagios passive check through webproxy // NagiosProxySender

Ich moechte diesen Blogeintrag mit einer Graphik beginnen um die Ausgangsstellung besser aufzeigen zu koennen:

Mein Problem ist, dass ich mit Nagios den Server 1 ueberwachen moechte, der hinter einem Webproxy sitzt. Ich kann von aussen nicht aktiv per NRPE vom Server pullen, und passiv mit NSCA pushen funktioniert auch nicht, da es nicht durch den Webproxy geht. Als Loesungsansatz habe ich mich dann ein bisschen mit NPA auseinandergesetzt, bin aber zu der Ueberzeugung gekommen, dass es fuer das was ich eigentlich machen moechte zu gross und zu kompliziert ist.

Fragen, die ich mit einem bash-Skript nicht beantworten kann, versuche ich oft mit einem PHP-Skript zu loesen. Auch dieses mal ist es mir wieder gelungen. Das NagiosProxySender Skript erwartet drei Parameter:

  1. -h: Den in Nagios definierten Host fuer den ein Service aktualisiert werden soll
  2. -s: Den in Nagios definierten Service der aktualisiert werden soll
  3. -c: Den Pfad zu dem lokalen Nagios-Plugin, dass ausgefuehrt werden soll inkl. aller Parameter

Weiter muessen in dem NagiosProxySender Skript verschiedene Konfigurationseinstellungen gemacht werden. Dieses sind IP und Port von dem Webproxy, die komplette URL zu dem Nagios cmd.cgi-Skript sowie die HTTP-Authentifizierungsdaten um an das cmd.cgi-Skript heranzukommen. Das war es dann eigentlich auch schon. Wenn auf dem Nagios-Server die passiven Checks eingerichtet sind kann es losgehen.

Ich persoenlich habe mir jeden Aufruf in ein eigenes Bash-Skript gepackt, da ich dadurch flexibler bin. Zur Veranschaulichung hier drei Beispiele. Das erste uebermittelt den Updatestatus eines debianbasierten Systems. Das zweite prueft wann eine Logdatei zuletzt geaendert wurde und gibt Warnungen aus wenn es zu lange in der Vergangenheit liegt. Der dritte Aufruf ueberprueft ob auf einem Host beim Aufruf einer URL der HTTP-Code 200 zurueckgegeben wird und auf der Seite ein bestimmter String zu finden ist. Reagiert der Server zu traege gibt es ebenfalls Meldungen.

apt.sh

#!/bin/bash
 
/usr/bin/php /opt/skripte/nagios/nps.php -h myHost -s UPDATE -c "/usr/lib/nagios/plugins/check_apt"

log.sh

#!/bin/bash
 
/usr/bin/php /opt/skripte/nagios/nps.php -h myHost -s LOG -c "/usr/lib/nagios/plugins/check_file -w 300 -c 900 -f /var/log/myLog-$(date +%Y%m).log"

http.sh

#!/bin/bash
 
/usr/bin/php /opt/skripte/nagios/nps.php -h myHost -s HTTP -c "/usr/lib/nagios/plugins/check_http -H 1.2.3.4 -u http://www.example.net/my/page.html -e \"HTTP/1.1 200\" -s \"foobar \" -w 10 -c 20"

All diese Skripte rufe ich in den von mir gewuenschten Intervallen mit cron auf. Dafuer habe ich mir die Datei /etc/cron.d/nagios-passive angelegt:

#
# Regular cron jobs for the nagios passive checks
#
 
1          8,16         * * *   user    /opt/skripte/nagios/apt.sh
1,15,30,45 *            * * *   user    /opt/skripte/nagios/log.sh
1,15,30,45 *            * * *   user    /opt/skripte/nagios/http.sh

Zu guter letzt natuerlich das NagiosProxySender Skript (nps.php):

<?php
 
/***
 * Name:	Nagios Proxy Sender
 *
 * Description:	This script sends the output of a Nagios plugin through 
 *              a webproxy to the Nagios server using the cmd.cgi.
 *
 * Parameter:	-h:  Host name specified in Nagios that you want to update
 *		-s:  Service name of the host that you want to update
 *		-c:  Nagios plugin that you would like to execute with all 
 *                   parameters
 *
 *
 * Usage:	php nps.php -h myHost -s SERVICE -c "/usr/lib/nagios/plugins/check_dummy 0 foo"
 *
 *
 * Changelog:	2012-02-02 - initial Release  // Jan Toenjes <jan.toenjes@intranda.com>
 *
 ***/
 
 
 
 
/***
 * Please define your settings in this section 
 ***/
$baseurl = 'http://www.example.net/nagios/cgi-bin/cmd.cgi';	// set url to nagios cmd.cgi script
$http_username = 'username';					// set username for http authentication
$http_password = 'password';				        // set password for http authentication
 
$proxy_host = 'webproxy';					// set proxy hostname or ip address here
$proxy_port = '8080';						// set proxy port here
 
$verbose = 0; 							// set to 1 if you want some output
 
 
 
 
/***
 * Get commands passed as arguments to this script and give error message
 * if something seems to be wrong... 
 ***/
$options = getopt("h:s:c:");
if (!is_array($options) ) {
	print "There was a problem reading in the options.\n\n";
	exit(1);
}
 
if (count($options) != "3") {
	print "You need to specify the following parameters: \n
  -h:   Host name specified in Nagios that you want to update
  -s:   Service name of the host that you want to update
  -c:   Nagios plugin that you would like to execute \n\n";
	exit(2);
} 
if ($verbose == 1) { print_r($options); }
 
$host = trim($options['h']);
$service = trim($options['s']);
$check = trim($options['c']);
 
 
 
 
/***
 * Perform actual Nagios check and give error message
 * if the return code is not a valid Nagios return code
 ***/
exec("$check 2>&1", $output, $returnCode);
if ($returnCode != "0" && $returnCode != "1" && $returnCode !="2" && $returnCode != "3") {
	print "There was a problem running the Nagios check. Please check:
	Output: " . $output[0] . "
	Return Code: $returnCode\n\n";
	exit(3);
}
 
$plugin_state = $returnCode;
$plugin_output = urlencode($output[0]);
 
if ($verbose == 1) { print "plugin_state = $returnCode \n"; print "plugin_output = $output[0] \n"; }
 
 
 
 
/***
 * Create GET URL to pass the information to Nagios
 ***/
$url = $baseurl . "?cmd_typ=30&cmd_mod=2&host=$host&service=$service&plugin_state=$plugin_state&plugin_output=$plugin_output&btnSubmit=Commit";
 
 
 
 
/***
 * Trigger the GET URL using the provided proxy and HTTP Authentification information
 ***/
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($ch, CURLOPT_PROXY, "$proxy_host:$proxy_port");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $http_username . ":" . $http_password);
$curl_output = curl_exec ($ch);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
 
 
 
 
/***
 * Success and error handling
 ***/
if ($http_status == "200") {
	print "Success: The output was sent to Nagios successfully!\n\n";
}
elseif ($http_status == "0") {
	print "Error: Nothing was sent to the Nagios server. Please check your proxy settings.\n\n";
	exit(4);
}
else {
	print "Error: HTTP-Code $http_status received. Please check the given information.\n\n";
	if ($verbose == 1 ) { print_r($curl_output); }
	exit(5);
}
?>
veröffentlicht unter: Uncategorized 5 Kommentare
7Mai/112

Bye Bye Gnome

Am 30. Oktober 2008 habe ich einen Blogeintrag Bye Bye KDE geschrieben. Das dort angesprochene Downgrade zu XFCE hielt nicht lange, ich glaube so 1-2 Wochen, dann war ich auf Gnome. Damit habe ich nun die Jahre sehr zufrieden gearbeitet. Zwischendrin habe ich immer mal wieder einen Blick zu KDE ruebergeworfen, aber war sehr zufrieden mit Gnome bis, ja, bis das Update auf Ubuntu 11.04 kam. Da war erstmal Unity was ich doof fand. Dann hab ich in die Gnome3-Shell ruebergewechselt und das fand ich auch doof. Dann hab ich versucht meinen alten Gnome2 Desktop mit Compiz wieder zum laufen zu kriegen aber dat ging auch nich. Irgendwann hatte ich keinen Bock mehr und hab nun die letzten Wochen das umgesetzt was mir schon lange im Kopf rumschwebte, ich bin auf Fluxbox gewechselt.

Fluxbox ist einfach, Fluxbox ist simpel und bringt alles das mit, was ich brauche. Gnome-Zeugs was ich nett finde kann ich starten, der Rechner ist schnell genug und alles laeuft. Ich mag es viel mit der Tastatur zu machen und mir kleine simple Tastenkombinationen ablegen zu koennen. Der obligatorische Screenshot noch:

veröffentlicht unter: Uncategorized 2 Kommentare
6Apr/111

Move Firefox Sidebar to the right

1. Oeffnen oder erstellen:

~/.mozilla/firefox/MYPROFILE.default/chrome/userChrome.css

2. Folgenden Inhalt reinkopieren:

/* Display the sidebar in opposite side */
#browser {
-moz-box-direction: reverse;
}

3. Firefox neustarten

Bin ich drauf gekommen weil mich die neue Echofon-Beta Version (Firefox-Twitter-Client) an der linken Seite irgendwie gestoert hat. Den Tip habe ich von da.

7Dez/102

KVM, interne Maschine, RDP Zugriff von extern

Wenn man mit KVM eine Maschine virtualisiert hat, und diese dann in ein eigenes internes Netz haengt, z.B. 192.168.X.X, dann ist es zwar normalerweise moeglich via NAT ins Internet zu gehen, aber wie komme ich von extern auf diese Maschine. Konkrete Fragestellung bei mir war: Wie komme ich von extern per Remotedesktop auf die Maschine?

  • per SSH mit X-Forwarding auf der physikalischen einloggen und dann mit rdesktop, Beispiel:
 rdesktop -k de -u MYUSERNAME -g 1280x1024 192.168.2.2
  • mit netten iptables Regeln

Als erstes generell erlauben, dass Traffic auch an die internen Maschinen weitergeleitet werden darf:

iptables -I FORWARD -d 192.168.2.0/24 -j ACCEPT

Danach den entsprechenden Dienst einrichten, in diesem Fall RDP:

iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 --dport 3389 -j DNAT --to-destination 192.168.2.2:3389

Die iptables Regeln habe ich bereits vor einiger Zeit von meinen Cousin Emil Wagner per Mail bekommen. Danke dafuer!