Skip to content

Instantly share code, notes, and snippets.

Created July 9, 2012 17:40
Show Gist options
  • Save anonymous/3077815 to your computer and use it in GitHub Desktop.
Save anonymous/3077815 to your computer and use it in GitHub Desktop.
Überprüfung von Modulen in einem Ordner, auf fehlende Pakete mit der Option diese zu installieren und Ausgabe weiterer Fehlermeldungen.
#!/usr/bin/python
# -*- coding: utf-8 -*-
try:
import sys, os, time, shlex, subprocess, imp, pip
from subprocess import PIPE
check = True
except ImportError:
import sys, os, time, shlex, subprocess, imp
from subprocess import PIPE
check = False
PROG = 'modul_control.py'
# Programm
def info():
'''
Dieses Modul ist für Linux konzipiert und auf DEBIAN / UBUNTU getestet.
Es überprüft die Lauffähigkeit der Module mit der Endung py.
Fehlermeldungen werden in folgender Reihenfolge ausgewertet:
ImportError, NameErrror und BaseException.
Fehlende Pakete für die Funktionsfähigkeit der Module, werden zur
Installation angeboten. Für Fehler, die nicht behoben werden können,
erfolgt eine Fehlerausgabe am Ende.
Die Anwendung von modul_control.py ist recht einfach, in dem Sie es
in den Ordner der zu überprüfenden Module stellen und die
Überprüfung starten. Sie haben auch die Möglichkeit, manuell Ihre
zu überprüfende Datei bzw. Ordner einzugeben und überprüfen zu lassen.
modul_control.py können Sie aus der Konsole heraus starten.
'''
# Einstiegsfunktion mit Überprüfung des Betriebssystems
# und Auswahl für Programmstart / Abbruch
def start():
# Überprüfung des Betriebssystem.
# Bei Windows erfolgt Abbruch!
if os.name != 'posix':
print ('Sorry, Sie haben kein Linux! \nOb mudul_control auch auf Windows-Systemen läuft, \nwurde nicht getestet!')
sys.exit(0)
# Kurzes Programminfo
print (info.__doc__)
# Programmstart / Abbruch
counter = 0
keyboardinput = False
while keyboardinput != True:
print ('\nWählen Sie die Nummer \n1: Programmstart \n2: Abbruch: ')
decision = raw_input('Nummer: ')
if decision == '1':
print ('\n%s wird gestartet!\n' % PROG)
keyboardinput = True
elif decision == '2':
print ('\n%s, Abbruch!' % PROG)
keyboardinput = True
sys.exit(0)
elif counter == 3:
print ('\nEingabefehler, %s wird beendet!' % PROG)
keyboardinput = True
sys.exit(0)
elif counter < 3:
print ('\nEingabefehler, bitte wählen Sie Ihre Option!')
counter += 1
# Funktion zur Auflistung
# aller Dateien des aktuellen Ordners
# oder manuelle Auswahl
file_list = set()
def filelist():
print ('\nWas soll überprüft werden? \n1: Aktueller Ordner \n2: Manuelle Datei- und Ordnerwahl: ')
review = raw_input('Nummer: ')
if review == '1':
PATH = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0])))
LIST = os.listdir(PATH)
for files in LIST:
if os.path.isfile(files):
file_list.add(files)
elif review == '2':
text = ('\nGeben Sie die Datei inklusive Pfad ein: ')
definition = raw_input(text)
if definition.endswith('.py'):
file_list.add(definition)
elif not '.' in definition:
LIST = os.listdir(definition)
for files in LIST:
if os.path.isfile(files):
file_list.add(files)
print ('\n')
# Funktion zur Überprüfung
# ob Name von e_name in Paketliste enthalten ist.
paketline = set()
def name_check(e_name):
if not 'python' in e_name:
modul = 'python-%s' % e_name
command_line = 'apt-cache search %s' % (modul.lstrip('-'))
args = shlex.split(command_line)
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)
process.wait()
for line in process.stdout.readlines():
if line:
paketline.add(line)
# Funktion zur Überprüfung
# ob ausgewähltes Paket schon installiert ist.
installinfo = set()
def install_check(paket):
# Überprüfe ob Paket nicht installiert ist.
install_test = 'apt-cache policy %s' % paket
args = shlex.split(install_test)
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)
process.wait()
for line in process.stdout.readlines():
if 'Installiert:' in line and not 'Installiert: (keine)' in line:
print ('\nPaket %s ist installiert!\nÜberprüfen Sie bitte Ihr Modul auf Fehler!\n' % (paket, paket))
else:
installinfo.add(line)
print ('\nPaket %s ist nicht installiert!\nSie können %s jetzt installieren!\n' % (paket, paket))
break
# Funktion zur Auswahl des Installation-Befehl
# PIP ist momentan noch nicht einsetzbar und
# muß dafür noch erweitert werden!
APT_GET = 'sudo apt-get install -y'
APTITUDE = 'sudo aptitude install -y'
PIP = 'pip install'
install_command = set()
def command(e_name):
counter = 0
yes = False
while yes != True:
print ('\nWelchen Befehl möchten Sie für die\nInstallation von Paketen verwenden?:\n1: {}\n2: {}\n3: {}'.format(APT_GET.split(None, 2)[1], APTITUDE.split(None, 2)[1], PIP.split(None, 2)[0]))
number = raw_input('Nummer: ')
counter += 1
if number == '1':
install_command.add(APT_GET)
print ('\nSie haben %s gewählt!\n' % APT_GET.split(None, 2)[1])
print ('Geben Sie Ihr Passwort ein!')
yes = True
elif number == '2':
install_command.add(APTITUDE)
print ('\nSie haben %s gewählt!\n' % APTITUDE.split(None, 2)[1])
print ('Geben Sie Ihr Passwort ein!')
yes = True
elif number == '3':
if e_name == 'pip' and check != False:
no_name(e_name)
install_command.add(PIP)
elif e_name == 'pip' and check != True:
print ('\nSie haben %s gewählt!\n' % PIP.split(None, 2)[0])
yes = True
elif e_name != 'pip' and check != False:
print ('\nNummer %s ist nicht installiert, \nbitte wählen Sie eine andere Option!\n' % number)
else:
if counter == 4:
print ('Eingabefehler, Abbruch!')
yes = True
sys.exit()
else:
print ('\nEingabefehler, es gibt keine Nummer %s, \nbitte wählen Sie erneut eine Option!\n' % number)
# Funktion zur Ausführung der Installation von Paketen.
def installation(paket):
for output in install_command:
command_install = output
command_line = '%s %s' % (command_install, paket.lstrip('-'))
args = shlex.split(command_line)
installation = False
counter = 0
while not installation:
counter += 1
try:
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)
for line in process.communicate():
print (line)
installation = True
except BaseException, e:
print ('Installationsfehler: %s' %e)
installation = False
if installation == False and counter < 3:
print ('\nEs gab einen Fehler, die Installation wird wiederholt!')
elif installation == False and counter == 3:
print ('\nDie Installation ist fehlerhaft und wird daher beendet!')
if not installation:
print ('\nEs ist ein Fehler bei der Installation von %s aufgetreten, \nbitte starten Sie das Programm jetzt erneut!' % paket)
sys.exit(1)
# Funktion zu ImportError für,
# Module die kein Paket für die Installation angeboten bekommen,
# sondern nur den Namen des Moduls.
# Hier werden Pakete aus der apt-Paketliste angeboten.
# Die Auswahl des zu installierenden Paketes,
# muß manuell vorgenommen werden.
error_print = set()
def no_name(e_name):
if not 'python' in e_name:
modul = 'python-%s' % e_name
question = ('Möchten Sie das Paket %s \naus der Paketliste aussuchen und installieren?\n< ja / nein >: ' % e_name)
answer = raw_input(question)
if answer == 'ja':
name_check(e_name)
if paketline:
print ('\nFolgende Pakete wurden gefunden:\n')
for line in paketline:
print line
if answer == 'ja':
text = ('\nGeben Sie das zu installierende Paket für %s ein!: ' % e_name)
paket = raw_input(text)
install_check(paket)
if installinfo:
if modul == 'pip':
install_command.remove
if install_command:
installation(paket)
print ('')
else:
command(modul)
print ('')
installation(paket)
print ('')
paketline.remove
installinfo.remove
elif answer == 'nein':
if check != False:
print ('\nInstallation von %s wurde abgebrochen!\n' % e_name)
error_print.add('y')
paketline.remove
else:
print ('\nInstallation von %s wurde abgebrochen!' % e_name)
sys.exit(1)
else:
print ('\nFehlerhafte Eingabe, Installation von %s wurde abgebrochen!' % e_name)
sys.exit(1)
else:
print ('\nEs existieren keine Pakete für %s in der Paketliste! \nVielleicht ist der Namen des Moduls falsch geschrieben \noder es handelt sich um ein Fremdpaket, das Sie manuell \ninstallieren müssen! \nEine Installation ist daher nicht möglich!\n' % e_name)
error_print.add('y')
time.sleep(3)
paketline.remove
# Funktion zur Überprüfung von Fehlermeldungen.
# Die Reihenfolge ist:
# ImportError und NameError
# BaseException gibt alle restlichen Fehlermeldungen aus.
BaseExceptionInfo = set()
NameErrorInfo = set()
ImportErrorInfo = set()
def modul_check():
for prog in file_list:
if prog.endswith('.py') and prog != PROG:
datei = prog
modul = prog[:(len(prog) - 3)]
try:
imp.load_source(modul, datei)
print ('Modul %s ist ok!' % datei)
except ImportError, e:
if not 'please install the' in str(e):
e_name = e.message.rsplit(None, 2)[-1]
name_check(e_name)
if paketline:
no_name(e_name)
print ('\nFehler in Datei %s mit Modul %s\n' % (datei, e_name))
else:
ImportErrorInfo.add(e)
else:
e_name = e.message.rsplit(None, 2)[-2]
print ('\nFehler in Datei %s mit Modul %s\n' % (datei, e_name))
if 'please install the' in str(e):
paket = e.message.rsplit(None, 2)[1]
install_check(paket)
if installinfo:
print ('Das Paket {} wird für das Starten\ndes Python-Modul {} benötigt.\nDas Paket {} ist nicht installiert!\n\nSoll das Paket {} jetzt installiert werden?'.format(paket, datei, paket, paket))
text = '< ja / nein >: \n'
answer = raw_input(text)
if answer == 'ja':
if not install_command:
command(e_name)
installation(paket)
elif answer == 'nein':
print ('\nInstallation von %s wurde abgebrochen!' % paket)
else:
print ('\nFehlerhafte Eingabe, Installation von %s wurde abgebrochen!' % paket)
sys.exit(1)
except NameError, e:
e_name = e.message.split('\'')[1]
name_check(e_name)
if paketline:
print ('\nFehler in Datei %s mit Modul %s\n' % (datei, e_name))
no_name(e_name)
else:
error_print.add('y')
for line in error_print:
if line == 'y':
with open(datei, 'r') as infile:
for find in infile:
if modul in find:
result = (datei, e)
NameErrorInfo.add(result)
break
error_print.remove
installinfo.remove
except BaseException, e:
result = (datei, e)
BaseExceptionInfo.add(result)
# Funktion zur Auswertung von Fehlermeldungen,
# die nicht ImportError entsprechen.
def error_info():
if ImportErrorInfo or NameErrorInfo or BaseExceptionInfo:
print ('\n\nÜberprüfung ist beendet, \nfolgende Fehler müssen manuell von Ihnen behoben werden!\n')
for info in ImportErrorInfo:
if info:
print ('ImportError:')
print ('{}\n'.format(info))
for info in NameErrorInfo:
if info:
print ('NameError:')
print ('{}\n'.format(info))
for info in BaseExceptionInfo:
if info:
print ('BaseException:')
print ('{}\n'.format(info))
sys.exit()
else:
print ('\nÜberprüfung ist beendet, \nes wurden keine Fehler festgestellt!')
sys.exit()
def expiration():
start()
filelist()
modul_check()
error_info()
if __name__ == "__main__":
expiration()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment