wordpress themes | total verfriemelt

Total Verfriemelt

am Rande des Wahnsinns

Die Geschichte mit dem ESXi Backupscript ist ja nicht neu und mich sowie viele andere User stört die fehlende Möglichkeit, Statusmails zu versenden.  Ich habe bisher ab und zu mal in die Backups geschaut und geguckt ob auch alles gesichert wurde. Da auf dem ESXi bei mir nur unkritische Systeme laufen, ist es nicht ganz so wild wenn mal ein Backup fehlt, nervig ist es dann aber trotzdem. Nun ist es mit Hausmitteln aber nicht möglich Mails zu versenden und ich denke VMware hat sich etwas dabei gedacht, die Busybox so extrem abzuspecken. Zum einen werden Sicherheitstechnische Gründe dahinter stecken und zum anderen soll der ESXi auch auf USB Sticks etc. passen. Also muss eine andere Lösung her und beim erforschen des Systems ist mir Python eingefallen. Leider hat VMware auch hier an sehr vielen Librarys gespart, so fehlt auch die wichtigste Lib für den Mailversand, die smtplib.


Python 2.5 (r25:51908, Mar  5 2007, 23:18:19)
[GCC 4.1.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import smtplib
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
ImportError: No module named smtplib

Die Ausgabe zeigt schon, dass VMware die Version 2.5 einsetzt. Also habe ich eben diese Version von Python heruntergeladen und den enthaltenen Lib Ordner auf einen Datastore entpackt.

Link

Mein Python Mailscript sieht so aus:


#!/bin/python

import smtplib
import getopt
import sys
import string

def usage():
 print "sendemail.py -mmailhost -rrecipient -ssubject -ffrom [-d] < messagebody.txt"
def prtdebug(msg):
 if debugmsgs != None:
 print msg

try:
 optlist, args = getopt.getopt(sys.argv[1:], 'm:r:s:hf:d', ["mailhost=", "recipient=","subject=","help", "from=", "debug"])
except getopt.GetoptError, err:
 # print help information and exit:
 print str(err) # will print something like "option -a not recognized"
 usage()
 sys.exit(2)
mailhost = None
recipient = None
subject = None
sender = None
debugmsgs = None
for o, a in optlist:
 if o == "-m":
 mailhost = a
 prtdebug("set mailhost to %s" % (a))
 elif o == "-r":
 recipient = a
 prtdebug("set recipient to %s" % (a))
 elif o == "-s":
 subject = a
 prtdebug("set subject to %s" % (a))
 elif o == "-f":
 sender = a
 prtdebug("set sender to %s" % (a))
 elif o == "-h":
 usage()
 sys.exit(1)
 elif o == "-d":
 debugmsgs = True
 prtdebug("Enabling debug messages")
 else:
 assert False, "unhandled option"
if mailhost == None or recipient == None or subject == None or sender == None:
 usage()
 sys.exit(1)

body = string.join(sys.stdin.readlines(), "")
prtdebug("Email body:\n%s" % (body))
# Prepare actual message

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (sender, recipient, subject, body)
prtdebug("Formated email:\n%s" % (message))
# Send the mail

server = smtplib.SMTP(mailhost, 25)
server.sendmail(sender, [recipient], message)
server.quit()

Das Python Script habe ich in dem Lib Ordner gespeichert und durch folgenden Befehl aufgerufen:

/vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib # python -v sendmail.py -mmailserver.acme.com -rrecipient@acme.com -sTest -ffrom@acme.com -d < /vmfs/volumes/datastore1/bla.txt

Die bla.txt enthält den Text und kann natürlich auch das Logfile des ESXi Backup Scripts sein.


/vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib # python -v sendmail.py -mmailserver.acme.com -rrecipient@acme.com -sTest -ffrom@acme.com -d < /vmfs/volumes/datastore1/bla.txt
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# /lib/python2.5-visor/site.pyc matches /lib/python2.5-visor/site.py
import site # precompiled from /lib/python2.5-visor/site.pyc
# zipimport: found 292 names in /lib/python25-visor.zip
dlopen("/lib/python2.5-visor/lib-dynload/zlib.so", 2);
import zlib # dynamically loaded from /lib/python2.5-visor/lib-dynload/zlib.so
# zipimport: zlib available
import posix # builtin
import stat # loaded from Zip /lib/python25-visor.zip/python2.5/stat.py
import posixpath # loaded from Zip /lib/python25-visor.zip/python2.5/posixpath.py
import UserDict # loaded from Zip /lib/python25-visor.zip/python2.5/UserDict.py
import _types # builtin
import types # loaded from Zip /lib/python25-visor.zip/python2.5/types.py
import copy_reg # loaded from Zip /lib/python25-visor.zip/python2.5/copy_reg.py
import os # loaded from Zip /lib/python25-visor.zip/python2.5/os.py
import linecache # loaded from Zip /lib/python25-visor.zip/python2.5/linecache.py
import warnings # loaded from Zip /lib/python25-visor.zip/python2.5/warnings.py
import _codecs # builtin
import codecs # loaded from Zip /lib/python25-visor.zip/python2.5/codecs.py
import encodings.aliases # loaded from Zip /lib/python25-visor.zip/python2.5/encodings/aliases.py
import encodings # loaded from Zip /lib/python25-visor.zip/python2.5/encodings/__init__.py
import encodings.ascii # loaded from Zip /lib/python25-visor.zip/python2.5/encodings/ascii.py
Python 2.5 (r25:51908, Mar  5 2007, 23:18:19)
[GCC 4.1.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/smtplib.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/smtplib.py
import smtplib # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/smtplib.pyc
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/socket.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/socket.py
import socket # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/socket.pyc
dlopen("/lib/python2.5-visor/lib-dynload/_socket.so", 2);
import _socket # dynamically loaded from /lib/python2.5-visor/lib-dynload/_socket.so
dlopen("/lib/python2.5-visor/lib-dynload/_ssl.so", 2);
import _ssl # dynamically loaded from /lib/python2.5-visor/lib-dynload/_ssl.so
import errno # builtin
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/re.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/re.py
import re # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/re.pyc
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/sre_compile.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/sre_compile.py
import sre_compile # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/sre_compile.pyc
import _sre # builtin
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/sre_constants.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/sre_constants.py
import sre_constants # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/sre_constants.pyc
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/sre_parse.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/sre_parse.py
import sre_parse # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/sre_parse.pyc
import email # directory /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/__init__.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/__init__.py
import email # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/__init__.pyc
import email.mime # directory /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/mime
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/mime/__init__.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/mime/__init__.py
import email.mime # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/mime/__init__.pyc
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/base64.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/base64.py
import base64 # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/base64.pyc
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/struct.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/struct.py
import struct # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/struct.pyc
dlopen("/lib/python2.5-visor/lib-dynload/_struct.so", 2);
import _struct # dynamically loaded from /lib/python2.5-visor/lib-dynload/_struct.so
dlopen("/lib/python2.5-visor/lib-dynload/binascii.so", 2);
import binascii # dynamically loaded from /lib/python2.5-visor/lib-dynload/binascii.so
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/hmac.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/hmac.py
import hmac # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/hmac.pyc
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/base64mime.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/base64mime.py
import email.base64mime # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/base64mime.pyc
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/utils.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/utils.py
import email.utils # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/utils.pyc
dlopen("/lib/python2.5-visor/lib-dynload/time.so", 2);
import time # dynamically loaded from /lib/python2.5-visor/lib-dynload/time.so
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/random.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/random.py
import random # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/random.pyc
dlopen("/lib/python2.5-visor/lib-dynload/math.so", 2);
import math # dynamically loaded from /lib/python2.5-visor/lib-dynload/math.so
dlopen("/lib/python2.5-visor/lib-dynload/_random.so", 2);
import _random # dynamically loaded from /lib/python2.5-visor/lib-dynload/_random.so
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/urllib.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/urllib.py
import urllib # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/urllib.pyc
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/string.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/string.py
import string # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/string.pyc
dlopen("/lib/python2.5-visor/lib-dynload/strop.so", 2);
import strop # dynamically loaded from /lib/python2.5-visor/lib-dynload/strop.so
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/urlparse.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/urlparse.py
import urlparse # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/urlparse.pyc
dlopen("/lib/python2.5-visor/lib-dynload/cStringIO.so", 2);
import cStringIO # dynamically loaded from /lib/python2.5-visor/lib-dynload/cStringIO.so
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/_parseaddr.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/_parseaddr.py
import email._parseaddr # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/_parseaddr.pyc
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/quopri.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/quopri.py
import quopri # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/quopri.pyc
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/encoders.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/encoders.py
import email.encoders # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/email/encoders.pyc
# /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/getopt.pyc matches /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/getopt.py
import getopt # precompiled from /vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib/getopt.pyc
Enabling debug messages
Email body:
Hallo dies ist ein Test!

Formated email:
From: +++ZENSIERT+++
To: +++ZENSIERT+++
Subject: Test

Hallo dies ist ein Test!

# clear __builtin__._
# clear sys.path
# clear sys.argv
# clear sys.ps1
# clear sys.ps2
# clear sys.exitfunc
# clear sys.exc_type
# clear sys.exc_value
# clear sys.exc_traceback
# clear sys.last_type
# clear sys.last_value
# clear sys.last_traceback
# clear sys.path_hooks
# clear sys.path_importer_cache
# clear sys.meta_path
# restore sys.stdin
# restore sys.stdout
# restore sys.stderr
# cleanup __main__
# cleanup[1] smtplib
# cleanup[1] zipimport
# cleanup[1] signal
# cleanup[1] quopri
# cleanup[1] cStringIO
# cleanup[1] encodings
# cleanup[1] math
# cleanup[1] _struct
# cleanup[1] errno
# cleanup[1] sre_constants
# cleanup[1] _codecs
# cleanup[1] _types
# cleanup[1] zlib
# cleanup[1] posix
# cleanup[1] encodings.aliases
# cleanup[1] exceptions
# cleanup[1] site
# cleanup[1] strop
# cleanup[1] getopt
# cleanup[1] encodings.ascii
# cleanup[1] urlparse
# cleanup[1] hmac
# cleanup[1] codecs
# cleanup[2] random
# cleanup[2] email.mime
# cleanup[2] struct
# cleanup[2] base64
# cleanup[2] string
# cleanup[2] email.encoders
# cleanup[2] urllib
# cleanup[2] re
# cleanup[2] email
# cleanup[2] UserDict
# cleanup[2] os
# cleanup[2] _sre
# cleanup[2] posixpath
# cleanup[2] _socket
# cleanup[2] binascii
# cleanup[2] email._parseaddr
# cleanup[2] types
# cleanup[2] email.utils
# cleanup[2] socket
# cleanup[2] sre_parse
# cleanup[2] copy_reg
# cleanup[2] sre_compile
# cleanup[2] _random
# cleanup[2] stat
# cleanup[2] _ssl
# cleanup[2] warnings
# cleanup[2] os.path
# cleanup[2] email.base64mime
# cleanup[2] linecache
# cleanup[2] time
# cleanup sys
# cleanup __builtin__
# cleanup ints: 1685 unfreed ints in 28 out of 30 blocks
# cleanup floats: 27 unfreed floats in 1 out of 2 blocks
/vmfs/volumes/4b7fc117-e8af1e80-b14e-000c296cd22b/Lib #

Die Option -v steht für Verbose und man kann schön sehen, wie sich das Script die vorhandenen Libs von dem ESXi holt und die fehlenden Libs eben aus meinem Lib Ordner auf dem VMFS. Die eMail ist übrigens auch angekommen ;D

Ich denke den Rest kann sich jetzt jeder zurechtfummeln und das Backupscript um den Teil erweitern, dass es eben das Backuplog oder sonstige Infos über erfolgreichen oder fehlgeschlagenen Backup sendet.

Wichtig ist, zu bedenken, dass man das sendmail.py Script in dem Lib Ordner ausführen muss, da der Ordner dem ESXi so ja nicht bekannt ist. Wer das machen möchte, kann in der /lib/python2.5-visor/site.py einen zusätzlichen Eintrag ala

sys.path.append('/vmfs/volumes/datastore1/Lib/')

setzen, wobei ich nicht garantieren kann, dass der Rest noch rund läuft. Zudem ist dieser Eintrag nicht persistent, sprich nach einem Reboot wieder verschwunden.

Wie bei allen Sachen hier sollte wohl jedem klar sein, dass ich nicht für eventuelle Ausfälle oder ähnlichem hafte. Alles was ihr an eurem System ändert oder verfriemelt liegt in eurer eigenen Verantwortung!

Bookmark and Share

Ähnliche Verfriemelungen:

Kommentare

Es gibt 11 Kommentare für diese Verfriemelung.

  1. kero on Februar 23, 2010 5:41 pm

    Erst Skripte schreiben und dann keine Verantwortung uebernehmen wollen. Morgen mach ich alle KVMs und XENs platt und setze nur noch das seltsame ESX Gedoehns und dein Skript ein, sollte ich auch nur eine 1 Byte verlieren schicke ich sofort eine Rechnung an Dich.

  2. Bjoern on Februar 23, 2010 6:04 pm

    Pff mach doch was du willst… Wie ich schon sagte, keine Verantwortung :p

  3. Tom on März 15, 2010 4:58 pm

    Hi Bjoern,

    ich habe mich heute mal an das Mailscript gesetzt, hier mal kurz die Schritte die ich getan habe …

    1. Script heruntergeladen und den Lib Ordner auf ein Datastore gepackt
    2. Dein Mailscript kopiert und in das File “python” gespeichert und in Lib abgelegt
    3. Aufruf des Scriptes aus dem Lib Ordner heraus mit meinen Parametern für Mailserver, Absender und Adressat und dem Testfile (bla.txt)

    Ich bekomme dann aber den Fehler: -ash: cannot open a: no such file

    Du schreibst ja selbst, dass das sendmail.py Script im Lib Ordner ausgeführt werden soll, da der ESXi den Ordner selbst nicht kennt. Was mich aber irritiert ist, dass kein sendmail.py Script in dem Lib Ordner drin ist. Welches meinst du denn?

    Ich hab´s auch schon mit dem Entrag “sys.path.append(‘/vmfs/volumes/datastore1/Lib/’)” in der /lib/python2.5-visor/site.py probiert aber leider ohne Erfolg.

    Wo mache ich denn hier den entscheidenden Fehler?

  4. Bjoern on März 15, 2010 5:06 pm

    Hi Tom,

    das oben gepostete Script heist bei mir sendmail.py… Also wenn du den oben geposteten Code bei dir in das File python kopiert hast, lautet der Aufruf: python python -mmailserver.acme.com -rrecipient@acme.com -sTest -ffrom@acme.com -d < /vmfs/volumes/datastore1/bla.txt

    Python ist ja der Interpreter, nicht das Script selber… Also am besten das Mailscript in einen sinnvollen Namen umbenennen.

    Gruß

    Björn

  5. Tom on März 15, 2010 5:50 pm

    Hey Björn,

    da war ich wohl etwas schwer von Begriff. Hab´s korrigiert aber ich habe immernoch den gleichen Fehler :(

    Der Pfad zur bla.txt kann es nicht sein, denn ich kann sie mir mit einem cat und dem entsprechenden Pfad wiedergeben lassen.

  6. Tom on März 19, 2010 8:52 am

    Hi Bjoern,

    hast du noch eine Idee zu dem Problem?

  7. Bjoern on März 19, 2010 11:12 am

    Hmm… Habe es eben nochmal auf nem anderen Host ausgetestet und hat auf anhieb geklappt. Du hast aber schon oben das Python Script ohne die Zeilenangaben kopiert? Sprich auf “View Source” geklickt? Alternativ hier nochmal ein Download Link zum Mailscript: http://blog.verfriemelt.com/downloads/esxi_py_sendmail.py

  8. Tom on März 19, 2010 12:22 pm

    Ich glaube ich habe meinen Fehler gefunden, ich habe es immer direkt aus dem Lib-Verzeichnis aufgerufen … das sollte ich nicht machen.

    Ich bekomme aber noch einen Permission denied Fehler. Die sendmail.py hat 755. Wer ist noch der mögliche Schuldige?

  9. Matze on April 23, 2010 2:29 pm

    Hi

    ich bin am verzweifeln, die Sache mit dem Mailing ist ansich eine gute Sache. Ich bekomme es aber nicht zu laufen.
    Die Fehlermeldung ist:

    File “/vmfs/volumes/4ae0b8d4-74b64288-137e-001cc0f2d1dd/src/lib/sendemail”, line 12
    print msg

    Ich denke es ist nur ein ganz doofer Fehler aber ich komme nicht drauf.

    Vielleicht könnt ihr mir weiterhelfen?!

    Würde mich freuen

    Viele Grüße

  10. Matze on April 23, 2010 2:30 pm

    File “/vmfs/volumes/4ae0b8d4-74b64288-137e-001cc0f2d1dd/src/lib/sendemail”, line 12
    print msg
    ^
    IndentationError: expected an indented block

  11. Laster on Juli 26, 2010 3:44 pm

    Hi Björn,

    tolle Sache, nur bei dem Python-Script muss man auf’s Einrücken genau achten, aber das ist bei Python halt so. Ansonsten läuft es super !
    LS

Senf dazugeben