Mail mit attachments senden

Einfache mails kann man von der Linux Shell ganz einfach mittels:

echo "message body" | mail -s "subject" user@example.org

senden.

Schwieriger wirds bei attachments, da diese jeweils MIME-codiert werden müssen um beim Empfänger richtig angezeigt zu werden. – Zwar könnte man die files mittels mimeencode vor dem senden codieren, einfacher gehts jedoch mit dem Kommandozeilen tool "mutt", welches ggf. noch installiert werden muss:

mutt -s "subject" user.name@example.org -a /pfad/zum/file < /dev/null

Anstatt /dev/null kann man natürlich auch ne textdatei angeben, die dann als message body eingefügt wird.

Einer Partition den Laufwerksbuchstaben B: zuweisen

Windows XP gesteht Partitionen nur Laufwerksbuchstaben zwischen C und Z zu. Wenn man eine Partition auf B legen möchten, muss man etwas tricksen.

Um den Buchstaben zu ändern, öffnet man eine Kommandozeile (Start > Ausführen > cmd > OK) und tippt mountvol ein. Das Tool zeigt nun alle Geräte und den entsprechenden Mountpunkt (Laufwerksbuchstaben) an.

Nun kopiert man die Volume-ID des zu bearbeitenden Laufwerks (zum Beispiel {5ce033e0-a1a3-11db-b93c-806d6172696f}) und gibt anschliessend

mountvol Z: /D

ein (wobei Z für den zu ändernden Laufwerksbuchstaben steht). Damit unmountet man die Partition.

Letztendlich muss man das Volume wieder als B: einhängen. Dazu gibt man mountvol B: ?Volume{VOLUME-ID} ein. Wobei VOLUME-ID für die oben notierte ID des Gerätes steht:

mountvol B: ?Volume{5ce033e0-a1a3-11db-b93c-806d6172696f}

Nun sollte die Partition im Explorer oder Arbeitsplatz an der neuen Stelle mit der neuen Kennung stehen. Um diese Schritte rückgängig zu machen kann man die Datenträgerverwaltung verwenden oder wieder das Kommandozeilentool bemühen.

h1. Quellen
http://www.computerleben.net/artikel/Einer_Partition_B:_zuweisen-251.html

Benutzte User/Gruppen finden

Eine Standard Linux Installation kommt in der Regel mit 10-20 "Standard User Accounts", etwa "games" oder "news". – Häufig braucht man diese jedoch gar nicht und wenn man sein System absichert ist das sogar hinderlich.

Mit folgender Shell-Zeile kann man deswegen alle Benutzer auflisten lassen denen irgendwo auf dem System Files gehören; alle die NICHT aufgelistet sind können gefahrlos gelöscht werden:

cut -f 1 -d : /etc/passwd | while read i; do find / -user "$i" | grep -q . && echo "$i"; done 2> /dev/null

Und das selbe geht natürlich auch für die Benutzergruppen:

cut -f 1 -d : /etc/group | while read i; do find / -group "$i" | grep -q . && echo "$i"; done 2> /dev/null

vmware web-konsole stürzt nach CentOS-Upgrade ab

[stextbox id=“warning“ caption=“Achtung“]Ab CentOS 5.6 ist das Problem mit der glibc zwar wieder behoben; doch dann stürzt die vmware-konsole ab (vmware-hostd mit einem „Segemnation fault“), wenn der hack aktiv ist!

Um das Problem dann wieder zu lösen muss man lediglich in /usr/sbin/vmware-hostd die zweitletzte Zeile

export LD_LIBRARY_PATH=/usr/lib/vmware/lib/libc.so.6:$LD_LIBRARY_PATH

auskommentieren oder löschen.

Diese Beschreibung bleibt deshalb nur noch als Referenz hier und für solche welche den Hack früher schon mal gemacht hatten. – Falls der Hack noch nicht ausgeführt wurde, sollte man ab jetzt gleich auf CentOS 5.6 upgraden.[/stextbox]

Nach dem upgrade von CentOS 5.3 auf 5.4 oder eine höhere Version stürzt die vmware web-konsole mit einem "HTTP error code" ab.

Grund ist ein bug in vmware, der mit der aktuellen glibc nicht zurecht kommt.

Glücklicherweise lässt sich dies aber sehr einfach lösen, indem man die alte glibc herunter lädt und diese mit vmware verlinkt.

Folgendes script löst das Problem automatisch:

#!/bin/bash
###########################################
# This may help using the vmware-server2  #
# on a CentOS 5.4 x86_64 Host.            #
# There is a problem with the the libc    #
# More informations:                      #
# <a href="http://bugs.centos.org/view.php?id=3884" target="blank">http://bugs.centos.org/view.php?id=3884</a> #
#-----------------------------------------#
# Version 0.1                             #
# This script will get the 'old' libc     #
# from the CentOS 5.3 repositories and    #
# configures vmware-server2 to use this   #
# The original libc (for the 5.4-system)  #
# will not be replaced or touched.        #
#-----------------------------------------#
# License: Do with the code whatever you  #
# want. This came without any warrenty.   #
###########################################
 
LIBC_DIR="/usr/lib/vmware/lib/libc.so.6"
TEMP_DIR="/tmp/vmw_glibc"
VMWARE_CONFIGFILE="/usr/sbin/vmware-hostd"
VMWARE_CONFIGFILE_BAK=$VMWARE_CONFIGFILE.bak
 
# Checking for root
if <span class="keys"> $EUID -ne 0 </span>; then
    echo "This script must be run as root"
    exit 1
fi
 
# We test for the commands  we need:
echo "Looking for some commands I need..."
which wget
if [ $? != 0 ]; then
    echo "I can't find wget but need it to download the files. Please install."
fi
which rpm2cpio
if [ $? != 0 ]; then
    echo "I can't find rpm2cpio but need it to extract Files from a .rpm-file. Please install."
fi
 
# Creating a directory for the 'old' glibc
mkdir -p $LIBC_DIR
if [ $? != 0 ]; then
    echo "Can't create directory $LIBC_DIR"
    exit 2
fi
 
# Removing and creating a temporary directory for the rpm,
# downloading it, extracting the old glibc and copy
# the them to our new directory
rm -rf $TEMP_DIR
mkdir -p $TEMP_DIR
if [ $? != 0 ]; then
    echo "Can't create directory $TEMP_DIR"
    exit 2
fi
cd $TEMP_DIR
wget <a href="http://vault.centos.org/5.3/os/x86_64/CentOS/glibc-2.5-34.x86_64.rpm" target="blank">http://vault.centos.org/5.3/os/x86_64/CentOS/glibc-2.5-34.x86_64.rpm</a>
if [ $? != 0 ]; then
    echo "Something was wrong while downloading"
    exit 2
fi
rpm2cpio glibc-2.5-34.x86_64.rpm | cpio -ivd
mv lib64/libc-2.5.so $LIBC_DIR/libc.so.6
if [ $? != 0 ]; then
    echo "Can't move the libc into directory $LIBC_DIR"
    echo "Removing temporary files..."
    echo -rf $TEMP_DIR
    exit 2
fi
echo "The file libc-2.5.so from the centOS 5.3 rep. was saved in: $LIBC_DIR as libc.so.6"
 
echo "Removing temporary files..."
rm -rf $TEMP_DIR
 
# Now we editing the start-config of the vmware-server
echo "I must change $VMWARE_CONFIGFILE now, you will find a backup in $VMWARE_CONFIGFILE_BAK"
mv $VMWARE_CONFIGFILE $VMWARE_CONFIGFILE_BAK
cat $VMWARE_CONFIGFILE_BAK | grep -v 'eval exec "$DEBUG_CMD" "$binary" "$@"' > $VMWARE_CONFIGFILE
echo export LD_LIBRARY_PATH=$LIBC_DIR/libc.so.6:'$LD_LIBRARY_PATH' >> $VMWARE_CONFIGFILE
echo '' >> $VMWARE_CONFIGFILE
echo 'eval exec "$DEBUG_CMD" "$binary" "$@"' >> $VMWARE_CONFIGFILE
 
# Ensuring the script is executable
chmod 555 $VMWARE_CONFIGFILE
 
echo "Everything is done, please restart your vmware-server2"

Troubleshooting

Nach dem ausführen des scriptes sollte überprüft werden ob das file: /usr/sbin/vmware-hostd ausführbar ist.

Weiter öffnet man am besten mal: /usr/sbin/vmware-hostd und prüft die unterste export Zeile; dabei muss man darauf achten, dass LD_LIBRARY_PATH auf das Verzeichnis zeigt wo die "libc.so.6" liegt und nicht das File selbst!

So ist es falsch:

export LD_LIBRARY_PATH=/usr/lib/vmware/lib/libc.so.6/libc.so.6:$LD_LIBRARY_PATH

So sieht die korrekte export-Zeile aus:

export LD_LIBRARY_PATH=/usr/lib/vmware/lib/libc.so.6:$LD_LIBRARY_PATH

(Dies wird manchmal vom script durcheinander gebracht)

Nach einem vmware-neustart sollte sich dann die Konsole wieder öffnen lassen.

[stextbox id=“note“ caption=“Hinweis“]Seit der Firefox-Version 3.6 lässt sich die vmware Web-Konsole nicht mehr korrekt öffnen; dies ist jedoch nicht mit diesem bug relevant, sondern ein Bug im Firefox-Plugin.[/stextbox]

Related Links

OpenVPN benutzt zufällige Ports beim verbinden

Bei OpenVPN kann es vorkommen, dass jedes mal wenn sich ein Client reconnected versucht er sich auf einen neuen Port; aufsteigend ab 2048 zu Verbinden, d.h.: 2048,2049,2050,2051,usw., was natürlich die Firewall blockt. Die Meldungen im log sehen dann so aus:

openvpn[1388]: MULTI: multi_create_instance called
openvpn[1388]: XX.XX.XX.XX:<B>2056</B> Re-using SSL/TLS context
openvpn[1388]: XX.XX.XX.XX:2056 LZO compression initialized
openvpn[1388]: XX.XX.XX.XX:2056 Control Channel MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
openvpn[1388]: XX.XX.XX.XX:2056 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
openvpn[1388]: XX.XX.XX.XX:2056 Local Options hash (VER=V4): '530fdded'
openvpn[1388]: XX.XX.XX.XX:2056 Expected Remote Options hash (VER=V4): '41690919'
openvpn[1388]: XX.XX.XX.XX:2056 TLS: Initial packet from XX.XX.XX.XX:<B>2056</B>, sid=355db726 61057e4d
openvpn[1388]: XX.XX.XX.XX:2056 write UDPv4 []: Operation not permitted (code=1)
openvpn[1388]: XX.XX.XX.XX:2056 write UDPv4 []: Operation not permitted (code=1)
openvpn[1388]: XX.XX.XX.XX:2056 write UDPv4 []: Operation not permitted (code=1)
openvpn[1388]: XX.XX.XX.XX:2056 write UDPv4 []: Operation not permitted (code=1)
openvpn[1388]: XX.XX.XX.XX:2056 write UDPv4 []: Operation not permitted (code=1)
openvpn[1388]: XX.XX.XX.XX:2056 write UDPv4 []: Operation not permitted (code=1)
openvpn[1388]: XX.XX.XX.XX:2056 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
openvpn[1388]: XX.XX.XX.XX:2056 TLS Error: TLS handshake failed

Entsprechend auf den client:

daemon.notice openvpn(custom_config)[995]: SIGUSR1[soft,tls-error] received, process restarting
daemon.notice openvpn(custom_config)[995]: Restart pause, 2 second(s)
daemon.notice openvpn(custom_config)[995]: Re-using SSL/TLS context
daemon.notice openvpn(custom_config)[995]: LZO compression initialized
daemon.notice openvpn(custom_config)[995]: Control Channel MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
daemon.notice openvpn(custom_config)[995]: Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
daemon.notice openvpn(custom_config)[995]: Local Options hash (VER=V4): '41690919'
daemon.notice openvpn(custom_config)[995]: Expected Remote Options hash (VER=V4): '530fdded'
daemon.notice openvpn(custom_config)[995]: UDPv4 link local: [undef]
daemon.notice openvpn(custom_config)[995]: UDPv4 link remote: 178.83.21.126:1194
daemon.err openvpn(custom_config)[995]: TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
daemon.err openvpn(custom_config)[995]: TLS Error: TLS handshake failed
daemon.notice openvpn(custom_config)[995]: TCP/UDP: Closing socket

Schuld daran ist der nobind-Parameter, der manchmal in OpenVPN Dokumentationen bei Verbindungen mit dynamischer IP-Adresse empfohlen wird. – Denn ist dieser aktiviert bindet sich OpenVPN zwar nicht mehr an die IP-Adresse, aber eben auch nicht mehr an einen Port, was sehr mühsam ist.
Das herausnehmen des nobind-parameters löst dieses Problem dann.

postfix-mysql: queue file write error / Temporary lookup failure

Nachdem ich mein Postfix für die Verwendung mit mysql Tabellen konfiguriert hatte, bekam ich auf einmal beinahe täglich mails, die den Text: "451 4.3.0 Error: queue file write error" und/oder: "Temporary lookup failure" enthielten:

Transcript of session follows.
 
 Out: 220 mail.domain.tld ESMTP Postfix
 In:  EHLO [X.X.X.X]
 Out: 250-mail.domain.tld
 Out: 250-PIPELINING
 Out: 250-SIZE 10240000
 Out: 250-VRFY
 Out: 250-ETRN
 Out: 250-AUTH PLAIN LOGIN
 Out: 250-AUTH=PLAIN LOGIN
 Out: 250-ENHANCEDSTATUSCODES
 Out: 250-8BITMIME
 Out: 250 DSN
 In:  AUTH PLAIN XXXXXXXXXXXXXXXXXXXXXXX
 Out: 235 2.0.0 Authentication successful
 In:  MAIL FROM:<sender@example.org> SIZE=1037
 Out: 250 2.1.0 Ok
 In:  RCPT TO:<empfaenger@example.org>
 Out: 250 2.1.5 Ok
 In:  DATA
 Out: 354 End data with <CR><LF>.<CR><LF>
 Out: 451 4.3.0 Error: queue file write error
 
Session aborted, reason: lost connection

Zwar schien alles zu funktionieren und die mails kamen auch immer noch rein, ich wollte jedoch der Meldung nachgehen.

Im maillog wurde ich dann fündig, denn folgende Fehlermeldung tauchte ziemlich oft auf:

warning: mysql query failed: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=

Dies kam davon, weil ich die postfix Datenbank noch auf dem alten Server angelegt hatte und auf dem der Zeichensatz: latin1_swedish_ci standardmässig eingestellt war, beim neuen Server war jedoch UTF8 standard.

Das Problem kann man dann lösen, wenn man die Postfix Datenbank wie folgt konvertiert:

Login auf mysql:

mysql -uroot -p

dann für jede Tabelle:

ALTER TABLE tbl_name CHARACTER SET utf8 COLLATE utf8_general_ci;

und für jedes Textfeld:

ALTER TABLE tbl_name MODIFY email varchar(255) CHARACTER SET utf8;

Quelle

System monitoring mit Nagios

Sobald man eine Anzahl Server und andere Netzwerkgeräte zu administrieren hat, kommt man beim Thema monitoring nicht vorbei. Damit lässt sich beispielsweise überwachen ob ein Webserver noch läuft, ob der Toner im Drucker schon verbraucht ist und vieles mehr. Wir werden hier einen Nagios monitoring Host aufsetzen und schritt-für-schritt dessen Funktionalität erklären.

Einführung

todo

Die Standard-Konfiguration in Nagios ist jedoch etwas suboptimal aufgebaut und sieht vor, dass man für jeden Host eine Konfigurationsdatei hat in der die Services gleich definiert sind. Dies hat dann jedoch den Nachteil, dass man häufig verwendete Servicechecks bei jedem Host wieder neu definieren muss, was mit der Zeit sehr unübersichtlich und mühsam wird.

Wir werden deshalb ein besonderes Augenmerk auf eine professionelle Konfiguration richten, die auch in grossen, professionellen Umgebungen hält.

Nagios und die Objekte…

In Nagios ist alles als ein sogenanntes „Objekt“ definiert; diese kann man sich wie die Objekte bei der Programmierung vorstellen.
Man definiert zuerst ein sog. „Objekt-Template“; dieses hat dann schon mal die Grundlegenden Eigenschaften, wie Benachrichtigungs-Intervall, Kontaktgruppen an den die Benachrichtigung gesendet wird, usw.
Dann erstellt man für die verschiedenen Subtypen weitere Objekte, die dann die Eigenschaften des vorherigen Objektes „erben“. Diese Eigenschaften kann man dann überschreiben und/oder noch zusätzliche Eigenschaften hinzufügen.

Die Standard-Definitionen befinden sich in der Datei „templates.cfg“.

Hier findet man Objekt-Vorlagen (templates) zu den typen: contacts, contactgroups, hosts, hostgroups und services.

Schauen wir uns mal ein Beispiel für einen Host an:

define host{
        name                            generic-host    ; The name of this host template
        notifications_enabled           1               ; Host notifications are enabled
        event_handler_enabled           1               ; Host event handler is enabled
        flap_detection_enabled          1               ; Flap detection is enabled
        failure_prediction_enabled      1               ; Failure prediction is enabled
        process_perf_data               1               ; Process performance data
        retain_status_information       1               ; Retain status information across program restarts
        retain_nonstatus_information    1               ; Retain non-status information across program restarts
        notification_period             24x7            ; Send host notifications at any time
        register                        0               ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
        }

Wir möchten nun einen Host für die Linux-Server machen, der genau so eingestellt ist wie „generic-host“, mit zwei Ausnahmen:

  • Die Benachrichtigungen sollen nur während den Arbeitszeiten verschickt werden (workhours)
  • Die Benachrichtigungen sollen nur an Leute in der Kontakgruppe „linux-admins“ verschickt werden

Dies würde dann so aussehen:

define host{
        name                            linux-server
        use                             generic-host
        notification_period             workhours
        contact_groups                  linux-admins
        register                        0
        }

Mit dem Keyword „use“ sagt man hier, dass man alles von „generic-host“ übernehmen will, danach definiert man „notification_period“ neu und fügt „contact_groups“ hinzu.

Und bei der Definition eines Hosts verwendet man dann dieses template, wieder mit „use“ (aber ohne „register“ am Schluss!) wie folgt:

define host{
        use                     linux-server
        host_name               host1
        alias                   host1
        address                 XX.XX.XX.XX
        }

Nun noch eine kurze Beschreibung der verschiedenen Objekttypen:

Objekttypen

contacts / contactgroups

Jede Person, die nagios benutzt muss als ein Kontakt-Objekt definiert sein; die grunsätzlichen Parameter sind: name, email und evtl. pager (handy/sms) Nummer.
Mehrere Kontakte können in einer Kontakgruppe zusammen gefasst werden, z.B. „linux-admins“.

Nagios benutzt diese Informationen hauptsächlich um Benachrichtigungen zu versenden; als Benachrichtigungsempfänger kann man entweder nur einen einzelnen Kontakt oder eine ganze Kontaktgruppe angeben.

[stextbox id=“note“ caption=“Hinweis“]Jede Person, die auch das Nagios-Frontend verwenden möchte, muss zusätzlich in der Datei: /etc/nagios/htpasswd.users stehen.
Um nun einen Benutzeraccount fürs Frontend zu erstellen benutzt man am besten das Programm htpasswd:

htpasswd /etc/nagios/htpasswd.users USERNAME

[/stextbox]

hosts / hostgroups

Wie die Kontakte muss jeder Host, den man überwachen möchte als Host-Objekt definiert sein. – Man kann hier auch wieder mehrere Hosts in einer Hostgruppe zusammenfassen; dies macht vor allem da Sinn wo man gewisse checks für mehrere Hosts gleichzeitig machen mcöhte.
[stextbox id=“note“ caption=“Hinweis“]Eine gute Idee ist es deshalb für alle Hosts die ähnlich konfiguriert sind eine Gruppe zu machen, beispielsweise „centos“ oder „ubuntu“.[/stextbox]

services [[service groups]

Für jeden „Service“ (z.B. http, ssh oder backup) den man überwachen möchte, muss man nun noch ein Service-Objekt definieren.
In diesem Objekt kann man auch wieder definieren an wen die Benachrichtigungen gehen sollen (contact,contactgroup) und auf welchen Host der Service überwacht werden soll.
Man kann hier auch wieder „Service-Gruppen“ machen, doch das wird in der Regel sehr selten verwendet.

Installation

Die Installation wurde auf einem CentOS-System gemacht, kann aber natürlich für alle weiteren Systeme 1:1 umgsetzt werden; lediglich Paketmanager und Paketnamen unterscheiden sich jeweils geringfügig.

Zuerst installieren wir nagios, nagios-plugins und nrpe:

yum install icinga icinga-gui icinga-idoutils nagios-plugins nagios-plugins-setuid nagios-plugins-nrpe

Konfiguration

Überlegungen

Da die Konfiguration eines Nagios-Systems bereits nach kurzer Zeit sehr komplex werden kann, macht es Sinn eine gescheite Struktur aufzubauen.
Grundsätzlich werden wir alle Konfigurations-Dateien in Verzeichnis /etc/conf.d/ haben; möchte man nun aber noch externe Netzwerke (z.B. die von Kunden) überwachen sollte man diese nicht mit den „eigenen“ mischen; stattdessen würde man ein Verzeichnis /etc/conf.d.KUNDE anlegen und diese in der Datei /etc/nagios/nagios.cfg als cfg_dir eintragen.

Danach gibt es zwei sinnvolle Konfigurationen, welche man nimmt hängt von den individuellen Vorlieben ab; diese werde ich hier kurz erklären:

Wenige, grosse Konfigurationsdateien

Bei dieser Konfiguration würde man eine Datei für alle Kontakte-, eine für alle Hosts-, eine für alle Hostgruppen-, eine für alle Services- und eine Datei erstellen die dann die Checks den Hosts zuweist.

Diese Struktur würde so aussehen:

/etc/nagios/
|-- cgi.cfg
|-- conf.d
|   |-- checks.cfg
|   |-- commands.cfg
|   |-- contacts.cfg
|   |-- hostgroups.cfg
|   |-- hosts.cfg
|   |-- services.cfg
|   |-- templates.cfg
|   `-- timeperiods.cfg
|-- htpasswd.users
|-- nagios.cfg
|-- nrpe.cfg
`-- resource.cfg

Viele kleine Konfigurationsdateien

Bei der zweiten Konfiguration würde man für Kontakte-, Hosts-, Hostgruppe- und Services je ein Verzeichnis erstellen und darin für jeden Service eine Datei. Dies sähe dann so aus:

/etc/nagios/
|-- cgi.cfg
|-- conf.d
|   |-- contactgroups
|   |   |-- admins.cfg
|   |   `-- linux-admins.cfg
|   |-- contacts
|   |   |-- Hans_Muster.cfg
|   |   |-- John_Doe.cfg
|   |   `-- nagiosadmin.cfg
|   |-- hostgroups
|   |   `-- linux.cfg
|   |-- hosts
|   |   |-- host1.cfg
|   |   |-- host2.cfg
|   |   `-- host3.cfg
|   |-- misc
|   |   |-- commands.cfg
|   |   |-- templates.cfg
|   |   `-- timeperiods.cfg
|   `-- services
|       |-- backup.cfg
|       |-- http.cfg
|       |-- load.cfg
|       |-- ping.cfg
|       |-- ssh.cfg
|       `-- yum.cfg
|-- htpasswd.users
|-- nagios.cfg
|-- nrpe.cfg
`-- resource.cfg

Für welche der beiden Varianten man sich entscheidet ist egal, beide sind sehr flexibel und auch in grossen Umgebungen noch übersichtlich. Ich werde später die Konfiguration beider Varianten erklären, machen muss/kann man natürlich nur eine. 😉

Zuerst jedoch erstellen wir mal die Basisstruktur.

Basisstruktur

Da wir die Konfiguration von vorne beginnen, ist es ratsam, sich das Originalverzeichnis erst mal zu kopieren; dies kann später wieder gelöscht werden, wenn die neue Konfiguration läuft:

cp -pvR /etc/nagios /etc/nagios.orig

Nun erstellen wir die neue Struktur:

mkdir -pv /etc/nagios/conf.d/
cd /etc/nagios/objects/
mv -v commands.cfg templates.cfg timeperiods.cfg /etc/nagios/conf.d/
cd ~
rm -rfv /etc/nagios/objects
rm -fv /etc/nagios/command-plugins.cfg

Nun öffnen wir die Datei: /etc/nagios/nagios.cfg
Darin wird erstmal alles was „cfg_dir“ und „cfg_file“ ist gelöscht, oder auskommentiert; dann fügen wir die Zeile:

cfg_dir=/etc/nagios/conf.d

hinzu.

Nun muss man sich für eine der beiden Varianten entscheiden:

Variante 1: Wenige grosse Dateien

Variante 2: Viele kleine Dateien

Erstellen wir zuerst die Verzeichnisstruktur:

mkdir -pv /etc/nagios/conf.d/{contactgroups,contacts,hostgroups,hosts,misc,services}
cd /etc/nagios/conf.d/
mv -v commands.cfg templates.cfg timeperiods.cfg /etc/nagios/conf.d/misc/

Für jeden Benutzer, der nagios benutzen soll, erstellen wir nun eine contacts-Datei (der „Standardkontakt“ nagiosadmin sollte auch erstellt werden):
/etc/nagios/contatcs/nagiosadmin.cfg

define contact{
        contact_name                    nagiosadmin             ; Short name of user
        use                             generic-contact         ; Inherit default values from generic-contact template (defined above)
        alias                           Nagios Admin            ; Full name of user
        email                          admin@localhost ; <<__* CHANGE THIS TO YOUR EMAIL ADDRESS ____
        }

Nun erstellen wir eine Kontaktgruppe:
/etc/nagios/contactgroups/admins.cfg

define contactgroup{
        contactgroup_name       admins
        alias                   Nagios Administrators
        members                 nagiosadmin
        }

Für jeden Host, den wir Monitoren wollen, erstellen wir eine Hosts-Datei:
/etc/nagios/conf.d/hosts/host1.cfg

define host{
        use                     linux-server
        host_name               host1
        alias                   FileServer
        address                 XX.XX.XX.XX 	; << IP-Adresse des Servers
        }

Nun erstellen wir noch eine Hostgruppe für alle Linux-Server:
/etc/nagios/hostgroups/linux.cfg

define hostgroup{
        hostgroup_name  linux                ; The name of the hostgroup
        alias           Linux Servers        ; Long name of the group
        members         host1, host2, host3  ; Comma separated list of hosts that belong to this group
}

Und zu guter Letzt erstellen wir noch für jeden Service, den wir überwachen wollen eine Datei in: /etc/nagios/services/
Hier ein Beispiel für check_http, der überprüft ob ein Server per HTTP erreichbar ist:
/etc/nagios/conf.d/services/http.cfg

define command{
        command_name    check_http
        command_line    $USER1$/check_http -H $HOSTADDRESS$ -I $HOSTADDRESS$
        }

define service{
        use                             generic-service
        host_name                       server1
        service_description             HTTP
        check_command                   check_http
        }

[stextbox id=“note“ caption=“Hinweis“]Anstatt host_name könnten wir den Check mit hostgroup_name auch auf der ganzen Gruppe-, oder mit „host_name *“ auf sämtlichen Hosts ausführen.[/stextbox]

Benutzung

Neuer Host hinzufügen:

Um dieser Konfiguration einen neuen Host hinzu zu fügen müssen wir:

  • Eine Datei für diesen Host in /etc/nagios/conf.d/hosts/ anlegen
  • Diesen Host zu den passenden Hostgruppen in /etc/nagios/conf.d/hostgroups/ hinzufügen
  • Den Host in all den entsprechenden Dateien in /etc/nagios/conf.d/services/ hinzufügen, oder, sollte noch kein entsprechender Service vorhanden sein, diesen anlegen

[stextbox id=“note“ caption=“Hinweis“]Falls der neue Host bereits in einer Hostgruppe ist, die mit einem Service verbunden ist, muss dieser nicht noch einzeln für den Host definiert werden.[/stextbox]

Erweiterungen

pnp4nagios

Mit pnp4nagios lassen sich die performancedaten der plugins in schöne Graphen darstellen.

Zuerst bereiten wir als root die Umgebung vor:

yum install rrdtool rrdtool-perl
mkdir -v /usr/local/src/icinga && chown -v icinga:icinga /usr/local/src/icinga

Nun wechseln wir zum icinga user:

cd /usr/local/src/icinga/
wget http://sourceforge.net/projects/pnp4nagios/files/PNP-0.6/pnp4nagios-0.6.21.tar.gz/download
tar -xvzf pnp4nagios-0.6.21.tar.gz && rm -v pnp4nagios-0.6.21.tar.gz
cd pnp4nagios-0.6.21/
./configure --with-nagios-user=icinga --with-nagios-group=icinga --bindir=/usr/local/bin --libexecdir=/usr/local/libexec/pnp4nagios --sysconfdir=/etc/icinga/pnp4nagios --localstatedir=/var/local/pnp4nagios --libdir=/usr/local/lib/pnp4nagios --datarootdir=/usr/local/share/pnp4nagios
make all

Nach dem configure script sollte man die Ausgabe kontrollieren, insbeosndere ob die Pfade stimmen.
Danach noch (als root) installieren:

sudo make fullinstall

Nun sollte man die Datei: /etc/httpd/conf.d/pnp4nagios.conf kontrollieren, ggf. anpassen und apache neu starten:

/etc/init.d/httpd restart

Nun muss man die zwei (schon vorhandenen) commands in: icinga/commands.cfg kontrollieren (Pfade!):

define command {
       command_name    process-service-perfdata
       command_line    /usr/bin/perl /usr/local/libexec/pnp4nagios/process_perfdata.pl
}

define command {
       command_name    process-host-perfdata
       command_line    /usr/bin/perl /usr/local/libexec/pnp4nagios/process_perfdata.pl -d HOSTPERFDATA
}

Nun kann man mittels Aufruf von: http://example.net/pnp4nagios die Ausgabe kontrollieren.
Ist alles ok, können wir noch das install.php file disablen:

mv -v /usr/local/share/pnp4nagios/install.php /usr/local/share/pnp4nagios/install.php.ignore

Um bereits im GUI eine vorschau zu erhalten, muss noch ein SSI-File kopiert werden:

cp -v /usr/local/src/icinga/pnp4nagios-0.6.21/contrib/ssi/status-header.ssi /usr/share/icinga/ssi/

Nun erstellen wir ein template um die Graphen einzufügen in icinga/templates.cfg:

define service {
       name                                    pnp-link-popup
       icon_image                               ../invisible.png' border="0"</a> <A target="_blank" href="/pnp4nagios/graph?host=$HOSTNAME




amp;srv=$SERVICEDESC




quot; class="tips" rel="/pnp4nagios/popup?host=$HOSTNAME




amp;srv=$SERVICEDESC




amp;view=0"><img src="../images/trends.gif" register 0 }

Um nun einen Service für die Performance-Auswertung zu aktivieren, reicht es das template „pnp-link-popup“ hinzuzufügen:

use                             OTHER_TEMPLATES, pnp-link-popup

Quellen

Nagios: Backups mit Platzhaltern monitoren

Nagios ist ein grandioses Tool um diverse Dinge zu monitoren, beispielseise backups.

Ich monitore diese meist mit dem Plugin check_file_age. – Doch was macht man, wenn man Backup files in der form: /backup/wichtiges_file-2010-05-18-2.zip hat?

Die Lösung ist die einfachste überhaupt und hat mich selbst auch überrascht: Denn man kann in Nagios durchaus auch shell-kommandos mitgeben.

So löst man dieses Problem mit einem check:

command[check_backup]=/usr/local/nagios/libexec/check_file_age -c 86400 -w 86400 -C 500000 -W 500000 -f /backup/wichtiges_file-`date +"%Y-%b-%d"`*.zip

Quelle

http://optimalops.blogspot.com/2010/01/fun-with-nagios-part-2-check-yer.html

Lenovo Notebooks: Touchpad und Keyboard reagieren nicht

Einige Besitzer von Lenovo Notebook aus der Baureihe: T50, T51, T60, T61 (und vermutlich noch andere) werden nach einer Neuinstallation von Windows und durchführen der ersten Windows Updates entrüstet feststellen, dass das TouchPad oder das Keyboard nur noch sporadisch funktioniert, manchmal klingt auch der Windows-Startsound etwas zerstückelt.

Das Problem liegt am Treiber Update, dass Lenovo über die Windowsupdates zur Verfügung stellt – Die Lösung: Den Lenovo treiber einfach nicht updaten. 😉

Dazu wählt man bei Windows Update die benutzerdefinierte Installation und wählt das häckchen bei: Synaptics Thinkpad UltraNav Pointing Devices ab. Dann noch Bestätigen, dass dieses update nicht mehr angezeigt werden soll und gut ist!

{img fileId="62" thumb="y" alt="" rel="box[g]"}
{img fileId="63" thumb="y" alt="" rel="box[g]"}