Da ich mich neu angemeldet habe, erst einmal kurz zu mir. Ich bin Netzwerktechniker, daher ist für mich das Programmieren bzw. das Scripten nur ein sehr kleiner Teil meines Jobs. Meist löse ich die Dinge auch in C, Perl oder Bash-Scripts, möchte mich jetzt aber einmal in Python einarbeiten. Habe hier auch schon einige Informationen gefunden und bedanke mich erstmal dafür...
Zum aktuellen Problem bzw. Projekt. Ich schreibe ein Plugin für Icinga2, das verschiedene Informationen von Cisco-Switchen ausliest. Ich schreibe dies selbst, da ich gerne alles in einem Script und möglichst wenig SNMP abfragen erledigen möchte. Ich benutze dazu pysnmp.
Es geht um das schreiben, verändern oder erstellen einer Temp-Datei, hier meine bisherige Lösung.
Code: Alles auswählen
import fileinput
def WriteTemp(Host, Data, Typ, TempDir, Interface):
LineFound=0
"""
Testen ob der Ordner existiert, falls nicht erstellen
""""
if not os.path.exists(TempDir):
try:
os.makedirs(TempDir)
except (IOError, OSError):
print('%s, %s', IOError, OSError)
exit(1)
"""
Testen ob die TempDatei existiert, falls nicht erstellen, Daten schreiben und zurück.
"""
if not os.path.isfile(TempDir+"/" + Host + "_" + Typ +".tmp"):
f= open(TempDir+"/" + Host + "_" + Typ +".tmp", 'w')
f.write(Data)
f.close()
return(0)
"""
Falls die Datei existiert, Linie suchen und ersetzen.
"""
f=fileinput.FileInput(TempDir+"/" + Host + "_" + Typ +".tmp", inplace =1)
for line in f:
line = line.strip()
if not line.startswith("'"+Interface+"'"):
print(line)
else:
line=line.replace(line, Data)
print(line)
#Wenn Linie gefunden, LineFound auf 1
LineFound=1
"""
Wenn der Datensatz in der Datei nicht existiert, am Dateiende anhängen.
"""
if LineFound !=1:
f= open(TempDir+"/" + Host + "_" + Typ +".tmp", 'a')
f.write(Data)
f.close()
return(0)
Code: Alles auswählen
WriteTemp(Host, Data, Typ, TempDir, Interface)
- Data ist eine Liste die in die Tempdatei geschrieben wird, z.B. 'TenGigabitEthernet1/3/2' '1434275311.283667' '1' '1' '328' '10000' '30534717624306' '10833163670508' '9666' '0' '0' '0'
- Typ ist entweder Int für Interface, Net für Netzwerk oder Sys für System
- TempDir ist das Verzeichnis
- Interface der Interfacename z.B. TenGigabitEthernet1/3/2
Diese Lösung funktioniert, jedoch stört mich das doppelte öffnen der Datei wenn die Linie nicht existiert. Ausserdem muss ich mit dieser Lösung jede Linie der Datei bis zum Schluss durchgehen, auch wenn der Datensatz auf der zweiten Linie gefunden wurde. Diese beiden Punkte würde ich gerne ändern, bzw. verbessern und wäre für jeden Tip dankbar.
Hoffe ich habe alle Infos geliefert und mich einigermassen klar ausgedrückt.
Grüsse
Kurt
