Aktuelles in der Kategorie Open Source

debianlogo.png
Etwas mehr als zwei Jahre nach dem letzten Release wurde Debian 7 alias Wheezy veröffentlicht. Neben einem Update der Standardsoftware unterstützt Wheezy eine sprachgeführte Installation und bietet ein ruhiges, modernes Design. Und: Debian wird nun auch im All genutzt.


Debian 7.0 alias Wheezy hat etwas mehr als zwei Jahre nach seinem Vorgänger Squeeze das Licht der Welt erblickt, und bietet umfangreiche Neuerungen.

Da ist zum einen die Liste aktualisierter Pakete: Gnome, der Debian-Standard-Desktop, wird nun in einer 3er-Version mitgeliefert, bietet also die neue Gnome-Shell. Auch die Desktops KDE und XFCE wurden aufgefrischt, und liegen jeweils in der Version 4.8 vor. Libreoffice ersetzt OpenOffice, PostgreSQL lässt mit 9.1 die Ära der 8 hinter sich und die Compiler-Suite GCC springt von 4.4 auf 4.7. Abgerundet werden die aktualisierten Pakete durch das ruhigere, aufgeräumtere Design des neuen Debian.

Gerade für Desktop-Anwender ist darüber hinaus interessant, dass Wheezy auch nahezu alle wichtigen Multimedia-Formate wie MP3 und x264 unterstützt. Die Zeiten, in denen diese umständlich nachinstalliert werden mussten, sind damit vorbei.

Doch auch abseits der Desktop-Anwender finden sich umfangreiche Neuerungen: Wheezy integriert die Cloud-Lösung OpenStack gebrauchsfertig! Es enthält out-of-the-box alle Komponenten, die Sie benötigen um einen beliebig großen Cloud-Cluster aufzubauen - egal ob mit zwei oder mit zweitausend Servern.

Für Server-Betrieb ebenfalls interessant ist die neue Unterstützung für Multiarch-Installationen: unter Wheezy können Pakete für verschiedene Prozessorarchitekturen direkt nebeneinander installiert und genutzt werden. Eine eigene chroot ist so für andere Architekturen nicht mehr notwendig, und auch proprietäre Software wie Skype oder unter Wine laufende Programme lassen sich so deutlich einfacher handhaben.

Doch auch abseits der Veröffentlichung von Wheezy feiert Debian noch einen ganz anderen Erfolg: die Laptops auf der internationalen Raumstation werden fortan unter Linux betrieben! Keith Chuvala, ein Mitarbeiter der der NASA zuarbeitenden United Space Alliance, sah Bedarf nach einer staiblen und verlässlichen Linux-Distribution, und wählte daher Debian:

Um allen Ansprüchen der Astronauten zu genügen suchte Chuvala nach einem moderneren, robusteren Enterprise Support, der mit der Migration von Scientific Linux nach Debian 6 erreicht wurde.
To manage all of the astronaut’s needs Chuvala was looking for newer, more robust enterprise support, which was achieved by moving from a Scientific Linux distribution to Debian 6.

Wir von der credativ GmbH beglückwünschen Debian zu beiden Erfolgen!

Alle Blog-Artikel zum Thema Debian werden auch als Kategorie Debian samt eigenem Feed angeboten - und bei Bedarf bieten wir auch gerne Support und Services rund um Debian.

[Howto] Zarafa Mailextraktion

| Keine Kommentare

zarafa_logo.jpgWer zur alltäglichen Spamabwehr Spamassassin mit Bayes-Filter einsetzt, wird das System regelmäßig trainieren wollen. Spamassassins sa-learn benötigt als Input eine vollständige Email samt Headern und Body. Im Folgenden sei eine Methode beschreiben, wie man vollständige Emails aus Zarafa extrahieren kann.

Eine Zarafa-Umgebung benötigt eine MySQL-Datenbank zur Verwaltung von Nutzern, Mailstores, Mailfoldern und sonstigen Email-Objekten. Für das Attachment-Storage gibt es dabei zwei Betriebsmodi:

  • Im Database-Modus sind sämtliche Informationen ("Objekte") in der MySQL-Datenbank enthalten, vor allem die Emails, Email-Header und -Anhänge.
  • Im Files-Modus hingegen werden die potenziell großen Objekte, nämlich Email-Anhänge und volle Emails - die ihre Anhänge als Multiparts einbetten - im Dateisystem abgelegt.

Für uns sind folgende Daten und deren Ablageort interessant:

  • Der reine Email-Header ist in der DB-Tabelle properties zu finden.
  • Daten bezüglich der Userkonten sind verteilt auf die DB-Tabellen users und stores.
  • Die vollständigen Emails sind gespeichert in
    • der lob Tabelle, falls Zarafa im Database-Modus arbeitet, beziehungsweise
    • im Dateisystem typischerweise unter /var/lib/zarafa/..., falls der Files-Modus genutzt wird.
  • Beziehungen zwischen zusammengehörigen Daten mehrerer Tabellen werden unter anderem über Instance_IDs (SQL Schlüsselattribut) hergestellt.

Im Files-Modus hat der volle Pfad der einzelnen, per gzip komprimierten vollständigen Emails die Form {attachment_path}/{INT}/{INT}/{Instance_ID}.gz, wobei der attachment_path in der Zarafa-Standardkonfiguration /var/lib/zarafa lautet. Deren Subverzeichnisse sind von der Instance_ID abgeleitet, ein konkreter Beispielpfad lautet /var/lib/zarafa/4/6/43664.gz.

Das folgende Skript liest einen String von der Standardeingabe und sucht passende Email-Header in der properties-Tabelle. Zu den gefundenen Treffern werden die vollen Emails aus der lob-Tabelle extrahiert, Zarafa muss also mit attachment_storage=database betrieben werden - die Suche nach den zugehörigen gz-Dateien im Files-Modus ist hier nicht implementiert. Es sei angemerkt, dass die SQL-Statements je nach Datenbankgröße eine hohe DB-Last erzeugen können. Getestet wurde Zarafa in Version 7.0.9. Ein Beispielaufruf wäre:

[root@zarafa ~]# cat needle.txt 
Subject: test Mon, 04 Feb 2013 15:05:12 +0100
[root@zarafa ~]# mkdir hackstack; ./zarafa-extract.pl zarafauser haystack < needle.txt
 Writing haystack/1359986776.0000.txt ...
[root@zarafa ~]# cat haystack/1359986776.0000.txt
Date: Mon, 04 Feb 2013 15:05:12 +0100
To: zarafauser
From: zarafa.testsystem.intern
Subject: test Mon, 04 Feb 2013 15:05:12 +0100
X-Mailer: swaks v20100211.0 jetmore.org/john/code/swaks/
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----=_MIME_BOUNDARY_000_14806"

------=_MIME_BOUNDARY_000_14806
Content-Type: text/plain

This is a test mailing
------=_MIME_BOUNDARY_000_14806
Content-Type: application/octet-stream; name="test.xml"
Content-Description: test.xml
Content-Disposition: attachment; filename="test.xml"
Content-Transfer-Encoding: BASE64

SGVsbG8gV29ybGQK

Zur Nutzung des Perl-Skripts werden die DBI und DBD::mysql Module benötigt, welche unter Debian beispielsweise durch libdbd-mysql-perl bereitgestellt werden.

#!/usr/bin/perl -w

# Copyright (c) 2013, Damian Lukowski <damian.lukowski@credativ.de>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#    * Redistributions of source code must retain the above copyright
#      notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above copyright
#      notice, this list of conditions and the following disclaimer in the
#      documentation and/or other materials provided with the distribution.
#    * Neither the name of the <organization> nor the
#      names of its contributors may be used to endorse or promote products
#      derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

use strict;
use DBI;
use DBD::mysql;

my $DEBUG = 0;

# Fill in the MySQL server properties
my ($dbhost,$dbport,$dbname,$dbuser,$dbpass) = ('', 3306, 'zarafa', '', '');

if (@ARGV < 2)
{
	print "Usage:	$0 <zarafa-user> <outdir>\n
	$0 reads a mail header from STDIN and searches
	for zarafa-users's emails matching the given mail header.
	Each result is stored as a separate file within <outdir>.
	It is assumed that zarafa is configured with
	attachment_storage = database!\n";
	exit;
}

my ($username, $outdir) = @ARGV;

chomp(my $needle = join '', <STDIN>);
$needle = "%$needle%";
# RFC822 demands CR LF as a line separator.
$needle =~ s/(?!\r)\n/\r\n/g;

my $dbh = DBI->connect("dbi:mysql:$dbname:$dbhost:$dbport", $dbuser, $dbpass)
	  or die $DBI::errstr;

my ($qry, $ref, $sth, $uid);

if ($username ne '.')
{

	$qry = "SELECT user_id FROM stores WHERE user_name = '$username'";
	$ref = $dbh->selectall_arrayref($qry);

	if (@$ref > 1)
	{
		print "Ambiguous username. Matching userids: ",
		join ', ', map {$_->[0]} @$ref;
		exit;
	};

	die "Username not found\n" unless @$ref;
	$uid = $$ref[0][0];
	print "uid of $username: $uid\n" if $DEBUG;
};

if ($DEBUG && $username ne '.')
{
	$qry = "SELECT COUNT(*) FROM properties";
	printf "%d properties\n", ${$dbh->selectall_arrayref($qry)}[0][0];

	$qry = "SELECT COUNT(*) FROM lob";
	printf "%d large objects\n", ${$dbh->selectall_arrayref($qry)}[0][0];

	$qry = "SELECT COUNT(*) FROM properties WHERE tag = 125";
	printf "%d properties with tag 125 (headers)\n",
		${$dbh->selectall_arrayref($qry)}[0][0];

	$qry = "SELECT COUNT(*) FROM properties WHERE val_string LIKE ?";
	$sth = $dbh->prepare($qry);
	$sth->execute($needle);
	printf "%d tag-125 properties matching needle\n",
		${$sth->fetchrow_arrayref}[0];

        $qry = "SELECT h.owner, s.user_name, p.hierarchyid FROM "
             . "hierarchy h RIGHT JOIN properties p on h.id = p.hierarchyid "
             . "LEFT JOIN stores s ON s.user_id=h.owner WHERE p.tag = 125 "
             . "AND p.val_string LIKE ?";

	$sth = $dbh->prepare($qry);
	$sth->execute($needle);
	while (my @row = $sth->fetchrow_array())
	{
		printf " uid=%s, username=%s, hierarchyid=%s\n", @row;
	}

	$qry = "SELECT count(*) FROM hierarchy h JOIN properties p on "
	     . "h.id = p.hierarchyid LEFT JOIN singleinstances s on "
	     . "s.hierarchyid = h.id WHERE p.tag = 125 AND h.owner = $uid";
	printf "%d tag-125 properties of %s\n",
		${$dbh->selectall_arrayref($qry)}[0][0], $username;

	$qry = "SELECT h.owner, p.hierarchyid, s.instanceid FROM hierarchy h "
	     . "JOIN properties p on h.id = p.hierarchyid LEFT JOIN "
	     . "singleinstances s on s.hierarchyid = h.id WHERE "
	     . "h.owner = $uid AND p.val_string LIKE ?";
	$sth = $dbh->prepare($qry);
	$sth->execute($needle);
	$ref = $sth->fetchall_arrayref();
	printf "%d tag-125 properties of %s matching needle\n",
		(scalar @$ref), $username;

	for my $row (@$ref)
	{
		printf " uid=%s, hierarchyid=%s, instanceid=%s\n", @$row;
	}
}

# A tag value of 125 corresponds to the mapitag definition as found in zarafa's
# sources under mapi4linux/include/mapitags.h:
# define PR_TRANSPORT_MESSAGE_HEADERS          PROP_TAG(PT_TSTRING,    0x007D)
# define PR_TRANSPORT_MESSAGE_HEADERS_W        PROP_TAG(PT_UNICODE,    0x007D)
# define PR_TRANSPORT_MESSAGE_HEADERS_A        PROP_TAG(PT_STRING8,    0x007D)

if ($username ne '.')
{
	$qry	= '(SELECT s.instanceid FROM properties p JOIN hierarchy h '
		. 'ON h.id = p.hierarchyid JOIN singleinstances s ON '
		. "s.hierarchyid = h.id WHERE h.owner = $uid AND p.tag=125 AND "
		. 'p.val_string LIKE ?)';	
} else
{
	$qry	= '(SELECT s.instanceid FROM properties p '
		. 'JOIN singleinstances s ON '
		. "s.hierarchyid = p.hierarchyid WHERE p.tag=125 AND "
		. 'p.val_string LIKE ?)';
}

$sth = $dbh->prepare($qry);
$sth->execute($needle);

my $iid = undef;

# Hint:
# For zarafa deployments with attachment_storage = files, the requested mails
# are not stored in the lob table, but within /var/lib/zarafa/. Let iid be
# 54321, then the mail is stored in /var/lib/zarafa/1/12/54321.gz
# The extraction logic is not covered here ...

my $written = 0;

while (my @row = $sth->fetchrow_array())
{
	$iid = $row[0];
	$qry = "SELECT val_binary FROM lob WHERE instanceid = $iid";
	$ref = $dbh->selectall_arrayref($qry);

	print "Looking for full mail of iid=$iid\n" if $DEBUG;

	for my $row (@$ref)
	{
		print " Found full mail with iid=$iid\n" if $DEBUG;
		my $tmp_file = sprintf '%s/%s.%04d.txt', $outdir,
				time, $written++;
		open my $fh, "> $tmp_file";
		print " Writing $tmp_file ...\n";
		print $fh $row->[0];
		close $fh;
	};
};

unless (defined $iid)
{
	print "No iid found, probably because the header didn't match.\n";
	print "If you are sure that the header should be found, try to use ",
	      "'.' (dot) as the username.\nThe DB query will be slower but ",
	      "might find the email.\n" unless $username eq '.';
} elsif ($written == 0)
{
	print	"Instanceid(s) found, but no files written? ", 
		"Probably attachment_storage != database\n";
}

Alle Artikel zum Thema Groupware stehen auch als eigene Kategorie mit eigenem Feed zur Verfügung. Falls Ihr tiefergehende Fragen zu Support und Services für Zarafa habt seid Ihr bei uns ebenfalls richtig.

eye.jpg
Bei der kommenden Open Source Monitoring-Konferenz wird Alexander Wirt, technischer Leiter bei der credativ GmbH, einen Vortrag über die Nutzung von Nagios und Icinga im Zusammenhang mit Debian halten.

Auf der am 17. und 18. Oktober 2012 stattfindenden Open Source Monitoring Conference wird Alexander Wirt seine mittlerweile seit 10 Jahren gesammelten Kenntnisse und Erfahrungen zum Einsatz von Icinga, Nagios, check_mk und verwandten Komponenten zum Besten geben.

Der Vortrag wird sich darauf konzentrieren, die Paketierung der Komponenten unter Debian, das dahinter stehende Debian-Team sowie die Nutzung der Komponenten auf Debian-Installationen und im typischen IT-Umfeld aufzuzeigen. Der Vortrag richtet sich insbesondere an Einsteiger, die wartbare Monitoring-Umgebungen auf der Basis von Nagios/Icinga möglichst zügig aufbauen und betriebsbereit bringen wollen.

Als Mitglied des Icinga Core-Teams verfügt Alexander Wirt dabei über einen umfangreichen Überblick über die Struktur und Geschichte des Projekts selbst, als Debian-Paketierer ist ihm aber auch die Perspektive des Administrators und desjenigen, der die Systeme letztendlich betreuen wird, bestens vertraut.

Die langjährige Erfahrung als technischer Leiter bei der credativ GmbH verleiht ihm darüber hinaus einen tiefen Einblick Einblick in den Alltag bei der Nutzung der verschiedenen Monitoring-Komponenten bei einer Vielzahl kleiner und großer IT-Systeme im Geschäftsumfeld.

Alle Blog-Artikel zu aktuellen Themen werden auch als Kategorie Monitoring samt eigenem Feed angeboten. Wir helfen auch gerne mit Open Source Support und Services für Monitoring-Lösungen.

FutureOfOpenSourceSurvey.jpg
Eine aktuelle Umfrage beschäftigt sich mit der Entwicklung und Zukunft von Open Source Software im Jahr 2012. Machen Sie mit und unterstützen auch Sie die aktuelle Open Source Studie 2012.

Die Open Source Studie 2012 evaluiert die Entwicklung und die erwartete Zukunft von Open Source im Unternehmenseinsatz in diesem Jahr. Die Ergebnisse dieser Studie werden sicher auch für Ihr Unternehmen einen wichtigen Beitrag für die zukünftige Open Source Strategie liefern.

Gerne sind Sie dazu eingeladen, die Umfrage auch anderen Interessierten mitzuteilen, oder sich mit dem Hash-Tag #FutureOSS darüber auszutauschen. Die Ergebnisse werden Ihnen kostenfrei zur Verfügung gestellt. Alle Angaben können anonym erfolgen.

Alle Blog-Artikel zu aktuellen Themen werden auch als Kategorie News samt eigenem Feed angeboten. Wir bieten zu nahezu allen angesprochenen Open-Source-Themen auch unseren gewohnten Open Source Support.

debianlogo.pngDebian Entwickler arbeiten mit vereinten Kräften an Debian GNU/Linux „Wheezy“.

Auch in diesem Jahr bietet das deutsche Open Source Support Centers der credativ GmbH in seinem Räumen in Mönchengladbach dem Debian-Projekt die Möglichkeit, im Rahmen einer "Bug Squashing Party" an der nächsten Debian-Version "Wheezy" zu arbeiten. Die Debian-Entwickler der credativ GmbH und zahlreiche Gäste aus dem In- und Ausland werden sich am Wochenende vom 2. bis 4. März treffen, um konzentriert an offenen Problemen zu arbeiten. Aus Italien werden in diesem Jahr auch Enrico Zini und Francesca Ciceri vom Debian Press Team erwartet.

Auf der Bug Squashing Party wird auch an Piuparts gearbeitet werden, einem Tool das automatische Upgrade-Tests für die nächste Debian-Version Wheezy durchführt. Fehler können so rechtzeitig vor dem Release erkannt und beseitigt werden.

Ein weiteres Ziel ist verbesserte Ipv6-Unterstützung. Debian-Entwickler Alexander Wirt: "Die Umstellung auf das neue Internet-Protokoll ist sehr wichtig, zu viele Programme in Debian unterstützen bisher nur das alte IPv4-Protokoll."

Außerdem soll der Mailinglisten-Server des Debian-Projekts auf neue und schnellere Hardware umgezogen werden, damit der ansteigende Mailverkehr bewältigt werden kann. Parallel zur Bug Squashing Party trifft sich das Debian New Member Team, um an der Infrastruktur zu arbeiten, mit der das Debian-Projekt seine Benutzerkonten verwaltet und neue Mitglieder aufnimmt. Debian Account Manager Christoph Berg: "Wir arbeiten seit zwei Jahren an der Umstellung der alten PHP-Webseite auf ein modernes Web-Framework in Python, wir wollen das Wochenende nutzen, um die neue Version endlich fertig zu stellen."

Weitere Informationen über die Bug Squashing Party bei credativ stehen auf den Seiten von debian.org zur Verfügung.

Alle Blog-Artikel zu unserer Firma werden auch als Kategorie credativ samt eigenem Feed angeboten - und falls ihr nach Support und Services für Debian sucht, seid ihr bei uns ebenfalls richtig.

credativ beim PGDay Europe 2010

| Keine Kommentare

postgreslogo.png
Letzten Monat fand die alljährliche europäische PostgreSQL-Konferenz in Stuttgart statt. Die credativ GmbH war nicht nur Sponsor der Veranstaltung, sondern auch mit vier Mitarbeitern vor Ort, welche mehrere Vorträge gehalten haben. Die Folien der Vorträge sind nun verfügbar.


Die Konferenz fand im Stuttgarter Millennium-Hotel statt und wurde professionell und effizient von PostgreSQL Europe organisiert. Durch zahlreiche Kaffee-Pausen und die Konferenz-Party am Montag Abend war ein reger Austausch zwischen den Teilnehmern möglich.

Die Vorträge von credativ waren im einzelnen:

  • "Migration auf Freie Software in unternehmenskritischen Bereichen" (Folien)

    Dr. Michael Meskes fasste in diesem Vortrag die langjährige Erfahrung der credativ GmbH bei der Migration von kritischen Unternehmens-Bereichen auf Freie Software im allgemeinen und PostgreSQL für Datenbanken im speziellen zusammen.

  • "Embedded SQL für PostgreSQL" (Folien)

    In seinem zweiten Vortrag befasste sich Dr. Michael Meskes mit dem von ihm im PostgreSQL-Projekt als ECPG betreuten Embedded SQL, eine Datenbankschnittstelle in der Programmiersprache C. Da sie im SQL-Standard definiert ist und schon sehr lange und für alle Datenbanksysteme existiert, wird sie vielfach verwendet, so dass in dem Vortrag vor allem auch auf Migrationen eingegangen wurde.

  • "Die PostgreSQL Community" (Folien)

    Bernd Helmle, der technische Leiter der credativ GmbH für den Bereich Datenbanken, stellte in seinem Vortrag die Geschichte und den momentanen Stand der PostgreSQL-Community und deren Prozesse und Organisation vor und erläuterte zusätzlich die verschiedenen Möglichkeiten der Mitarbeit durch neue Mitglieder.

  • "Advanced Analytics with PL/R" (Folien)

    Schließlich hielt Joe Conway, CEO der US-amerikanischen credativ LLC einen (englisch-sprachigen) Vortrag über die PostgreSQL-Erweiterung PL/R, eine Zusammenführung von PostgreSQL mit R, der im Bereich Freier Software führenden Umgebung für mathematische und statistische Berechnungen und deren Visualisierung).

Das nächste PostgreSQL-Event der credativ GmbH ist die Schulung im Linux-Hotel vom 23. bis 25. Februar 2011.

Alle Blog-Artikel zum Thema PostgreSQL werden auch als Kategorie PostgreSQL samt eigenem Feed angeboten. Wir helfen auch gerne mit Support und Services für PostgreSQL.

migration.pngDies ist der zweite Teil unseres Migrations-Howtos für Netzwerk-Überwachungs-Systeme von Nagios nach OpenNMS. Nachdem im ersten Teil die Integration von aktiven Nagios-Checks via NRPE (Nagios Remote Plugin Executor) diskutiert wurde, wenden wir uns in diesem zweiten Teil den passiven Nagios-Checks durch NSCA (Nagios Service Check Acceptor) zu.

Passive Nagios-Checks

Da es momentan keine spezielle OpenNMS-Unterstützung für passive NSCA-Checks gibt, müssen diese durch andere Mechanismen abgebildet werden. In diesem Howto verwenden wir für jeden passiven NSCA-Check einen eigenen Service, dessen Status durch externe Benachrichtigung geändert wird und der durch den PassiveStatusKeeper-Mechanismus von OpenNMS überwacht wird.

Einbinden der Nagios SNMP-Trap Informationen

Für die sinnvolle Behandlung von SNMP-Traps wird eine Registrierung des jeweiligen MIBs (Management Information Base) als OpenNMS-Event benötigt. OpenNMS kennt zwar von Haus aus eine Vielzahl von SNMP-Traps, die aus dem Nagios-MIB sind jedoch nicht darunter. Die benötigte Nagios.events.xml Datei wurde aus dem MIB erstellt und muss in das events/-Unterverzeichnis der OpenNMS Konfiguration kopiert werden und in der eventconf.xml Datei via <event-file>events/Nagios.events.xml </event-file> eingebunden werden. Der in der Nagios-MIB definierte SNMP-Trap für Service-Events ist nSvcEvent, welcher als numerische OID (Object Identifier) den Code .1.3.6.1.4.1.20006.1.7 besitzt.

Benachrichtigungen via SNMP-Trap

Das für passive NSCA-Checks verwendete Programm send_nsca kann etwa durch folgendes Shell-Skript ersetzt werden, welches die Benachrichtigung von OpenNMS via snmptrap durchführt:
  #!/bin/bash

  SNMPTRAP=/usr/bin/snmptrap
  COMMUNITY=public

  while getopts "H:d:p:" OPTION; do
    case $OPTION in
      H) HOST=$OPTARG;;
      d) DELIM=$OPTARG;;
      p) PORT=$OPTARG;;
      *) ;;
    esac
  done

  if [ "x$DELIM" == "x" ]; then
    DELIM="\t"
  fi

  if [ "x$HOST" == "x" ]; then
    echo "No host defined, exiting"
    exit
  fi

  array=(`awk -F"$DELIM" '{for(i=1;i<=3;i++){print $i};
                    for(i=4;i<=NF;i++){gsub(/ /,"_",$i); print $i}}'`);
  NODE=${array[0]}
  SERVICE=${array[1]}
  STATUS=${array[2]}
  REASON=`echo ${array[3]} | sed s/_/\ /g`"'"

  $SNMPTRAP -v 2c -c $COMMUNITY $HOST '' NAGIOS-NOTIFY-MIB::nSvcEvent \
    NAGIOS-NOTIFY-MIB::nHostname s "$NODE" \
    NAGIOS-NOTIFY-MIB::nHostStateID i 0 \
    NAGIOS-NOTIFY-MIB::nSvcDesc s "$SERVICE" \
    NAGIOS-NOTIFY-MIB::nSvcStateID i "$STATUS" \
    NAGIOS-NOTIFY-MIB::nSvcAttempt i 1 \
    NAGIOS-NOTIFY-MIB::nSvcDurationSec i 1 \
    NAGIOS-NOTIFY-MIB::nSvcGroupName s "" \
    NAGIOS-NOTIFY-MIB::nSvcLastCheck i 0 \
    NAGIOS-NOTIFY-MIB::nSvcLastChange i 0 \
    NAGIOS-NOTIFY-MIB::nSvcOutput s "$REASON"
Das Skript versteht die beiden nsca_send Optionen -H (Host) und -d (Feldtrenner). $HOST ist dabei der OpenNMS-Server, für den die Benachrichtigung vorgesehen ist. Der awk-Befehl zerteilt den per Feldtrenner separierten NSCA-String (z.B. „postgres-test; Vaccuum;0;Vaccuum OK 1276511175“) in seine Bestandteile, welche den Variablen $NODE, $SERVICE, $STATUS und $REASON zugeteilt werden. Diese werden schließlich beim Aufruf von snmptrap den nSvcEvent Parametern nHostname, nSvcDesc, nSvcStateID und nSvcOutput zugeteilt. Den übrigen Parametern nHosteStateID, nSvcAttempt, nSvcDurationSec, nSvcGroupName, nSvcLastCheck und nSvcLastChange werden allgemeine Werte zugeteilt, da sie bei der Umsetzung des nSvcEvent-Traps in ein OpenNMS-Event keine Rolle spielen und auch beim Aufruf von send_nsca nicht bekannt sind. Damit die Parameter des nSvcEvent-Traps von snmptrap aufgelöst werden können, muss das NAGIOS-MIB der Net-SNMP-Installation bekannt sein.

Umwandlung von Traps in Events

Die eingehenden SNMP-Traps werden in OpenNMS-Events vom Typ nSvcEvent umgewandelt. Um diese nun einzelnen Nagios-Checks bzw. OpenNMS-Services zzuuweisen, müssen sie vom translatord-Dämon in passiveServiceStatus Events umgewandelt werden. Folgender Abschnitt ist hierfür in der Datei translator-configuration.xml nötig:
<event-translation-spec 
  uei="uei.opennms.org/vendor/nagios/traps/nSvcEvent">
    <mappings>
      <mapping>
        <assignment type="parameter" name="passiveNodeLabel">
          <value type="parameter" 
            name=".1.3.6.1.4.1.20006.1.1.1.2" 
            matches=".*" 
            result="${0}" 
          />
        </assignment>
        <assignment type="parameter" name="passiveIpAddr">
          <value type="field" 
            name="interface" 
            matches=".*" 
            result="${0}"
          />
        </assignment>
        <assignment type="parameter" name="passiveServiceName">
          <value type="parameter" 
            name=".1.3.6.1.4.1.20006.1.3.1.6" 
            matches=".*" 
            result="${0}" 
          />
        </assignment>
        <assignment type="parameter" name="passiveStatus">
          <value type="sql" 
            result="SELECT CASE WHEN ?::integer = 0  
                                     THEN 'Up'        
                                     ELSE 'Down' 
                                     END;" >  
            <value type="parameter" 
              name=".1.3.6.1.4.1.20006.1.3.1.7" 
              matches=".*" 
              result="${0}" 
            />
          </value>
        </assignment>
        <assignment type="parameter" name="passiveReasonCode">
          <value type="parameter" 
            name=".1.3.6.1.4.1.20006.1.3.1.17" 
            matches=".*" 
            result="${0}" 
          />
        </assignment>
        <assignment type="field" name="uei">
          <value type="constant" 
            result="uei.opennms.org/services/passiveServiceStatus" 
          />
        </assignment>
      </mapping>
    </mappings>
</event-translation-spec>
Die uei in der zweiten Zeile bezeichnet dabei den SNMP-Trap, wie er in der jeweiligen events-XML Datei angegeben ist. Die Parameter passiveNodeLabel, passiveServiceName, passiveStatus und passiveReasonCode werden aus den jeweiligen Parametern $NODE, $SERVICE, $STATUS und $REASON des SNMP-Traps übernommen. Für die Ermittlung von passiveStatus ist dabei eine SQL-Abfrage nötig, um je nach Nagios-Status ein "Up" oder "Down" zu senden. Die IP-Adresse kann direkt aus dem "interface"-Feld des Events übernommen werden. Schließlich wird in der letzten Zuordnung die OpenNMS UEI (Unique Event Identifier) von nSvcEvent nach passiveServiceStatus umgewandelt.

Einbinden von Passiven Checks als Services

Passive NSCA-Checks können naturgemäß nicht mit capsd entdeckt werden, deshalb müssen sie per LoopPlugin für jede betreffende Node per ip-match Property in der capsd-configuration.xml Datei aktiviert werden:
    <protocol-plugin 
      protocol="NSCA-check1" 
      class-name="org.opennms.netmgt.capsd.plugins.LoopPlugin"
      scan="on">
        <property key="ip-match" value="192.168.178.158" />
        <property key="ip-match" value="172.16.17.213" />
        <property key="is-supported" value="true" />
    </protocol-plugin>
Dabei bezeichnet protocol den Namen des betreffenen OpenNMS-Service.

Zusätzlich ist auch ein entsprechender Poller in poller-configuration.xml nötig, zum einen der <service>-Anker:

    <service name="NSCA-check1" 
      interval="30000" 
      user-defined="false" 
      status="on">
    </service>
Sowie schließlich ein PassiveServiceMonitor:
<monitor service="NSCA-check1" 
  class-name="org.opennms.netmgt.poller.monitors.PassiveServiceMonitor"
/>
Mit diesen Änderungen und nach einem Neustart von OpenNMS sollten die NSCA-Checks für die entsprechende Node im OpenNMS-Webinterface erscheinen und sich wie normale OpenNMS Dienste in Bezug auf Ausfälle etc. verhalten.

PGDay Europe 2010 in Stuttgart

| Keine Kommentare


Die PostgreSQL Europe Community wird dieses Jahr ihren jährlichen Kongress in Stuttgart abhalten. Das umfangreiche Vortragsprogramm umfasst vielfältige Themen rund um PostgreSQL, darunter Vorträge aus den Gebieten GIS, Entwicklung, Hochverfügbarkeit und vieles mehr.

Die credativ GmbH wird mit Michael Meskes, Joe Conway und Bernd Helmle als Silbersponsor mit Vorträgen zu den Themen

auf dem Kongress vertreten sein. Darüber hinaus bietet der PGDay ein eintägiges Tutorialprogramm. Details für die Registrierung, Unterkunft und Anreise können über die Seite des Kongresses abgerufen werden.

Alle Blog-Artikel zum Thema PostgreSQL werden auch als Kategorie PostgreSQL samt eigenem Feed angeboten. Wir helfen auch gerne mit Support und Services für PostgreSQL.

[Howto] Migration von Nagios zu OpenNMS

| Keine Kommentare
migration.pngHier bei credativ setzen wir bevorzugt Nagios für das Monitoring ein, aber wenn es die Richtilinien bei Kunden verlangen, arbeiten wir natürlich auch mit anderen Überwachungs-Systemen. Dieses Howto beschreibt die Integration von aktiven und passiven Nagios-Checks in ein OpenNMS-System, so dass zwar die entwickelten Checks weiter verwendet, der Nagios-Server aber abgeschaltet werden kann.

Einleitung

OpenNMS ist ein Open-Source Netzwerk-Monitoring-System. Es ist in Java geschrieben und benutzt PostgreSQL als Datenbank. Die Konfiguration erfolgt über XML-Dateien, teilweise (vor allem Reports, Benachrichtigungen usw.) auch über die Web-Oberfläche. OpenNMS ist relativ stark auf SNMP fokussiert, vor allem was das Sammeln von Performance-Daten angeht. Ob Rechner (oder Dienste auf Rechnern) erreichbar sind, kann jedoch auch einfach anderweitig abgefragt werden.
Dieses Howto behandelt die Migration eines Netzwerk-Überwachungs-Systems von Nagios/Icinga zu OpenNMS. Für aktive Nagios-Checks beruht diese Migration auf dem NRPE Plugin (Nagios Remote Plugin Executor), welches von der stabilen OpenNMS-Version bereits unterstützt wird. Es erfordert also ein bereits vorhandenes NRPE-Setup für Nagios, bzw. eine Migration des Nagios-Setups zu NRPE. Passive Nagios-Checks via NSCA (Nagios Service Check Acceptor) werden durch SNMP-Traps in OpenNMS integriert und bedürfen keiner Änderung auf der Nagios-Seite, lediglich das send_nsca-Skript muss zentral ausgetauscht werden. Die Sammlung und Bearbeitung von Performance-Daten ist mit diesem Howto nicht möglich, hierfür wäre eine Erweiterung der OpenNMS Code-Basis nötig.

Aktive Nagios-Checks

Die aktiven NRPE-Checks werden durch den OpenNMS Service pollerd ersetzt. Dieser stellt das Modul NrpeMonitor zur Verfügung, welches im Prinzip dazu gedacht ist, einen NRPE-Service auf einem der bekannten Rechner zu überwachen. Dazu wird alle 5 Minuten (dieser Wert ist für jeden Dienst einzeln konfigurierbar) versucht, den NRPE-Dämon zu erreichen, wobei im Normalfall der Befehl „_NRPE“ abgefragt wird, welcher vom NRPE-Dämon als Spezialfall aufgefasst wird und bei normalen Betrieb ein „OK“ und die Versionsnummer von NRPE zurück liefert.
Alternativ kann jedoch in der Konfigurations-Datei des pollerd ein beliebiges Kommando für den NRPE-Dämon eingestellt werden, z. B. check_load. Wenn dieses Kommando dem NRPE-Dämon bekannt ist, wird es ausgeführt und liefert den üblichen Nagios-Status zurück (OK mit Rückgabewert 0, WARNING mit Rückgabewert 1, CRITICAL mit Rückgabewert 2 oder UNKNOWN mit Rückgabewert 3) sowie die Performance-Daten, welche jedoch momentan vom pollerd bzw. OpenNMS nicht ausgewertet werden.
Um die bestehenden Nagios-Checks in OpenNMS abzubilden, wird für jeden bisher verwendeten aktiven Nagios-Check ein NRPE-Service in OpenNMS definiert. Diese werden dann unabhängig voneinander in OpenNMS geführt. Hierfür sind zwei Konfigurations-Dateien von OpenNMS zu ändern:
  • Die Datei capsd-configuration.xml bestimmt, auf welche Dienste ein Rechner vom OpenNMS Service capsd beim Scannen untersucht werden soll.
  • Die Datei poller-configuration.xml bestimmt, welche bzw. in welcher Art die vom capsd gefundenen Dienste vom pollerd überwacht werden sollen.
Aus Sicherheitsgründen sollten dem NRPE-Dämon keine variablen Parameter übergeben werden; die Abfrage des gleichen Checks mit verschiedenen Parametern oder Schwellen-Werten sollte also als jeweils unterschiedliche Checks in NRPE definiert werden.

Anpassung der capsd Konfiguration

Für jeden NRPE-Check muss ein neuer protocol-plugin Abschnitt in capsd-configuration.xml definiert werden. Der class-name ist dabei stets org.opennms.netmgt.capsd.plugins.NrpePlugin, normalerweise müssen lediglich die Werte für protocol und der für das Attribut „command“ angepasst werden. Ein Beispiel wäre:
    <protocol-plugin 
      protocol="NRPE-load" 
      class-name="org.opennms.netmgt.capsd.plugins.NrpePlugin" 
      scan="on">
        <property key="banner" value="*" />
        <property key="port" value="5666" />
        <property key="timeout" value="3000" />
        <property key="retry" value="2" />
        <property key="command" value="check_load" />
    </protocol-plugin>
Der Wert für „protocol“ bezeichnet den Dienst, wie er intern bzw. im Web-Interface von OpenNMS geführt werden soll. Das Attribut „port“ bezeichnet den Port, auf dem der NRPE-Dämon zu erreichen ist, der Standard hierfür ist 5666. Das Attribut „command“ bezeichnet den vom NRPE-Dämon auszuführenden Check, wie er in /etc/nagios/nrpe.cfg (oder evtl. /etc/nagios/nrpe_local.cfg) definiert ist. In diesem Fall wird der übliche Nagios-Check „check_load“ für die Überprüfung der System-Auslastung in Bezug auf die Anzahl der laufenden Prozesse ausgeführt.
Zu beachten ist hierbei, dass OpenNMS vor Version 1.6.9 nicht genauer den Rückgabewert prüft und im Falle eines Checks, der nicht ein „OK“ (sondern vorübergehend ein „WARNING“ oder „CRITICAL“) zurück gibt den jeweiligen Check nicht erkennt. Hierfür wurde von uns ein Patch entwickelt, welcher ab Version 1.6.9 in OpenNMS enthalten ist. Falls eine frühere Version von OpenNMS eingesetzt wird, kann das Problem durch eine temporäre Anpassung der Schwellen-Werte in der NRPE-Konfigurations-Datei auf dem jeweiligen Rechner behoben werden, so dass zum Zeitpunkt der Erkennung NRPE den Dienst als „OK“ ansieht.
Falls in einem großen Rechner-Netzwerk eine Prüfung auf eine potentiell große Anzahl von NRPE-Checks nicht im allgemeinen erwünscht ist, können diese auch auf ein einzelnes Netzwerk-Segment oder einen IP-Bereich beschränkt werden. Dazu wird die Beispiel-Konfiguration in einen protocol-configuration Abschnitt eingebettet:
    <protocol-plugin 
      protocol="NRPE-load" 
      class-name="org.opennms.netmgt.capsd.plugins.NrpePlugin" 
      scan="off">
        <protocol-configuration scan="on" user-defined="false">
        <range begin="192.168.178.0" end="192.168.178.254"/>
        <specific>10.0.0.2</specific>
        <specific>10.0.0.7</specific>
        <property key="banner" value="*" />
        <property key="port" value="5666" />
        <property key="timeout" value="3000" />
        <property key="retry" value="2" />
        <property key="command" value="check_load" />
        </protocol-configuration>
    </protocol-plugin>
Wichtig ist hierbei der Tag <range begin=“$IP_ADRESSE“ end=“$IP_ADRESSE“/>, welcher den IP-Bereich definiert. Alternativ können auch über <specific>$IP_ADRESSE</specific> Tags bestimmte IP-Adressen festgelegt werden. Durch die Option scan= “off“ in der ersten Zeile wird auf allen anderen Rechnern nicht auf diesen Check geprüft.
Nach der Änderung von capsd-configuration.xml ist ein Neustart von OpenNMS nötig; alternativ (ein OpenNMS-Neustart kann je nach Größe des überwachten Netzwerks eine längere Zeit dauern) kann der capsd-Daemon per JMX RPC neu gestartet werden:
for i in stop init start; do
  wget --proxy=off -O /dev/null \
"http://manager:manager@localhost:8181/invoke?objectname=OpenNMS%3AName%3DCapsd&operation=$i"; 
done
Wenn die Änderung hauptsächlich für einen bestimmten Rechner veranlasst wurde und sofort aktiv sein soll, muss für diesen Rechner ein „Rescan“ ausgeführt werden; entweder per Web-Interface oder mit Hilfe des send-event.pl Skripts, welches das entsprechende Event (forceRescan) an OpenNMS (auf localhost laufend) übermittelt:
send-event.pl uei.opennms.org/internal/capsd/forceRescan localhost --interface 10.0.0.2

Anpassung der pollerd Konfiguration

Die Konfigurations-Datei für den pollerd-Service muss für jeden NRPE-Check an zwei Stellen geändert werden; zum einen muss ein <service> Absatz hinzugefügt werden, in dem der zu überwachende Service ähnlich wie in der capsd-Konfigurationsdatei definiert wird, außerdem muss eine <monitor service=[...]/> Zeile eingefügt werden um die Überwachung des jeweiligen Services zu aktivieren. Analog zu dem Beispiel im letzten Abschnitt wäre dies etwa folgendes:
    <service name="NRPE-load" 
      interval="300000" 
      user-defined="false" 
      status="on">
        <parameter key="retry" value="3" />
        <parameter key="timeout" value="3000" />
        <parameter key="port" value="5666" />
        <parameter key="command" value="check_load" />
        <parameter key="padding" value="2" />
    </service>
Jeweils zu ändern sind auch hier die Angaben für „service name“ und der Parameter „command“. Die Option „interval“ gibt das Überwachungs-Intervall in Millisekunden an, der Standard-Wert ist hier üblicherweise 300000, was 5 Minuten entspricht. Die entsprechende Zeile für die Aktivierung des NrpeMonitor ist
<monitor service="NRPE-load" 
 class-name="org.opennms.netmgt.poller.monitors.NrpeMonitor" 
/>
Auch beim Ändern der Datei poller-configuration.xml ist ein Neustart von OpenNMS nötig, bzw. ein analoger Aufruf der RPCs wie im letzten Abschnitt, mit Pollerd statt Capsd als Argument:
for i in stop init start; do
  wget --proxy=off -O /dev/null \
"http://manager:manager@localhost:8181/invoke?objectname=OpenNMS%3AName%3DPollerd&operation=$i"; 
done
Im demnächst folgenden zweiten Teil dieses Howtos wird die Integration von passiven Nagios-Checks behandelt.

PostgreSQL 9.0 veröffentlicht

| Keine Kommentare

postgreslogo.png


Die PostgreSQL Community hat heute die Veröffentlichung der stabilen Version 9.0.0 bekanntgegeben.

Mit der Version 9.0 verfügt PostgreSQL erstmals über eine eingebaute Replikationslösung (Streaming Replication) und die Möglichkeit, Standbyknoten im reinen Lesemodus zu betreiben (Hot Standby). Streaming Replication ermöglicht die transparente Replikation auf einen oder mehrere Standbyknoten mit geringer Latenz. Des Weiteren gibt es viele Änderungen im Bereich Skalierbarkeit, Geschwindigkeit und Wartung:

  • JOIN Removal
  • Unterstützung für 64 Bit Windows
  • Trigger mit Bedingungen
  • Spaltenbasierte Trigger
  • Anonyme Prozedurale Codeblöcke mit DO
  • Verbessertes Nachrichtensystem mit LISTEN/NOTIFY

Weitergehende Informationen können direkt über die Release Notes der PostgreSQL Global Development Group eingesehen werden.