HowTo: VMWare ESXi Backuplog per E-Mail verschicken

Ich habe ja letzte Woche eine Anleitung veröffentlicht, wie man auf dem VMWare ESXi Hypervisor wunderbar Backups macht.
Allerdings will man natürlich nicht immer nachsehen, ob die Backups nun erfolgreich waren oder nicht.
Deshalb die Idee der ESXi Server könnte doch einfach ein E-Mail schicken mit den Logfile des Backups?

Tja, das Problem ist wohl das der ESXi (wohl aus Sicherheitsgründen) wirklich sehr abgespeckt ist, und deswegen keine Möglichkeit um E-Mails zu versenden besitzt.

Aber ich hab mir da etwas einfallen lassen!

Nach langem suchen bin ich auf die Idee gekommen wir könnten doch einfach E-Mails verschicken mit Hilfe von netcat und einem Shell-Script!
netcat ist hier zu bekommen, ich habe hierbei einfach das i386 RPM-Paket runtergeladen und lokal entpackt.
Darin befindet sich eine netcat Binary die auch auf dem ESXi funktioniert!

Nachdem wir die netcat Binary auf den Server kopiert haben (in meinem Fall unter /vmfs/volumes/primary/custom/netcat), können wir mit folgendem Script E-Mails verschicken: #!/bin/sh

#################################################
 # Author: Michael Simmer
 # Date: 23.10.2010
 # Version: 0.2
 # Contact: http://www.zeux.at/
 #################################################
netcat="/vmfs/volumes/primary/custom/netcat"
 tmp="/tmp/mail"
 hostname=`hostname`
if [ -f $netcat ]
 then
if [ $# -eq 5 ]
 then
 echo -e "HELO $hostname\r" > $tmp
 echo -e "MAIL FROM: $2\r" >> $tmp
 echo -e "RCPT TO: $3\r" >> $tmp
 echo -e "DATA\r" >> $tmp
 echo -e "From: $2\r" >> $tmp
 echo -e "To: $3\r" >> $tmp
 echo -e "Subject: $4\r" >> $tmp
 echo -e "\r" >> $tmp
 if [ -f $5 ]
 then
 awk '{printf("%s\r\n", $0);}' < $5 >> $tmp
 #cat $5 >> $tmp
 #echo -e "\r" >> $tmp
 else
 echo "Error: File not found!"
 rm $tmp
 exit 1
 fi
 echo -e ".\r" >> $tmp
 echo -e "quit\r" >> $tmp
$netcat -i 1 $1 25 < $tmp
rm $tmp
 else
 echo "Usage: ./sendmail.sh     "
 exit 1
 fi
 else
 echo "Error: netcat Binary not found!"
 exit 1
 fi

bzw. sendmail.sh zum Herunterladen.

Das Script ist sehr leicht zu benutzen, einfach ./sendmail.sh [Mailserver] [von E-Mail Adresse] [an E-Mail Adresse] [Betreff] [Datei, dessen Inhalt in der Mail sein soll]
Beispiel: ./sendmail.sh mein.mailserver.com esxi@example.com empfaenger@example.com “ESXi Backup Logfile” /vmfs/volumes/primary/custom/backuplog.txt

Um nun auch ein Backuplog zu haben, das wir verschicken können, müssen wir bei unserem ghettoVCB.sh Script noch -l [/pfad/zum/logfile] anhängen.

Nun gibt es mehrere Möglichkeiten das Backuplog zu verschicken:

1. Wir verschicken das Backuplog per cronjob einige Zeit nach dem Backup per Mail weg.
Dazu brauchen wir einfach einen weiteren cronjob, der das sendmail.sh Script einige Stunden später aufruft.

2. Wir bauen den sendmail.sh Befehl in das ghettoVCB.sh Script ein, damit es nach dem Backup das Backuplog verschickt.
Wo ihr den sendmail.sh Befehl einbauen müsst, müsst ihr euch aber selbst raussuchen!

3. Wir bauen ein weiteres Script, dass das ghettoVCB.sh Script aufruft, und danach das sendmail.sh Script ausführt, und tragen dieses als cronjob ein.

Wem das komplette Backuplog zu lange ist, der baut einfach dazwischen noch folgendes ein:

mv /vmfs/volumes/primary/custom/backuplog.txt /vmfs/volumes/primary/custom/temp.txt
grep "info" /vmfs/volumes/primary/custom/temp.txt | grep -v "CONFIG" > /vmfs/volumes/primary/custom/backuplog.txt
rm /vmfs/volumes/primary/custom/temp.txt

Mein “Zwischenscript” (welches ich unter /vmfs/volumes/primary/custom/backup.sh abgelegt habe) sieht in etwa so aus:

 
#!/bin/sh
/vmfs/volumes/primary/custom/ghettoVCB.sh -f /vmfs/volumes/primary/custom/vmlist -c /vmfs/volumes/primary/custom/conf -l /vmfs/volumes/primary/custom/backuplog.txt
mv /vmfs/volumes/primary/custom/backuplog.txt /vmfs/volumes/primary/custom/temp.txt
grep "info" /vmfs/volumes/primary/custom/temp.txt | grep -v "CONFIG" > /vmfs/volumes/primary/custom/backuplog.txt
rm /vmfs/volumes/primary/custom/temp.txt
 /vmfs/volumes/primary/custom/sendmail.sh x.x.x.x esxi@domain.local mik@domain.local "ESXi Backup Log" /vmfs/volumes/primary/custom/backuplog.txt
rm /vmfs/volumes/primary/custom/backuplog.txt
 

In die /etc/rc.local trage ich also folgendes ein:
echo “0 1 * * 3 /vmfs/volumes/primary/custom/backup.sh” >> /var/spool/cron/crontabs/root

somit sieht mein cronjob nachher so aus:
0 1 * * 3 /vmfs/volumes/primary/custom/backup.sh

17 thoughts on “HowTo: VMWare ESXi Backuplog per E-Mail verschicken”

  1. 544 SMTP sycronization error

    keine Ahnung was ich noch machen soll habe Alles ausprobiert aber der Fehler bleibt

    Gruß Markus

    1. Hallo!

      Welcher Mail-Server?
      hast du es bei netcat mit dem argument “-w 1” schon versucht?

      Habe meine Version nur auf Microsoft Exchange 2007 getestet! 🙂

      lg,
      mik

      1. Zwar schon ein bisschen angestaubt, die Diskussion, aber bei Google halt recht weit vorne.

        Daher meine “Erklärung”, wenngleich auch ich leider nicht direkt eine Lösung weiß:
        Normalerweise ist smtp ein Dialog mit Frage – Antwort zwischen Mail-Server und Client, z.B. fragt der Server: “Username:”, woraufhin der Client antworten muss. Bestimmte Mailserver, wie z.B. Exim, mögen den Monolog (a la “da, hast Du meinen Rotz, mir doch egal, was Du sagst, ich kenne Deine Fragen eg schon”), wie ihn netcat produziert, nicht.

        Bei mir geht es mit Exim-Mailservern nicht, z.B. wie sie Hetzner verwendet. Wenn man selbst die Hoheit über den Mailserver hat, kann man Exim so konfigurieren, dass ihm der “Monolog” von netcat egal ist. Andere Mailserver sind nicht so “penibel”.

        Grade aus ESXi ist es schwierig, weil zwar z.B. python existiert, aber die “schöne” smtp-Bibliothek offenbar nicht. Sonst wären es ein paar Zeilen.

        Da hilft nur, einen anderen Mailserver zu verwenden, wie z.B. Exchange oder den von gmx, wobei letzterer seit 04.04.14 offenbar keine unverschlüsselten Mails mehr entgegen nimmt. Seitdem suche ich eben einen Mailserver bei einem Provider …

        Gruß
        Bogi

  2. Hallo Mik,

    vielen Dank für das wirklich tolle Script. Eine kleine Frage hätte ich, bitte: Warum wird der Inhalt der zu versendenden Datei zweimal (direkt hintereinander) in den Body der eMail kopiert?

    Danke vorab,
    Grüße

    Thomas

    1. Hallo Thomas,

      kann es sein, dass du die beiden Zeilen die mit # auskommentiert sind, ohne das # übernommen hast?
      (#cat $5 >> $tmp, #echo -e “\r” >> $tmp)

      Denn dann kann es passieren das du die Datei 2 mal bekommst.

      lg,
      mik

      1. Hallo Mik,

        … YES! 😉

        So einfach kann es sein, wenn man sich auskennt. Habe ich wirklich übersehen – sorry!

        Vielen Dank für Deine schnelle Hilfe,
        Viele Grüße

        Thomas

  3. Super Genial!
    Vielen Dank!

    Allerdings stimmen bei den mails die bei mir ankommen die Zeilenumbrüche im Log nicht mehr…

    Was wiederum dazu führt das das Log quasi absolut unleserlich ist.
    Eine Idee?

    1. Hallo!

      Versuch doch bitte mal folgendes als backup.sh Script:


      #!/bin/sh
      /vmfs/volumes/primary/custom/ghettoVCB.sh -f /vmfs/volumes/primary/custom/vmlist -c /vmfs/volumes/primary/custom/conf -l /vmfs/volumes/primary/custom/backuplog.txt
      /vmfs/volumes/primary/custom/sendmail.sh x.x.x.x esxi@domain.local mik@domain.local "ESXi Backup Log" /vmfs/volumes/primary/custom/backuplog.txt
      rm /vmfs/volumes/primary/custom/backuplog.txt

      Dann bekommst du zwar das ganze Logfile als E-Mail – könnte aber evtl. das Problem mit den Zeilenumbrüchen lösen.
      Bin schon gespannt ob dies hilft.

      lg,
      mik

  4. Hi,

    wenn ich das Skript ausführen möchte bekomme ich den Fehler “netcat binary not found”. Welcher teil des RPM-Archives muss sich in dem unter “netcat=” spezifizierten Pfad befinden?

    Grüße

    Sebastian

    1. Hallo,

      wenn man das RPM-Archiv entpackt sollte die netcat-Binary im Ordner “usr/bin” liegen!

      lg,
      mik

      1. Hi,

        Hat sich erledigt. Ich hatte schon die richtige binary. Der Fehler lag ein einem Tippfehler bei der Pfadangabe im sendmails.sh^^

        Danke für die Antwort!

  5. Mega Klasse Sache, danke dafür!

    Gibt es die Möglichkeit noch einen anderen Port anzuhängen?
    Mein SMTP lauscht leider auf einem anderen Port.

    Idee wie man das realisieren könnte?

    Beste Grüße. 🙂

    1. Hi,

      ich würde in der sendmail.sh in der Zeile 41:
      $netcat -i 1 $1 25 < $tmp
      die Zahl 25 auf die Portnummer ändern, die du brauchst.

      lg,
      mik

Leave a Reply

Your email address will not be published. Required fields are marked *