1
0
mirror of https://github.com/naruxde/revpipycontrol.git synced 2025-12-29 03:08:04 +01:00

Dateien werden einzeln hochgeladen

This commit is contained in:
2017-03-13 15:02:36 +01:00

View File

@@ -5,13 +5,15 @@
# (c) Sven Sager, License: LGPLv3 # (c) Sven Sager, License: LGPLv3
# #
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import gzip
import os import os
import tarfile import tarfile
import tkinter import tkinter
import tkinter.filedialog as tkfd import tkinter.filedialog as tkfd
import tkinter.messagebox as tkmsg import tkinter.messagebox as tkmsg
import zipfile import zipfile
from tempfile import mktemp from shutil import rmtree
from tempfile import mktemp, mkdtemp
from xmlrpc.client import Binary from xmlrpc.client import Binary
@@ -177,6 +179,42 @@ class RevPiProgram(tkinter.Frame):
# TODO: Einstellungen sichern # TODO: Einstellungen sichern
pass pass
def create_filelist(self, rootdir):
"""Erstellt eine Dateiliste von einem Verzeichnis.
@param rootdir: Verzeichnis fuer das eine Liste erstellt werden soll
@returns: Dateiliste"""
filelist = []
print(rootdir)
for tup_dir in os.walk(rootdir):
for fname in tup_dir[2]:
filelist.append(os.path.join(tup_dir[0], fname))
return filelist
def check_replacedir(self, rootdir):
"""Gibt das rootdir von einem entpackten Verzeichnis zurueck.
Dabei wird geprueft, ob es sich um einen einzelnen Ordner handelt
und ob es eine piCtory Konfiguraiton im rootdir gibt.
@param rootdir: Verzeichnis fuer Pruefung
@returns: Abgeaendertes rootdir
"""
lst_dir = os.listdir(rootdir)
print(rootdir)
if len(lst_dir) == 1 and \
os.path.isdir(os.path.join(rootdir, lst_dir[0])):
return (os.path.join(rootdir, lst_dir[0]), None)
if len(lst_dir) == 2:
rscfile = None
for fname in lst_dir:
if fname.find(".rsc"):
rscfile = os.path.join(rootdir, fname)
return (os.path.join(rootdir, lst_dir[0]), rscfile)
else:
return (rootdir, None)
def getpictoryrsc(self): def getpictoryrsc(self):
fh = tkfd.asksaveasfile( fh = tkfd.asksaveasfile(
mode="wb", parent=self.master, mode="wb", parent=self.master,
@@ -229,14 +267,16 @@ class RevPiProgram(tkinter.Frame):
finally: finally:
fh.close() fh.close()
def setpictoryrsc(self, fh=None): def setpictoryrsc(self, filename=None):
if fh is None: if filename is None:
fh = tkfd.askopenfile( fh = tkfd.askopenfile(
mode="rb", parent=self.master, mode="rb", parent=self.master,
title="piCtory Datei öffnen...", title="piCtory Datei öffnen...",
initialfile=self.revpi + ".rsc", initialfile=self.revpi + ".rsc",
filetypes=(("piCtory Config", "*.rsc"), ("All Files", "*.*")) filetypes=(("piCtory Config", "*.rsc"), ("All Files", "*.*"))
) )
else:
fh = open(filename, "rb")
if fh is not None: if fh is not None:
ask = tkmsg.askyesno( ask = tkmsg.askyesno(
@@ -327,7 +367,8 @@ class RevPiProgram(tkinter.Frame):
for taritem in fh_pack.getmembers(): for taritem in fh_pack.getmembers():
print(rootname) print(rootname)
if not taritem.name == "revpipyload": if not taritem.name == "revpipyload":
taritem.name = taritem.name.replace("revpipyload/", "") taritem.name = \
taritem.name.replace("revpipyload/", "")
fh_pack.extract(taritem, dirselect) fh_pack.extract(taritem, dirselect)
fh_pack.close() fh_pack.close()
@@ -350,8 +391,10 @@ class RevPiProgram(tkinter.Frame):
def plcupload(self): def plcupload(self):
tup = self.lst_typeup.index(self.var_typeup.get()) tup = self.lst_typeup.index(self.var_typeup.get())
fh = None
dirselect = "" dirselect = ""
dirtmp = None
filelist = []
rscfile = None
if tup == 0: if tup == 0:
# Datei # Datei
@@ -360,28 +403,8 @@ class RevPiProgram(tkinter.Frame):
filetypes=(("Python", "*.py"), ("All Files", "*.*")) filetypes=(("Python", "*.py"), ("All Files", "*.*"))
) )
if type(fileselect) == tuple and len(fileselect) > 0: if type(fileselect) == tuple and len(fileselect) > 0:
# Datei als TAR packen
tmpfile = mktemp()
noerr = True
try:
fh_pack = tarfile.open(
name=tmpfile, mode="w:gz", dereference=True)
for file in fileselect: for file in fileselect:
fh_pack.add( filelist.append(file)
file, arcname=os.path.basename(file))
except:
noerr = False
tkmsg.showerror(
parent=self.master, title="Fehler",
message="Die Datei konnte für die Übertragung nicht "
"gepackt werden")
finally:
fh_pack.close()
if noerr:
# fh für Versand öffnen
fh = open(tmpfile, "rb")
elif tup == 1: elif tup == 1:
# Ordner # Ordner
@@ -390,65 +413,61 @@ class RevPiProgram(tkinter.Frame):
mustexist=True, initialdir=self.revpi) mustexist=True, initialdir=self.revpi)
if type(dirselect) == str and dirselect != "": if type(dirselect) == str and dirselect != "":
# Ordner als TAR packen filelist = self.create_filelist(dirselect)
tmpfile = mktemp()
noerr = True
try:
fh_pack = tarfile.open(
name=tmpfile, mode="w:gz", dereference=True)
fh_pack.add(
#dirselect, arcname=os.path.basename(dirselect))
dirselect, arcname="")
except:
noerr = False
tkmsg.showerror(
parent=self.master, title="Fehler",
message="Der Ordner konnte für die Übertragung nicht "
"gepackt werden")
finally:
fh_pack.close()
if noerr:
# fh für Versand öffnen
fh = open(tmpfile, "rb")
elif tup == 2: elif tup == 2:
# Zip # Zip
fh = tkfd.askopenfile( fileselect = tkfd.askopenfilename(
mode="rb", parent=self.master, parent=self.master, title="Zip-Archive übertragen...",
title="Zip-Archive übertragen...",
initialfile=self.revpi + ".zip", initialfile=self.revpi + ".zip",
filetypes=(("Zip Archiv", "*.zip"), ("All Files", "*.*")) filetypes=(("Zip Archiv", "*.zip"), ("All Files", "*.*"))
) )
if not zipfile.is_zipfile(fh.name): if type(fileselect) == str and fileselect != "":
# Zipdatei prüfen # Zipdatei prüfen
if zipfile.is_zipfile(fileselect):
dirtmp = mkdtemp()
fhz = zipfile.ZipFile(fileselect)
fhz.extractall(dirtmp)
fhz.close()
filelist = self.create_filelist(dirtmp)
dirselect, rscfile = self.check_replacedir(dirtmp)
else:
tkmsg.showerror( tkmsg.showerror(
parent=self.master, title="Fehler", parent=self.master, title="Fehler",
message="Die angegebene Datei ist kein ZIP-Archiv.") message="Die angegebene Datei ist kein ZIP-Archiv.")
fh.close() return False
fh = None
elif tup == 3: elif tup == 3:
# TarGz # TarGz
fh = tkfd.askopenfile( fileselect = tkfd.askopenfilename(
mode="rb", parent=self.master, parent=self.master, title="TarGz-Archiv übertragen...",
title="TarGz-Archiv übertragen...",
initialfile=self.revpi + ".tar.gz", initialfile=self.revpi + ".tar.gz",
filetypes=(("Tar Archiv", "*.tar.gz"), ("All Files", "*.*")) filetypes=(("Tar Archiv", "*.tar.gz"), ("All Files", "*.*"))
) )
if not tarfile.is_tarfile(fh.name): if type(fileselect) == str and fileselect != "":
# Zipdatei prüfen
# Tar-Datei prüfen
if tarfile.is_tarfile(fileselect):
dirtmp = mkdtemp()
fht = tarfile.open(fileselect)
fht.extractall(dirtmp)
fht.close()
filelist = self.create_filelist(dirtmp)
dirselect, rscfile = self.check_replacedir(dirtmp)
else:
tkmsg.showerror( tkmsg.showerror(
parent=self.master, title="Fehler", parent=self.master, title="Fehler",
message="Die angegebene Datei ist kein TAR-Archiv.") message="Die angegebene Datei ist kein TAR-Archiv.")
fh.close()
fh = None
# Wenn kein fh existiert abbrachen
if fh is None:
return False return False
# Wenn keine Dateien gewählt
if len(filelist) == 0:
return True
# Vor Übertragung aufräumen wenn ausgewählt # Vor Übertragung aufräumen wenn ausgewählt
if self.var_cleanup.get() and not self.xmlcli.plcuploadclean(): if self.var_cleanup.get() and not self.xmlcli.plcuploadclean():
tkmsg.showerror( tkmsg.showerror(
@@ -459,48 +478,62 @@ class RevPiProgram(tkinter.Frame):
# Flag setzen, weil ab hier Veränderungen existieren # Flag setzen, weil ab hier Veränderungen existieren
self.uploaded = True self.uploaded = True
ec = 0
for fname in filelist:
# Archiv prüfen und umpacken if fname == rscfile:
if tup >= 2: continue
# TODO: Archive umpacken
pass
# piControlReset abfragen
if self.var_picup.get():
pass
# TODO: Fehlerabfang bei Dateilesen # TODO: Fehlerabfang bei Dateilesen
xmldata = Binary(fh.read()) with open(fname, "rb") as fh:
ec = self.xmlcli.plcupload(xmldata)
# Dateinamen ermitteln
if dirselect == "":
sendname = os.path.basename(fname)
else:
sendname = fname.replace(dirselect, "")[1:]
# Datei übertragen
try:
ustatus = self.xmlcli.plcupload(
Binary(gzip.compress(fh.read())), sendname)
except:
ec = -2
break
if not ustatus:
ec = -1
break
if ec == 0: if ec == 0:
tkmsg.showinfo( tkmsg.showinfo(
parent=self.master, title="Erfolgreich", parent=self.master, title="Erfolgreich",
message="Die Übertragung war erfolgreich.") message="Die Übertragung war erfolgreich.")
elif ec > 0:
tkmsg.showwarning( if self.var_picup.get():
parent=self.master, title="Warnung", if rscfile is not None:
message="Die Übertragung war erfolgreich. \n" self.setpictoryrsc(rscfile)
"Beim piControl Reset trat allerdings ein Fehler auf!") else:
tkmsg.showerror(
parent=self.master, title="Fehler",
message="Es wurde im Archiv keine piCtory "
"Konfiguration gefunden")
elif ec == -1: elif ec == -1:
tkmsg.showerror( tkmsg.showerror(
parent=self.master, title="Fehler", parent=self.master, title="Fehler",
message="Der Revoluton Pi konnte die übertragene Datei nicht " message="Der Revoluton Pi konnte Teile der Übertragung nicht "
"verarbeiten.") "verarbeiten.")
elif ec < -1:
tkmsg.showwarning(
parent=self.master, title="Warnung",
message="Die Übertragung war erfolgreich. \n"
"Beim verarbeiten der piCtory Konfiguration trat allerdings "
"ein Fehler auf!")
fh.close() elif ec == -2:
tkmsg.showerror(
parent=self.master, title="Fehler",
message="Bei der Übertragung traten Fehler auf")
# Temp-File aufräumen # Temp-Dir aufräumen
if tup <= 1: if dirtmp is not None:
os.remove(fh.name) rmtree(dirtmp)
if __name__ == "__main__": if __name__ == "__main__":