(SSH-)Login überwachen / QNAP / Debian

Mal wieder ein bisschen Tech-Stuff zur Abwechslung.
Viele kennen vermutlich das ungute Gefühl, wenn man einen Server mit aktiviertem SSH-Login im Internet hängen hat. Man weiß trotz Absicherung der SSH-Konfiguration und dem Einsatz von Fail2Ban oder ähnlichem nie genau, ob nicht doch irgendwo etwas schief geht. Ein etwas ungutes Gefühl hinterlassen stellenweise auch so genannte VServer welche bei diversen Unternehmen bezogen werden können.

Das folgende Skript bietet weder einen 100%igen Schutz noch kann es in allen Fällen einen Zugriff auf das System entdecken. Es bietet aber einen gute Basis um im Fall der Fälle vielleicht doch eine E-Mail zu bekommen um schnell zu reagieren.

Ich versuche mal die Einrichtung des Skripts anhand eines Debian-Servers und meiner QNAP zu beschreiben. In beiden Fällen funktioniert es bei mir problemlos. Kombiniert mit einem Dienst wie z.B. ifttt.com lassen sich aus den Mails auch SMS oder Telefonanrufe generieren.

Debian

Die Einrichtung unter Debian geht ziemlich einfach von statten. Normalerweise sollten alle benötigten Pakete (postfix, bsd-mailx) bereits installiert und funktionsfähig sein. Wenn nicht, kann auch die folgende Installation der QNAP mit nail als Mailer herangezogen werden.
Mehr Informationen zum einrichten eines Mail-Servers unter Debian gibts z.B. hier:

http://wiki.ubuntuusers.de/Postfix

Im ersten Schritt wird ein Skript welches die benötigten Informationen sammelt irgendwo im Filesystem abgelegt. Für dieses Beispiel hier nennen wir das Skript einfachmal “alert.sh” und legen es nach “/usr/local/bin/”

#!/bin/bash
echo "Login detected at $(hostname) / $(date +%d.%m.%Y) $(date +%H:%M:%S)"
FROM=`echo $SSH_CONNECTION | awk '{ print $1 }'`
echo "Benutzer: $USER@$FROM"
echo
echo -n "Uptime: "
uptime
echo
echo "Last Login Activity: "
last
echo
echo "Logged in Users: "
finger

Wer möchte kann dieses Skript natürlich nach seinen Wünschen anpassen und verbessern.
Das Skript bekommt jetzt noch die passenden Rechte, damit es auch jeder Benutzer beim Login ausführen kann.

chmod 755 /usr/local/bin/alert.sh

Im “Normalfall” werden bei jedem Login die Profil-Daten gelesen. Erste Anlaufstelle ist meistens die /etc/profile. Genau da setzt der 2.Schritt dann an. Die Datei /etc/profile wird um folgendes erweitert:

...
# send mail on successful login
/usr/local/bin/alert.sh | mailx -s "SSH Login at $(hostname) detected" mail@domain.de
...

QNAP

Auch auf den QNAP-Systemen lässt sich dieser Schritt vollziehen. Das Skript fällt an dieser Stelle aber etwas kürzer aus, da die Busybox der QNAP ziemlich sparsam bestückt ist und das IPKG-Paket z.B. Dinge wie “finger” oder “last” nicht mitliefert.
Zuallererst brauchen wir auf der QNAP einen mailer. Hier bietet sich im Gegensatz zum Debian-Server nail an. nail kommt als IPKG-Paket mit und kann einfach angepasst werden.

ipkg install nail

Das Skript selbst kommt hier in einer minimalen Version

#!/bin/bash
echo "Login detected at $(hostname) / $(date +%d.%m.%Y) $(date +%H:%M:%S)"
FROM=`echo $SSH_CONNECTION | awk '{ print $1 }'`
echo "Benutzer: $USER @ $FROM"
echo
echo -n "Uptime: "
uptime

Der Schritt mit der /etc/profile ist auch hier identisch, mit der Ausnahme, dass der Mailer mailx durch nail ersetzt wird.

# send mail on successful login
/opt/bin/catch | nail -s "SSH Login at $(hostname) detected" mail@domain.de

Damit nail auch noch ohne MTA den passenden Mailserver findet, kann dieser in der /opt/etc/nail.rc eingetragen werden:

...
set smtp=smtp://smtp.domain.de
set from="qnap@domain.de (QNAP <MODELL>)"
set smtp-auth=login
set smtp-auth-user=qnap
set smtp-auth-password=blubber123
...

Anschließend auch hier noch das Skript mit den passenden Rechten versorgen

chmod 775 /opt/bin/alert.sh

ACHTUNG

Wie gesagt. Das Skript bietet nur rudimentäre Sicherheit. Es geht an dieser Stelle nichts über eine sinnvolle Härtung des Systems und sicheren Passwörtern oder Schlüsseln.
Trotzdem bietet das Skript zumindest einen kleinen Informationswert und funktioniert auch bei Logins in virtuellen Umgebungen (z.B. “vzctl enter <vid> (OpenVZ)” oder “vserver <vid> enter”).
Erfolgt der Zugriff allerdings direkt auf das Filesystem, in dem z.B . über den Root-Server
auf das Verzeichnis oder Volume zugegriffen wird, passiert gar nichts.

hpasmcli boot to PXE

Manchmal ist es nützlich, wenn man einem HP Proliant Server einfach sagen kann, dass er beim nächsten Boot per PXE booten soll. Gerade wenn man ein Firmware-Update per PXE einspielen will, erleichtert das die Arbeit ungemein, da man nicht mehr den Zeitpunkt für die Eingabe von F11 oder F12 im Boot-Screen abwarten muss.
Der Server bootet also per PXE die Firmware, aktualisiert sich und bootet anschließend wieder normal per HDD. Feine Sache …

hpasmcli -s "SET BOOT ONCE PXE"

Natürlich stehen auch andere Optionen noch zur Verfügung

	 SET BOOT FIRST [ CDROM | FLOPPY | HDD | PXE | USBKEY ]
	 SET BOOT ONCE [ CDROM | FLOPPY | HDD | PXE | RBSU ]

UMTS mit Lubuntu

Lubuntu ist toll. Lubuntu ist ein toller Ersatz für Ubuntu mit Unity … Vor allem für ältere Rechner. Schade nur, dass der Leistungsumfang von Ubuntu selbst “Out-Of-The-Box” nicht erreicht wird.

Wer ein UMTS-Modem mit Lubuntu nutzen möchte, muss zuerst mal folgende Pakete nachinstallieren. Ansonsten wird weder der UMTS-Stick, noch die möglichen Provider erkannt.

apt-get install modemmanager mobile-broadband-provider-info

modemmanager bringt die UMTS-Stick Unterstützung mit, mobile-broadband-provider-info die XML-Datenbank mit den möglichen Provider APN Einstellungen.

CAcert-Root-Zertifikat + Chromium

Das CAcert-Root-Zertifikat kann unter Linux (Ubuntu/Lubuntu) mit folgenden Statements importiert werden:

sudo apt-get install libnss3-tools
wget http://www.cacert.org/certs/root.crt
wget http://www.cacert.org/certs/class3.crt
certutil -d sql:$HOME/.pki/nssdb -A -t "TCu,Cu,Tuw" -n "CACert Class 1 Root Certificate" -i root.crt
certutil -d sql:$HOME/.pki/nssdb -A -t "TCu,Cu,Tuw" -n "CACert Class 3 Root Certificate" -i class3.crt
rm root.crt class3.crt

Alle anderen Browser sollten mit dem hier beschriebenen glücklich werden:

https://www.cacert.org/index.php?id=3

Tag 2 #osdc … Knowledge is Power …

Der 2.Tag der OSDC ging für mich mit einem sehr interessanten Vortrag zum Thema Troubleshooting im Bereich Mysql von Kenny Gryp los. Der Vortrag beleuchtete die typischen Admin-Probleme im Datenbank-Bereich. Wenn nichts mehr geht, ist immer die Datenbank schuld. Um dieses Missverständnis auszuräumen, wurden tiefgreifende Analysen vorgestellt.
Mein Fazit: MySQL (die Community Edition) wird irgendwann einmal genauso verwschwinden wir OpenOffice. Oracle entwickelt MySQL zwar weiter, die richtig guten Features finden aber nur Einzug in die Enterprise Edition. Alternativen? Meiner Meinung irgenwann einmal MariaDB und Percona Server. Percona patcht nicht nur MySQL mit dringend benötigten Features, sondern sorgt auch mit vielen durchdachten Tools für eine enorme Arbeitserleichterung. An dieser Stelle ein “Dickes Danke!”.
Der 2.Vortrag von Thomas Gelf (Datacenter aus der Puppenkiste) war eigentlich eher ein Mini-Live-Workshop denn einer trockenen Präsentation. An Puppet oder anderen Automatisierungstools wird in Zukunft nichts mehr vorbei gehen. Jochen Lillich hat das am Vortag sehr schön beschrieben indem er den Weg zur Industrialisierung (Doing, Automation, Information) herangezogen hat und dies mit den aktuellen Entwicklungsschritten in der IT verglichen hat. Der Vortrag hat
Scaling Mongo DB war eher eine Notlösung, entpuppte sich dann doch als sehr interessanter Vortrag. MongoDB selbst ist auf jeden Fall mal ein Versuch wert. Ob es die Problem, über die ich mir am Vortrag Gedanken gemacht habe, lösen kann, wage ich aber auch zu bezweifeln.
Anschließend habe ich noch mit einem halben Ohr den Ausführungen von Erkan Yanar zum Thema Multi Master Replikation mit MySQL zugehört. Der Vortrag war für mich von daher nicht so ganz interessant, da es um ein externes Produkt zur Integration in MySQL ging. Die Performance-Daten der Lösung waren ziemlich beeindruckend ( Welche sind das nicht :-) ). Mal sehen, vielleicht werfe ich doch noch einen genaueren Blick drauf.
Danach war für mich der Tag aufgrund eines Termins zuhause beendet. Wie auch auf der OSMC ist es sehr schade, dass manche Vorträge nicht zweimal gehalten werden. Ich persönlich hätte gerne noch den Vortrag über OpenNebula ansgeschaut. Leider war das Thema XtraBackup aber wichtiger :-(
Ansonsten bleibt mir nur der Dank an Netways für die tolle Organisation und das tolle Rahmenprogramm. Der Input in den 2 Tagen ist immens.

Tag 1 #osdc … Erkenntnisse

Dieses Jahr habe ich Gelegenheit zur Teilnahme an der #osdc in Nürnberg.
Die OSCD (Open Source Datacenter Conference) ist eine Konferenz mit dem Thema “Einsatz von Open Source im Rechenzentrum”. Ist die im Herbst stattfindende OSMC (Open Source Monitoring Conference) hauptsächliche auf den Bereich Monitoring mit Icinga, Nagios, Shinken, etc. ausgerichtet, so werden mit der OSDC vor allem die Sysadmins aus dem Ops-Bereich angesprochen.
Dieses Jahr nimmt der Bereich “Devops and Methods” einen, zu Recht, großen Teil ein. Das Thema Devops ist ja schon seit geraumer Zeit in aller Munde. Meiner Meinung nach zu Recht. Allerdings wird das Thema, ähnlich wie der Hype um die Cloud, etwas überbewertet. Devops ist ist vielen Bereichen bereits seit langer Zeit Standard. Was sich momentan entwickelt, sind vor allem die Strukturen und Abläufe. Eine weitere Verzahnung von Operations und Development macht auf jeden Fall Sinn, da die Anforderungen an den Bereich Operations in den letzten Jahren deutlich gestiegen sind. Hat es früher noch gereicht, wenn die Sysadmins ein Basis-System zur Verfügung gestellt und bei Bedarf einen Dienst neu gestartet haben, so wird heute mehr als nur das verlangt.
Zusätzlich zur Bereitstellung des Systems müssen heute, falls mehr als nur ein, zwei Server administriert werden, unter anderem folgende Komponenten möglichst sinnig implementiert werden:

  • Konfigurationsmanagement
  • Monitoring
  • Backupkonzept
  • Wiederherstellungsstrategie
  • Dokumentation
  • etc.
  • Zusätzlich dazu müssen in immer mehr Bereichen irgendwelche SLAs beachtet werden.
    Jede Menge Holz also für einen Berufstyp, welcher früher den Charme eines lichtscheuen Kellerkindes hatte und haupsächlich von irgendwelchen Nerds erledigt wurde. Ich bin mir auch fast sicher, dass die momentane Entwicklung des “devops” nur eine Zwischenstation ist und sich die Sysadmins und Zukunft auf ganz neue Aufgaben einstellen müssen.

    Wie ist mein Fazit zum heutigen Tag?

    Der erste Vortrag von Kris Köhntopp zum Thema “8 rollouts a day” spiegelt ein Stück weit den Trend zu Continuous Integration wieder. Wie auch im Bereich Development heute schon üblich (aus jedem Commit wird automatisch ein Build gebaut), wird es in Zukunft eine ähnliche Technologie im Bereich der Systemadministration geben. Ob “8 rollouts a day” auch in jeder Umgebung funktionieren wird, wage ich zu bezweifeln. Ein guter Ansatz ist es auf jeden Fall. Meiner Meinung nach muss der Deployment-Weg so weit autoamtisiert werden, dass es keinem händischen Eingriff mehr bedarf. Auch muss es eine Abkehr von festen Release-Zyklen und Builds geben. Eine Version sollte der Einfachheit halber nur eine begrenzte Anzahl an Features beinhalten. Zum einen reduziert dies die Fehleranfälligkeit und Komplexität, zum anderen wird dadurch auch schnell eine kontinuierliche Verbesserung der Software sicht- und fühlbar.
    Continuous Integration im Ops-Bereich ist für mich eine faszinierede Sache, über die ich in einer der nächsten Posts etwas genauer berichten werde.

    Der zweite Vortrag von Oliver Renault zum Thema “Introduction to Eucalyptus” hat gezeigt, dass alle nur mit Wasser kochen und ähnlichen Technologie nutzen. Wer eine “Cloud-Solution” kennt, kann sich auf die anderen schnell einstellen.
    Das Thema Cloud ist für mich sowieso ein sehr interessantes Thema. Die Interpretationsmöglichkeiten sind immens. Ich denke eher, dass sich die Technik in Richtung “Software As A Service (SaaS)” und “Infrastructure As A Service (IaaS)” etablieren wird. Anbieter X wird über eine Plattform tonnenweise Terrabytes zur Verfügung stellen, Anbieter Z über Loadbalancer und jede Menge VMs eine Webapp in einer Tomcat-Farm. Die Basis der Technik wird auf Loadbalancer, Virtualisierung und Skalierbarkeit in die Breite basieren. Interessant wird es im Bereich der Datenbanken werden. Der heutige Standard (RDBMS) ist ja bereits vor 5 Jahren an seine Grenzen gestoßen. Neue Technologien wie z.B. MongoDB oder Cassandra sind noch nicht weit genug verbreitet. In den meisten Fällen wird auch einfach das Wissen dazu fehlen. Heute wird versucht RDBMS über Kunstgriffe mit Clustering, mehr RAM, mehr Platten, also mehr IOPS und Sonderentwicklungen zu tunen. Für viele Bereiche durchaus ausreichend. Sobald aber eine extreme Skalierung in die Breite ins Spiel kommt, bei der immense Lese- und Schreibzugriffe passieren, ist die Technik am Ende. Man darf gespannt sein, was sich in diesem Bereich etabliert.

    Der Vortrag über “CFEngine and the future of configuration management is knowledge” zielt da bereits in die richtige Richtung. Knowledge is Power. Vor allem im Bereich des Konfigurationsmangements muss ein umdenken stattfinden. In Bereichen in denen mehrere hundert Server administriert werden, können Änderungen nicht mehr per Hand erfolgen und müssen entsprechend dokumentiert werden. Auch das Wissen, warum etwas geändert wurde, muss festgehalten werden.

    Devops and Open Source” war irgendwie der Basis-Vortrag zu allen vorhergehenden Vorträgen und hat zumindest einen Ansatz der Zusammenarbeit und auch der Tools beleuchtet.

    Richtig spannend und auch heiß duskutiert war der Vortrag von Jochen Lillich zum Thema “Operations mit Kanban“. Kanban ist ein ziemlich cooler und einfacher Ansatz um das hochdynamische Umfeld der Systemadministration in den Griff zu bekommen und eine verlässliche Planbarkeit zu gewährleisten. Kanban geht auf eine Initiative von Toyota zur Steigerung der Produktionskapazitäten zurück und beschreibt eigentlich nichts anderes als eine dokumentierte, messbare und kontrollierbare Steuerung einer Produktionskette. Übeträgt man dies nun auf den IT-Bereich, lassen sich viele Dinge übernehmen und umsetzen.
    So lässt sich z.B. eine Wertschöpfungskette über die Bereich Backlog, Spezifikation, Development, Test, Operations bilden. In den einzelnen Bereichen wird festgelegt, wieviele Aufträge parallel bearbeitet werdne können. Sind diese abgearbeitet, werden die nächsten Aufträge von der vorhergehenden Stufe abgeholt (Pull-Prinzip). Dies soll verhindern, dass nicht einzelne Gruppierungen in der Wertschöpfungskette überlastet sind und werden. Eine Dokumentation des Ganzen erschließt zum einen eine Meßbarkeit der Vorgänge, zum anderen auch eine Transparenz die wiederum das dringend benötgite Vertrauen in die IT schafft. Wichtig an dieser Stelle ist allerdings, dass alle Teile diesem Vorgehen zustimmen und sich vor allem daran halten.
    Jochen hat in seinem Vortrag ein Beispiel mit einem japanischen Garten geschildert. Dort bekommen die Besucher beim Eintritt eine Karte auf welcher nur der Satz steht, dass sie am Ausgang wieder abgegeben werden muss. Der Sinn dieser Karte ist, dass nur eine begrenzte Anzahl an Besuchern den Park besuchen kann. Sind die Karten aufgebraucht, geht nichts mehr. Dies soll den Ansatz von Kanban verdeutlichen. Es darf nur eine begrenzte Anzahl an Tasks zur selben Zeit in der definierten Queue vorhanden sein.
    Übertragen auf das tägliche Geschäft, fiel mir die Tatsache ein, dass in vielen Fällen, anstatt die Besucher abzuweisen, sofort neue Tickets gedruckt werden würden. Man darf auch gespannt sein, wie sich diese Technik weiterentwickeln wird. Ich bin mir aber sicher, dass dies ein guter Ansatz ist, die tägliche Arbeit zu organisieren.
    Aus den Diskussionen ging auch hervor, dass z.B. das Wasserfallmodell für die Systemadministration nur bedingt bis gar nicht geeignet ist. Das Wasserfallmodel beschreibt eigentlich die stufenweise Entstehung eines Produktes und greift auch dort meiner Meinung nach ein Stück weit daneben. In den wenigsten Unternehmen wird es heute noch so sein, dass genau eine Software entwickelt, getestet und ausgeliefert wird. Aus diesem Grund kann sich eine Kanban-artige Technik auch in der Entwicklung etablieren. Ob das dort heute oftmals verwendete Scrum der richtige Weg ist, wird sich auch noch herausstellen.

    Alles in allem ein sehr interessanter und aufschlußreicher Tag. Danke an alle Vortragenden.

    Icinga Performance und Memory Usage

    Icinga läuft hier jetzt seit ein paar Tagen mit 1584 Hosts und 9597 Services auf einer Instanz. Das ganze funktioniert soweit wunderbar und wie erwartet.
    Hier ein paar Details:

    Update:

    Und hier das ganze nochmal ohne mk_livestatus.

    Was das für mk_livestatus in der Installation bedeuten wird, dürfte sich erschließen :-) Vielleicht raucht dann Icinga auch weniger oft mit einem SIGSEV ab …

    Apache Authentifizierung gegen LDAP/Active Directory [ldap_search_ext_s() for user failed]

    Falls es bei der Authentifizierung am Apache gegen ein AD oder einen LDAP-Server zu folgendem Fehler kommt:

    ldap_search_ext_s() for user failed

    Dann sollte in der Datei /etc/openldap/ldap.conf der Wert REFERRALS auf off gesetzt werden.

    #
    # LDAP Defaults
    #
    # See ldap.conf(5) for details
    # This file should be world readable but not world writable.
    ...
    REFERRALS off
    ...

    Dies verhindert laut Doku, dass mod_authnz_ldap den vom AD oder LDAP-Server angegebenen Referrals folgt.
    Die Doku sagt dazu folgendes:

    REFERRALS [on /true/yes/off/false/no]
     
    Specifies if the client should automatically follow referrals returned by LDAP servers. The default is on. Note that the command line tools ldapsearch(1) & co always override this option.

    Falsche Performance-Daten im Plugin check_iftraffic3.pl

    Wie gestern schon geschrieben, bin ich über ein Problem mit skalierten Performance-Daten im Plugin gestolpert.
    Um nochmal alle zu beruhigen:

    Es handelt es sich dabei weder um ein Problem in Icinga, noch um ein Problem von pnp4nagios, sondern einzig und allein um eine nicht vollständig durchdachte Ausgabe im Check-Plugin selbst.
    Da die Änderung am pnp4nagios-Template gestern ein ziemlicher Schnellschuß war, welcher nicht durchgängig funktioniert, hier die vollständige, saubere Lösung.

    Die Ausgabe der Performancedaten wird ungefähr ab Zeile 422 zusammengebastelt:

    $output .=
    "|inUsage=$in_usage%;$warn_usage;$crit_usage outUsage=$out_usage%;$warn_usage;$crit_usage"
      . " inBandwidth=" . $in_traffic . $in_prefix . $suffix . " outBandwidth=" . $out_traffic . $out_prefix . $suffix 
      . " inAbsolut=$in_traffic_absolut outAbsolut=$out_traffic_absolut";

    Das Problem resultiert nun aus der Art und Weise, wie inBandwith und outBandwitdh gefüllt werden

    inBandwidth=” . $in_traffic . $in_prefix . $suffix
    $suffix . ” outBandwidth=” . $out_traffic . $out_prefix . $suffix

    $in_traffic und $out_traffic alleine würde an dieser Stelle vollkommen ausreichen, da diese bereits als kbyte/s aus den vorhergehenden Funktionen (ca. Zeile 279 und 280) geliefert werden.

    $in_bytes  = $response->{ $snmpIfInOctets . "." . $iface_number } / 1024; # in kiloBytes
    $out_bytes = $response->{ $snmpIfOutOctets . "." . $iface_number } / 1024; # in kiloBytes

    Leider, leider wird jetzt in den folgenden Zeilen munter auf diesen gleichen Variablen rumgerechnet. Das eigentliche Problem wird jetzt allerdings durch folgenden Code-Block verursacht:

    my $in_prefix  = "K";
    my $out_prefix = "K";
     
    if ( $in_traffic > 1024 ) {
    	$in_traffic = sprintf( "%.2f", $in_traffic / 1024 );
    	$in_prefix = "M";
    }
    if ( $out_traffic > 1024 ) {
    	$out_traffic = sprintf( "%.2f", $out_traffic / 1024 );
    	$out_prefix = "M";
    }
    if ( $in_traffic > 1024 * 1024 ) {
    	$in_traffic = sprintf( "%.2f", $in_traffic / 1024 * 1024 );
    	$in_prefix = "G";
    }
    if ( $out_traffic > 1024 * 1024 ) {
    	$out_traffic = sprintf( "%.2f",$out_traffic / 1024 * 1024 );
    	$out_prefix = "G";
    }

    Gut gemeint, schlecht gemacht.
    Diese Umformatierung sieht zwar im Standardoutput ziemlich cool und lesbar aus, macht aber wie schon beschrieben die Performance-Daten unbrauchbar.

    Wie bereits gestern geschrieben …

  • Fixing the check_iftraffic script to NOT scale perfdata is the RIGHT way.
    Fixing the template like this is much more comfortable, because you have to touch only one server :-)
  • … hier ein kleiner Ansatz.
    Im Prinzip benötigt das komplette Plugin ein Refactoring. Leider fehlt mir dazu momentan die Zeit dazu.

    Ab Zeile 371 kommt folgender Code-Block rein:

    371  ### by js 14.03.2012 
    372  ### preserve $in_traffic and $out_traffic in original format to print unscaled perfdate
    373  my $in_traffic_k = $in_traffic;
    374  my $out_traffic_k = $out_traffic;

    Zusätzlich wird der vorherige Block durch

    426  ### by js 14.03.2012
    427  ### old perfdata output removed, because perfdata will be scaled from Kbyte/s to Mbyte/s or Gbyte/s
    428  ### $in_prefix and $out_prefix is fixed and always "K" (suffix determines if it is Bytes/s or Bit/s)
    429  # Changed 20091214 gj - commas should have been semi colons
    430  # $output .=
    431  # "|inUsage=$in_usage%;$warn_usage;$crit_usage outUsage=$out_usage%;$warn_usage;$crit_usage"
    432  # . " inBandwidth=" . $in_traffic . $in_prefix . $suffix . " outBandwidth=" . $out_traffic . $out_prefix . $suffix 
    433  # . " inAbsolut=$in_traffic_absolut outAbsolut=$out_traffic_absolut";
    434  $output .=
    435  	"|inUsage=$in_usage%;$warn_usage;$crit_usage outUsage=$out_usage%;$warn_usage;$crit_usage"
    436	. " inBandwidth=" . $in_traffic_k . "K" . $suffix . " outBandwidth=" . $out_traffic_k . "K" . $suffix 
    437	. " inAbsolut=$in_traffic_absolut outAbsolut=$out_traffic_absolut";

    ersetzt.
    Damit werden zumindest die Performance-Daten in einem unskalierten Format (entweder KBit/s oder KByte/s) ausgegeben.

    Das Skript selbt kann hier herunter geladen werden: check_iftraffic3.pl

    Why scaled #icinga perfdata still sucks …

    Today i run into some problems while graphing perfdata with pnp4nagios. While the discussion on Twitter is limited to 140 signs, I thought here is better way to explain the problem.

    On serveral servers we run the Nagios-/Icinga-Plugin “check_iftraffic” to monitor the network interface traffic. This works as expected. An alarm is generated if the usage is to high and the generated graphs looks very nicley.
    Today I had a deeper look into the graphs to find a problem with bandwith usage. During this I found a problem with the perfdate delivered by this plugin.

    The Perfdata-Output of check_iftraffic is by default

    CRITICAL – Average IN: 367.03KBs (2.87%), Average OUT: 13.53MBs (108.26%)
    Total RX: 4086.52 MBytes, Total TX: 283.60 MBytes|inUsage=2.87%;85;98 outUsage=108.26%;85;98 inBandwidth=367.03KBs outBandwidth=13.53MBs inAbsolut=4285026695 outAbsolut=297373172

    The inBandwidth=367.03KBs outBandwidth=13.53MBs will now cause some fancy effects in pnp4nagios.

    First, it’s neither a pnp4nagios nor an Icinga problem … It’s just bad coding style.

    First, it’s neither a pnp4nagios nor an Icinga problem … It’s just bad coding style.

    So here is the solution:

    The generated XML for pnp4nagios divides the value and the label like this:

    ...
    <name>inBandwidth</name>
    <label>inBandwidth</label>
    <unit>KBs</unit>
    <act>367.03</act>
    ...
    <name>outBandwidth</name>
    <label>outBandwidth</label>
    <unit>MBs</unit>
    <act>13.53</act>
    ...

    While the template does drawing like the following example shows:

    $section = "2";  # usage in bits
    $ds_name[$section] = "Bandwidth";
    $opt[$section]  = "--vertical-label \"bit\"  --title \"Bandwidth on $hostname in KBs\" "; 
    $def[$section]  = "DEF:var1=$RRDFILE[1]:$DS[3]:AVERAGE " ;  # inusage bits
    $def[$section] .= "DEF:var2=$RRDFILE[1]:$DS[4]:AVERAGE " ;  # outusage bits
    $def[$section] .= "CDEF:inusage=var1,-1,* ";
    $def[$section] .= "AREA:inusage#FF00FF " ;
    $def[$section] .= "AREA:outusage#0000A0 " ;
    $def[$section] .= "GPRINT:var1:LAST:\"Bandwidth(in) \\tLast %4.2lf $UNIT[3]\" ";
    $def[$section] .= "GPRINT:var1:MAX:\"Max %4.2lf  $UNIT[3]\" ";
    $def[$section] .= "GPRINT:var1:AVERAGE:\"Average %4.2lf  $UNIT[3] \\n\" ";
    $def[$section] .= "GPRINT:var2:LAST:\"Bandwidth(out) \\tLast %4.2lf $UNIT[4]\"  ";
    $def[$section] .= "GPRINT:var2:MAX:\"Max %4.2lf $UNIT[4] \" ";
    $def[$section] .= "GPRINT:var2:AVERAGE:\"Average %4.2lf $UNIT[4] \\n\"   ";

    This is pretty funny, because 13.53 (MBs) is in pnp4nagios now less than 367.03 (KBs). The printed graph is now MUCH lower than it should be (because 13.53 MBs are approx 13854,72 KBs).

    What’s next?
    Fixing the check_iftraffic script to NOT scale perfdata is the RIGHT way.

    Fixing the check_iftraffic script to NOT scale perfdata is the RIGHT way.

    Fixing the template like this is much more comfortable, because you have to touch only one server :-)


    if ($UNIT[3] == “MBs”) {
    $def[$section] .= “CDEF:inusage=var1,-1,*,1024,* “;
    $def[$section] .= “AREA:inusage#FF00FF ” ;
    } else {
    $def[$section] .= “CDEF:inusage=var1,-1,* “;
    $def[$section] .= “AREA:inusage#FF00FF ” ;
    }
    if ($UNIT[4] == “MBs”) {
    $def[$section] .= “CDEF:outusage=var2,1,*,1024,* “;
    $def[$section] .= “AREA:outusage#0000A0 ” ;
    } else {
    $def[$section] .= “CDEF:outusage=var2,1,* “;
    $def[$section] .= “AREA:outusage#0000A0 ” ;
    }