1
0
mirror of https://github.com/naruxde/revpipycontrol.git synced 2025-12-28 18:58:03 +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 for file in fileselect:
tmpfile = mktemp() filelist.append(file)
noerr = True
try:
fh_pack = tarfile.open(
name=tmpfile, mode="w:gz", dereference=True)
for file in fileselect:
fh_pack.add(
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,117 +413,127 @@ 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
tkmsg.showerror( if zipfile.is_zipfile(fileselect):
parent=self.master, title="Fehler", dirtmp = mkdtemp()
message="Die angegebene Datei ist kein ZIP-Archiv.") fhz = zipfile.ZipFile(fileselect)
fh.close() fhz.extractall(dirtmp)
fh = None fhz.close()
filelist = self.create_filelist(dirtmp)
dirselect, rscfile = self.check_replacedir(dirtmp)
else:
tkmsg.showerror(
parent=self.master, title="Fehler",
message="Die angegebene Datei ist kein ZIP-Archiv.")
return False
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
tkmsg.showerror(
parent=self.master, title="Fehler",
message="Die angegebene Datei ist kein TAR-Archiv.")
fh.close()
fh = None
# Wenn kein fh existiert abbrachen # Tar-Datei prüfen
if fh is None: if tarfile.is_tarfile(fileselect):
return False 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(
parent=self.master, title="Fehler",
message="Die angegebene Datei ist kein TAR-Archiv.")
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(
parent=self.masger, title="Fehler", parent=self.masger, title="Fehler",
message="Beim Löschen der Dateien auf dem Revolution Pi ist " message="Beim Löschen der Dateien auf dem Revolution Pi ist "
"ein Fehler aufgetreten.") "ein Fehler aufgetreten.")
return False return False
# 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
# TODO: Fehlerabfang bei Dateilesen
with open(fname, "rb") as fh:
# piControlReset abfragen # Dateinamen ermitteln
if self.var_picup.get(): if dirselect == "":
pass 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
# TODO: Fehlerabfang bei Dateilesen
xmldata = Binary(fh.read())
ec = self.xmlcli.plcupload(xmldata)
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__":