Packversion tar/zip

piCtory Up-Download
ProcImg Download
This commit is contained in:
2017-03-09 20:26:06 +01:00
parent 9b1be830d2
commit e2f7ed41ea
5 changed files with 145 additions and 73 deletions

View File

@@ -16,7 +16,7 @@
PATH=/sbin:/usr/sbin:/bin:/usr/bin PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="RevPiPyLoad to run plc program" DESC="RevPiPyLoad to run plc program"
NAME=revpipyload NAME=revpipyload
DAEMON=/usr/local/share/revpipyload/revpipyload.py DAEMON=/usr/share/revpipyload/revpipyload.py
DAEMON_ARGS="-d" DAEMON_ARGS="-d"
PIDFILE=/var/run/$NAME.pid PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME SCRIPTNAME=/etc/init.d/$NAME

View File

@@ -1,3 +1,3 @@
#!/bin/sh #!/bin/sh
exec "/usr/local/share/revpipyload/revpipyload.py" "$@" exec "/usr/share/revpipyload/revpipyload.py" "$@"

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd"> <!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- eric project file for project revpipyload --> <!-- eric project file for project revpipyload -->
<!-- Saved: 2017-03-08, 17:50:16 --> <!-- Saved: 2017-03-09, 20:23:34 -->
<!-- Copyright (C) 2017 Sven Sager, akira@narux.de --> <!-- Copyright (C) 2017 Sven Sager, akira@narux.de -->
<Project version="5.1"> <Project version="5.1">
<Language>en_US</Language> <Language>en_US</Language>
@@ -194,7 +194,7 @@
<string>MaxLineLength</string> <string>MaxLineLength</string>
</key> </key>
<value> <value>
<int>80</int> <int>79</int>
</value> </value>
<key> <key>
<string>NoFixCodes</string> <string>NoFixCodes</string>

View File

@@ -13,6 +13,7 @@ import shlex
import signal import signal
import subprocess import subprocess
import tarfile import tarfile
import zipfile
from concurrent import futures from concurrent import futures
from shutil import rmtree from shutil import rmtree
from tempfile import mktemp from tempfile import mktemp
@@ -21,7 +22,8 @@ from time import sleep, asctime
from xmlrpc.client import Binary from xmlrpc.client import Binary
from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCServer
configrsc = "/opt/KUNBUS/config.rsc"
procimg = "/dev/piControl0"
pyloadverion = "0.2.3" pyloadverion = "0.2.3"
@@ -65,7 +67,9 @@ class LogReader():
self.fhapp.seek(self.posapp) self.fhapp.seek(self.posapp)
break break
proginit.logger.debug("got {} new app log lines".format(len(lst_new))) proginit.logger.debug(
"got {} new app log lines".format(len(lst_new))
)
return lst_new return lst_new
def get_applog(self): def get_applog(self):
@@ -104,7 +108,9 @@ class LogReader():
self.fhplc.seek(self.posplc) self.fhplc.seek(self.posplc)
break break
proginit.logger.debug("got {} new pyloader log lines".format(len(lst_new))) proginit.logger.debug(
"got {} new pyloader log lines".format(len(lst_new))
)
return lst_new return lst_new
def get_plclog(self): def get_plclog(self):
@@ -156,7 +162,7 @@ class RevPiPlc(Thread):
if fh is not None: if fh is not None:
fh = open(fh, "a") fh = open(fh, "a")
fh.write("-" * 40) fh.write("-" * 45)
fh.write("\nplc app started: {}\n".format(asctime())) fh.write("\nplc app started: {}\n".format(asctime()))
fh.flush() fh.flush()
@@ -277,7 +283,8 @@ class RevPiPyLoad(proginit.ProgInit):
self.globalconfig.read(self.globalconffile) self.globalconfig.read(self.globalconffile)
# Konfiguration verarbeiten # Konfiguration verarbeiten
self.autoreload = int(self.globalconfig["DEFAULT"].get("autoreload", 1)) self.autoreload = \
int(self.globalconfig["DEFAULT"].get("autoreload", 1))
self.autostart = int(self.globalconfig["DEFAULT"].get("autostart", 0)) self.autostart = int(self.globalconfig["DEFAULT"].get("autostart", 0))
self.plcprog = self.globalconfig["DEFAULT"].get("plcprogram", None) self.plcprog = self.globalconfig["DEFAULT"].get("plcprogram", None)
self.plcworkdir = self.globalconfig["DEFAULT"].get( self.plcworkdir = self.globalconfig["DEFAULT"].get(
@@ -313,18 +320,26 @@ class RevPiPyLoad(proginit.ProgInit):
self.xsrv.register_function(self.logr.get_applines, "get_applines") self.xsrv.register_function(self.logr.get_applines, "get_applines")
self.xsrv.register_function(self.logr.get_applog, "get_applog") self.xsrv.register_function(self.logr.get_applog, "get_applog")
self.xsrv.register_function(self.get_config, "get_config")
self.xsrv.register_function(self.logr.get_plclines, "get_plclines") self.xsrv.register_function(self.logr.get_plclines, "get_plclines")
self.xsrv.register_function(self.logr.get_plclog, "get_plclog") self.xsrv.register_function(self.logr.get_plclog, "get_plclog")
self.xsrv.register_function(self.xml_getconfig, "get_config")
self.xsrv.register_function(self.xml_getfilelist, "get_filelist")
self.xsrv.register_function(
self.xml_getpictoryrsc, "get_pictoryrsc")
self.xsrv.register_function(self.xml_getprocimg, "get_procimg")
self.xsrv.register_function(self.xml_plcdownload, "plcdownload") self.xsrv.register_function(self.xml_plcdownload, "plcdownload")
self.xsrv.register_function(self.xml_plcexitcode, "plcexitcode") self.xsrv.register_function(self.xml_plcexitcode, "plcexitcode")
self.xsrv.register_function(self.xml_plcrunning, "plcrunning") self.xsrv.register_function(self.xml_plcrunning, "plcrunning")
self.xsrv.register_function(self.xml_plcstart, "plcstart") self.xsrv.register_function(self.xml_plcstart, "plcstart")
self.xsrv.register_function(self.xml_plcstop, "plcstop") self.xsrv.register_function(self.xml_plcstop, "plcstop")
self.xsrv.register_function(self.xml_plcupload, "plcupload") self.xsrv.register_function(self.xml_plcupload, "plcupload")
self.xsrv.register_function(self.xml_plcuploadclean, "plcuploadclean") self.xsrv.register_function(
self.xml_plcuploadclean, "plcuploadclean")
self.xsrv.register_function(self.xml_reload, "reload") self.xsrv.register_function(self.xml_reload, "reload")
self.xsrv.register_function(self.set_config, "set_config") self.xsrv.register_function(self.xml_setconfig, "set_config")
self.xsrv.register_function(
self.xml_setpictoryrsc, "set_pictoryrsc")
self.xsrv.register_function(lambda: pyloadverion, "version") self.xsrv.register_function(lambda: pyloadverion, "version")
proginit.logger.debug("created xmlrpc server") proginit.logger.debug("created xmlrpc server")
@@ -363,55 +378,22 @@ class RevPiPyLoad(proginit.ProgInit):
proginit.logger.debug("got reload config signal") proginit.logger.debug("got reload config signal")
self.evt_loadconfig.set() self.evt_loadconfig.set()
def get_config(self): def packapp(self, mode="tar"):
dc = {}
dc["autoreload"] = self.autoreload
dc["autostart"] = self.autostart
dc["plcworkdir"] = self.plcworkdir
dc["plcprogram"] = self.plcprog
dc["plcslave"] = self.plcslave
dc["xmlrpc"] = self.xmlrpc
dc["xmlrpcport"] = self.globalconfig["DEFAULT"].get("xmlrpcport", 55123)
dc["zeroonerror"] = self.zerooneerror
dc["zeroonexit"] = self.zeroonexit
return dc
def packapp(self):
"""Erzeugt aus dem PLC-Programm ein TAR-File.""" """Erzeugt aus dem PLC-Programm ein TAR-File."""
filename = mktemp(suffix=".tar.gz", prefix="plc") filename = mktemp(suffix=".packed", prefix="plc")
try: # try:
fh_tar = tarfile.TarFile.open(name=filename, mode="w:gz") if mode == "zip":
fh_tar.add(".") fh_pack = zipfile.ZipFile(filename, mode="w")
fh_tar.close() wd = os.walk("./")
except: for tup_dir in wd:
return "" for file in tup_dir[2]:
fh_pack.write(os.path.join(tup_dir[0], file)[2:])
else:
fh_pack = tarfile.open(name=filename, mode="w:gz")
fh_pack.add(".")
fh_pack.close()
return filename return filename
def set_config(self, dc, loadnow=False):
keys = [
"autoreload",
"autostart",
"plcprogram",
"plcslave",
"xmlrpc",
"xmlrpcport",
"zeroonerror",
"zeroonexit"
]
# Werte übernehmen
for key in keys:
if key in dc:
self.globalconfig.set("DEFAULT", key, str(dc[key]))
# conf-Datei schreiben
fh = open(self.globalconffile, "w")
self.globalconfig.write(fh)
if loadnow:
# RevPiPyLoad neu konfigurieren
self.evt_loadconfig.set()
def start(self): def start(self):
"""Start plcload and PLC python program.""" """Start plcload and PLC python program."""
proginit.logger.info("starting revpipyload") proginit.logger.info("starting revpipyload")
@@ -451,11 +433,49 @@ class RevPiPyLoad(proginit.ProgInit):
self.tpe.shutdown() self.tpe.shutdown()
self.xsrv.server_close() self.xsrv.server_close()
def xml_plcdownload(self, file=None): def xml_getconfig(self):
proginit.logger.debug("xmlrpc call getconfig")
dc = {}
dc["autoreload"] = self.autoreload
dc["autostart"] = self.autostart
dc["plcworkdir"] = self.plcworkdir
dc["plcprogram"] = self.plcprog
dc["plcslave"] = self.plcslave
dc["xmlrpc"] = self.xmlrpc
dc["xmlrpcport"] = \
self.globalconfig["DEFAULT"].get("xmlrpcport", 55123)
dc["zeroonerror"] = self.zerooneerror
dc["zeroonexit"] = self.zeroonexit
return dc
def xml_getfilelist(self):
proginit.logger.debug("xmlrpc call getfilelist")
lst_file = []
wd = os.walk("./")
for tup_dir in wd:
for file in tup_dir[2]:
lst_file.append(os.path.join(tup_dir[0], file)[2:])
return lst_file
def xml_getpictoryrsc(self):
"""Gibt die config.rsc Datei von piCotry zurueck."""
proginit.logger.debug("xmlrpc call getpictoryrsc")
with open(configrsc, "rb") as fh:
buff = fh.read()
return Binary(buff)
def xml_getprocimg(self):
"""Gibt die Rohdaten aus piControl0 zurueck."""
proginit.logger.debug("xmlrpc call getprocimg")
with open(procimg, "rb") as fh:
buff = fh.read()
return Binary(buff)
def xml_plcdownload(self, mode="tar"):
proginit.logger.debug("xmlrpc call plcdownload")
# TODO: Daten blockweise übertragen # TODO: Daten blockweise übertragen
if file is None: file = self.packapp(mode)
return self.packapp() if os.path.exists(file):
elif os.path.exists(file):
fh = open(file, "rb") fh = open(file, "rb")
xmldata = Binary(fh.read()) xmldata = Binary(fh.read())
fh.close() fh.close()
@@ -497,6 +517,7 @@ class RevPiPyLoad(proginit.ProgInit):
return -1 return -1
def xml_plcupload(self, filedata): def xml_plcupload(self, filedata):
proginit.logger.debug("xmlrpc call plcupload")
# TODO: Daten blockweise annehmen # TODO: Daten blockweise annehmen
if filedata is None: if filedata is None:
return False return False
@@ -507,19 +528,25 @@ class RevPiPyLoad(proginit.ProgInit):
fh.write(filedata.data) fh.write(filedata.data)
fh.close() fh.close()
# Packer ermitteln
fh_pack = None
if tarfile.is_tarfile(filename): if tarfile.is_tarfile(filename):
# Archiv auspacken fh_pack = tarfile.open(filename)
fh_tar = tarfile.open(filename) elif zipfile.is_zipfile(filename):
fh_tar.extractall() fh_pack = zipfile.open(filename)
fh_tar.close()
if fh_pack is not None:
fh_pack.extractall()
fh_pack.close()
os.remove(filename) os.remove(filename)
return True return True
else:
# Kein Archiv # Kein Archiv
os.remove(filename) os.remove(filename)
return False return False
def xml_plcuploadclean(self): def xml_plcuploadclean(self):
proginit.logger.debug("xmlrpc call plcuploadclean")
try: try:
rmtree(".", ignore_errors=True) rmtree(".", ignore_errors=True)
except: except:
@@ -530,6 +557,49 @@ class RevPiPyLoad(proginit.ProgInit):
proginit.logger.debug("xmlrpc call reload") proginit.logger.debug("xmlrpc call reload")
self.evt_loadconfig.set() self.evt_loadconfig.set()
def xml_setconfig(self, dc, loadnow=False):
proginit.logger.debug("xmlrpc call setconfig")
keys = [
"autoreload",
"autostart",
"plcprogram",
"plcslave",
"xmlrpc",
"xmlrpcport",
"zeroonerror",
"zeroonexit"
]
# Werte übernehmen
for key in keys:
if key in dc:
self.globalconfig.set("DEFAULT", key, str(dc[key]))
# conf-Datei schreiben
fh = open(self.globalconffile, "w")
self.globalconfig.write(fh)
proginit.logger.info(
"got new config and wrote ist to {}".format(self.globalconffile)
)
if loadnow:
# RevPiPyLoad neu konfigurieren
self.evt_loadconfig.set()
def xml_setpictoryrsc(self, filebytes, reset=False):
"""Schreibt die config.rsc Datei von piCotry."""
proginit.logger.debug("xmlrpc call setpictoryrsc")
try:
with open(configrsc, "wb") as fh:
fh.write(filebytes.data)
except:
return -1
else:
if reset:
return os.system("/opt/KUNBUS/piControlReset")
else:
return 0
if __name__ == "__main__": if __name__ == "__main__":
root = RevPiPyLoad() root = RevPiPyLoad()

View File

@@ -11,10 +11,10 @@ from glob import glob
class MyEggInfo(distutils.command.install_egg_info.install_egg_info): class MyEggInfo(distutils.command.install_egg_info.install_egg_info):
u"""Disable egg_info installation, seems pointless for a non-library.""" """Disable egg_info installation, seems pointless for a non-library."""
def run(self): def run(self):
u"""just pass egg_info.""" """just pass egg_info."""
pass pass
@@ -37,6 +37,7 @@ setup(
("/etc/logrotate.d", ["data/etc/logrotate.d/revpipyload"]), ("/etc/logrotate.d", ["data/etc/logrotate.d/revpipyload"]),
("/etc/revpipyload", ["data/etc/revpipyload/revpipyload.conf"]), ("/etc/revpipyload", ["data/etc/revpipyload/revpipyload.conf"]),
("share/revpipyload", glob("revpipyload/*.*")), ("share/revpipyload", glob("revpipyload/*.*")),
("/var/lib/revpipyload", ["data/var/lib/revpipyload/.placeholder"])
], ],
description="PLC Loader für Python-Projekte auf den RevolutionPi", description="PLC Loader für Python-Projekte auf den RevolutionPi",
@@ -49,7 +50,8 @@ setup(
"zur Laufzeit überwacht werden.", "zur Laufzeit überwacht werden.",
classifiers=[ classifiers=[
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "License :: OSI Approved :: "
"GNU Lesser General Public License v3 (LGPLv3)",
"Operating System :: POSIX :: Linux", "Operating System :: POSIX :: Linux",
], ],
cmdclass={"install_egg_info": MyEggInfo}, cmdclass={"install_egg_info": MyEggInfo},