Seite 1 von 1

Python, des Admins Freund

Verfasst: Dienstag 14. August 2007, 15:06
von mkesper
Stell Dir vor, es gibt eine bestimmte Software, die an ca. 130 Standorten eingesetzt wird und in die Dateien eingespielt werden.
Stell Dir weiterhin vor, es seien Dateien verteilt worden, die ein Starten der Software durch Anwender verhindern.
Stell Dir vor, dies läge an dem Server, mit dem die Dateien verteilt werden und keiner kann Dir sagen, welche Standorte betroffen sind.
Manuelles Durchprobieren aller Standorte würde zu lange dauern, das liegt auf der Hand.
Wenn alle sich telefonisch bei Dir melden und du die Anrufe bearbeiten mußt, dauert es ebenfalls zu lange.
Ein Skript muß her!
Aber, o weia, es handelt sich um Windows und UNC-Pfade lassen sich nicht mit Batch-Dateien bearbeiten. Also:
Python ist gefragt:

Code: Alles auswählen

import os

infile = open('servers.txt', 'r')
outfile = open('status.txt', 'w')
for server in infile:
    server = server.strip()
    try:
        if server[-3] == '-':
            # Dateien liegen auf Fileserver
            path = r'\\%s\WORK\Allgemein\Prestige\Import' % server
        else:
            # Dateien liegen direkt auf dem Terminal-Server
            path = r'\\%s\ProgramFiles$\Prestige\Import' % server
        imports = os.listdir(path)
        if len(imports) == 1:
            # Nur return.log
            status = 'clean'
        else:
            status = 'Importe liegen vor.'
        outfile.write('%s;%s\n' % (server, status))
        print ('%s;%s\n' % (server, status))
    except WindowsError:
        print 'Pfad existiert nicht: %s' % path
outfile.close()
infile.close()
print "Alles durchgelaufen"
Die servers.txt wurde natürlich vorher ebenfalls durch ein kleines Skript erzeugt, da ich keine brauchbare Liste hatte,
sondern nur ein Verzeichnis mit ICA-Dateien, die die Namen der Standorte beinhalten:

Code: Alles auswählen

import os

dir = os.listdir(r"W:\Work\Speicherort\")
outfile = open(r"C:\tmp\servers.txt", 'w')
for i in dir:
    outfile.write('%s\n' % i[:15])
Innerhalb weniger als einer Stunde ist also ein brauchbares Ergebnis da.
Und es stellt sich kurze Zeit später heraus, daß die Dateien dann auch gelöscht werden sollen. Einige Tests später:

Code: Alles auswählen

import os

infile = open('servers.txt', 'r')
outfile = open('status.txt', 'w', 0)

for server in infile:
    server = server.strip()
    try:
        if server[-3] == '-':
            path = r'\\%s\WORK\Allgemein\Prestige\Import' % server
        else:
            path = r'\\%s\ProgramFiles$\Prestige\Import' % server
        imports = os.listdir(path)
        if len(imports) <= 1:
            # Nur return.log
            status = 'clean'
        else:
            for filename in imports:
                if filename.lower()[-3] == 'p':
                    # Passt auf *.p??
                    print "Removing %s" % os.path.join(path, filename)
                    os.remove(os.path.join(path, filename))
            status = 'cleaned'
        outfile.write('%s;%s\n' % (server, status))
        print ('%s;%s\n' % (server, status))
    except WindowsError:
        print 'Pfad existiert nicht: %s' % path
outfile.close()
infile.close()
print "Alles durchgelaufen"
Der Code könnte zwar schöner sein und das Löschen sollte parallelisiert ablaufen,
aber das hätte bestimmt noch eine halbe Stunde länger gedauert; in dieser Zeit war mein Skript schon längst durchgelaufen (ich hatte vorher ja nur 37 Treffer ermittelt, nicht 130).
Danke Python! :)

Verfasst: Dienstag 14. August 2007, 15:28
von veers
Und ich dachte immer admins mögen bloss Perl ;)