mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 15:13:52 +01:00
Packversion tar/zip
piCtory Up-Download ProcImg Download
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
exec "/usr/local/share/revpipyload/revpipyload.py" "$@"
|
exec "/usr/share/revpipyload/revpipyload.py" "$@"
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
8
setup.py
8
setup.py
@@ -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},
|
||||||
|
|||||||
Reference in New Issue
Block a user