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:
@@ -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__":
|
||||||
|
|||||||
Reference in New Issue
Block a user