python anfänger - logfile auswerten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Hier ist nun mein ganzes Skriptchen ...
Funktioniert tadelos. Leider etwas langsam.
Hat jemand mal einen Tip, wie man das in der Auswertung optimieren kann?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-



	# FUNKTIONSDEFINITIONEN
	
import sys, string
import subprocess
from subprocess import PIPE, Popen
import os 


def logfile_oeffnen_und_auswerten():
    import string
    # FILE oeffen und in eine SEQUENZ / ARRAY schreiben
    logfile = file("/var/log/auswertung/logfile.txt", "r")			
    logfileinhalt = [line.rstrip('\n') for line in logfile.readlines()]	# einlesen des Fileinhaltes
    inhalt_logfile = []							# Leere Sequenz / Array erstellen um dann das LOG-File hierrein zu speichern
    for zeile in logfileinhalt:
       inhalt_logfile.append(zeile)
    logfile.close()							# Datei schliessen
    # Testen ob STRING Buchstaben oder Zahlen enthält
    i=0
    getestetes_inhalt_logfile = []
    for i in inhalt_logfile:
	ergebnis=i.isdigit()	
	if ergebnis == True:
		ergebnis = yppasswdauswertung(i,"uid_username")
		getestetes_inhalt_logfile.append(ergebnis)
	else:
		ergebnis = i
		getestetes_inhalt_logfile.append(ergebnis)
    inhalt_logfile = getestetes_inhalt_logfile
    # Doppelte Eintraege loeschen 
    userID = list(set(inhalt_logfile))					# Neue Sequenz/Array mit allen Eintraegen aus der originalen Sequenz
    # Ausgabe der UserID/Username und der Stundenanzahl			# ABER ohne doppelte Eintraege
    ausgewertetes_logfile_array = []
    #    for checkuserID in userID:
    for checkuserID in userID:
     ausgewertetes_logfile_array.append(checkuserID)
     ausgewertetes_logfile_array.append(inhalt_logfile.count(checkuserID))
    return ausgewertetes_logfile_array

def suche_option_auswahl():
 	option_suche = raw_input ("WAS soll gesucht werden? \n \n"
				  "  userid.........................................................uid\n"
				  "  username.......................................................username\n"
		 		  "  groupid........................................................gid\n" 
				  "  username wird eingegeben und die UID wird ausgegeben...........username_uid\n" 
				  "  uid wird eingegeben und der username wird ausgegeben...........uid_username\n\n"
				  "  Eingabe:")
 	return option_suche

def suchauswahl():
	suchwert = raw_input ("Welcher STRING soll gesucht werden? ")	 
	return suchwert

def yppasswdauswertung(suchwert, option_suche):					# suchwert=STRING; option_suche=uid,username,etc.
	 # userID einem Benutzernamen zuordnen					# Benoetigte IMPORTS sind:
	 #									# "import subprocess"
	 #									# "from subprocess import PIPE, Popen"
	ypcatpasswdarray=[]							# leeres Array erstellen
	ypcatpasswdshell = Popen(["ypcat", "passwd"], stdout=PIPE)		# Ausgabe von "ypcat passwd" wird gepiped 
	output = ypcatpasswdshell.communicate()[0]				# Die "0" gibt stdout zurück (holt sich die Ausgabe der PIPE) 
										# Die "1" gibt stderr zurück
	 # print output
	 # Ausgabe von ypcat passwd wird in das Array geleitet
	for line in output:							# Nimmt den STRING "output" und leitet alles in das Array 
		a = line
		ypcatpasswdarray.append(a)
	
	 # Aus dem Array ypcatpasswdarray wird tmparray 			# Aus einzelnen Buchstaben wird ein Datensatz
	 # print tmparray[0] gibt einen einzelnen Datensatz aus			# Hier den ersten
	tmpstring=[]
	passwdzeile=''								#ein leerer string
	for einzelnerbuchstabe in ypcatpasswdarray:
	    if einzelnerbuchstabe == '\n':
	       passwdzeile=passwdzeile+einzelnerbuchstabe 			#zeilenstring zusammensetzen
	       tmpstring.append(passwdzeile)
	       passwdzeile='' 							#zeileninhalte  loeschen
	    else:
	       passwdzeile+=(einzelnerbuchstabe)
	
	 # Ausgabe eines einzelnen Wertes aus einem Datensatz
	username_maschinenname=[]
	userID_maschinenID=[]
	gruppenID=[]
	for line in tmpstring:
		words = line.split(':') 
		username_maschinenname.append(words[0])
	        userID_maschinenID.append(words[2])
		gruppenID.append(words[3])
	try:
	 if option_suche == "uid_username":
	  such_index = userID_maschinenID.index(suchwert)
	  return username_maschinenname[such_index]
	 if option_suche == "username_uid":
	  such_index = username_maschinenname.index(suchwert)
	  return userID_maschinenID[such_index]
	 if option_suche == "username":
	  such_index = username_maschinenname.index(suchwert)
	  return  username_maschinenname[such_index]
	 elif option_suche == "gid":
	  such_index = gruppenID.index(suchwert)
	  return gruppenID[such_index]
	 elif option_suche == "uid":
	  such_index =  userID_maschinenID.index(suchwert)
	  return userID_maschinenID[such_index]
	 else: 
	  print "OPTION_SUCHE war: ", option_suche
	  return "OPTION_SUCHE war nicht username, gid oder uid"
	except:
	 #print "Try User nicht vorhanden"
	 return "Abfrage nicht erfolgreich"

def logfile_auswerten():
	ergebnis = logfile_oeffnen_und_auswerten()
	for i, v in enumerate (ergebnis):
		print i, v
	return ergebnis


# HAUPTPROGRAMM
	# Benutzersuche 
print " "
print " "
print " "
print " "
#		Abfrage ueber ein Menue - zum testen der Funktion !!
#		 ergebnis_suche_option_auswahl = suche_option_auswahl()					# Was soll gesucht werden? (GID, UID, UserName)
#		 ergebnis_suchauswahl = suchauswahl()							# Welcher STRING aus GID, UID oder UserName soll gesucht werden?
#		 print yppasswdauswertung(ergebnis_suchauswahl, ergebnis_suche_option_auswahl)		# Aufruf der Funktion usersuche()
print logfile_oeffnen_und_auswerten()
#
#		 Beispiele fuer den Aufruf der Funktion yppasswdauswertung
#		     print yppasswdauswertung("1121","uid_username") ----> AUSGABE ist: heinz
#		     print yppasswdauswertung("frank","username_uid") ----> AUSGABE ist: 1011
# print logfile_auswerten()
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Problem erkannt, wird gleich gebannt.
folgender Aufruf wird für jeden Vergleich eines Strings aus der Sequenz aufgerufen. Das Problem ist wahrscheinlich der Aufruf des Popen ....
Muß ich einmal machen und dann immer wieder aufrufen ....

Code: Alles auswählen

def yppasswdauswertung(suchwert, option_suche):					# suchwert=STRING; option_suche=uid,username,etc.
	 # userID einem Benutzernamen zuordnen					# Benoetigte IMPORTS sind:
	 #									# "import subprocess"
	 #									# "from subprocess import PIPE, Popen"
	ypcatpasswdarray=[]							# leeres Array erstellen
	ypcatpasswdshell = Popen(["ypcat", "passwd"], stdout=PIPE)		# Ausgabe von "ypcat passwd" wird gepiped 
	output = ypcatpasswdshell.communicate()[0]			
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das was du da Array nennst ist übrigens eine Liste.
Antworten