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
|
||||
DESC="RevPiPyLoad to run plc program"
|
||||
NAME=revpipyload
|
||||
DAEMON=/usr/local/share/revpipyload/revpipyload.py
|
||||
DAEMON=/usr/share/revpipyload/revpipyload.py
|
||||
DAEMON_ARGS="-d"
|
||||
PIDFILE=/var/run/$NAME.pid
|
||||
SCRIPTNAME=/etc/init.d/$NAME
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/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"?>
|
||||
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
|
||||
<!-- 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 -->
|
||||
<Project version="5.1">
|
||||
<Language>en_US</Language>
|
||||
@@ -194,7 +194,7 @@
|
||||
<string>MaxLineLength</string>
|
||||
</key>
|
||||
<value>
|
||||
<int>80</int>
|
||||
<int>79</int>
|
||||
</value>
|
||||
<key>
|
||||
<string>NoFixCodes</string>
|
||||
|
||||
@@ -13,6 +13,7 @@ import shlex
|
||||
import signal
|
||||
import subprocess
|
||||
import tarfile
|
||||
import zipfile
|
||||
from concurrent import futures
|
||||
from shutil import rmtree
|
||||
from tempfile import mktemp
|
||||
@@ -21,7 +22,8 @@ from time import sleep, asctime
|
||||
from xmlrpc.client import Binary
|
||||
from xmlrpc.server import SimpleXMLRPCServer
|
||||
|
||||
|
||||
configrsc = "/opt/KUNBUS/config.rsc"
|
||||
procimg = "/dev/piControl0"
|
||||
pyloadverion = "0.2.3"
|
||||
|
||||
|
||||
@@ -65,7 +67,9 @@ class LogReader():
|
||||
self.fhapp.seek(self.posapp)
|
||||
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
|
||||
|
||||
def get_applog(self):
|
||||
@@ -104,7 +108,9 @@ class LogReader():
|
||||
self.fhplc.seek(self.posplc)
|
||||
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
|
||||
|
||||
def get_plclog(self):
|
||||
@@ -156,7 +162,7 @@ class RevPiPlc(Thread):
|
||||
|
||||
if fh is not None:
|
||||
fh = open(fh, "a")
|
||||
fh.write("-" * 40)
|
||||
fh.write("-" * 45)
|
||||
fh.write("\nplc app started: {}\n".format(asctime()))
|
||||
fh.flush()
|
||||
|
||||
@@ -277,7 +283,8 @@ class RevPiPyLoad(proginit.ProgInit):
|
||||
self.globalconfig.read(self.globalconffile)
|
||||
|
||||
# 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.plcprog = self.globalconfig["DEFAULT"].get("plcprogram", None)
|
||||
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_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_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_plcexitcode, "plcexitcode")
|
||||
self.xsrv.register_function(self.xml_plcrunning, "plcrunning")
|
||||
self.xsrv.register_function(self.xml_plcstart, "plcstart")
|
||||
self.xsrv.register_function(self.xml_plcstop, "plcstop")
|
||||
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.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")
|
||||
proginit.logger.debug("created xmlrpc server")
|
||||
|
||||
@@ -363,55 +378,22 @@ class RevPiPyLoad(proginit.ProgInit):
|
||||
proginit.logger.debug("got reload config signal")
|
||||
self.evt_loadconfig.set()
|
||||
|
||||
def get_config(self):
|
||||
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):
|
||||
def packapp(self, mode="tar"):
|
||||
"""Erzeugt aus dem PLC-Programm ein TAR-File."""
|
||||
filename = mktemp(suffix=".tar.gz", prefix="plc")
|
||||
try:
|
||||
fh_tar = tarfile.TarFile.open(name=filename, mode="w:gz")
|
||||
fh_tar.add(".")
|
||||
fh_tar.close()
|
||||
except:
|
||||
return ""
|
||||
filename = mktemp(suffix=".packed", prefix="plc")
|
||||
# try:
|
||||
if mode == "zip":
|
||||
fh_pack = zipfile.ZipFile(filename, mode="w")
|
||||
wd = os.walk("./")
|
||||
for tup_dir in wd:
|
||||
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
|
||||
|
||||
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):
|
||||
"""Start plcload and PLC python program."""
|
||||
proginit.logger.info("starting revpipyload")
|
||||
@@ -451,11 +433,49 @@ class RevPiPyLoad(proginit.ProgInit):
|
||||
self.tpe.shutdown()
|
||||
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
|
||||
if file is None:
|
||||
return self.packapp()
|
||||
elif os.path.exists(file):
|
||||
file = self.packapp(mode)
|
||||
if os.path.exists(file):
|
||||
fh = open(file, "rb")
|
||||
xmldata = Binary(fh.read())
|
||||
fh.close()
|
||||
@@ -497,6 +517,7 @@ class RevPiPyLoad(proginit.ProgInit):
|
||||
return -1
|
||||
|
||||
def xml_plcupload(self, filedata):
|
||||
proginit.logger.debug("xmlrpc call plcupload")
|
||||
# TODO: Daten blockweise annehmen
|
||||
if filedata is None:
|
||||
return False
|
||||
@@ -507,19 +528,25 @@ class RevPiPyLoad(proginit.ProgInit):
|
||||
fh.write(filedata.data)
|
||||
fh.close()
|
||||
|
||||
# Packer ermitteln
|
||||
fh_pack = None
|
||||
if tarfile.is_tarfile(filename):
|
||||
# Archiv auspacken
|
||||
fh_tar = tarfile.open(filename)
|
||||
fh_tar.extractall()
|
||||
fh_tar.close()
|
||||
fh_pack = tarfile.open(filename)
|
||||
elif zipfile.is_zipfile(filename):
|
||||
fh_pack = zipfile.open(filename)
|
||||
|
||||
if fh_pack is not None:
|
||||
fh_pack.extractall()
|
||||
fh_pack.close()
|
||||
os.remove(filename)
|
||||
return True
|
||||
else:
|
||||
|
||||
# Kein Archiv
|
||||
os.remove(filename)
|
||||
return False
|
||||
|
||||
def xml_plcuploadclean(self):
|
||||
proginit.logger.debug("xmlrpc call plcuploadclean")
|
||||
try:
|
||||
rmtree(".", ignore_errors=True)
|
||||
except:
|
||||
@@ -530,6 +557,49 @@ class RevPiPyLoad(proginit.ProgInit):
|
||||
proginit.logger.debug("xmlrpc call reload")
|
||||
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__":
|
||||
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):
|
||||
|
||||
u"""Disable egg_info installation, seems pointless for a non-library."""
|
||||
"""Disable egg_info installation, seems pointless for a non-library."""
|
||||
|
||||
def run(self):
|
||||
u"""just pass egg_info."""
|
||||
"""just pass egg_info."""
|
||||
pass
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ setup(
|
||||
("/etc/logrotate.d", ["data/etc/logrotate.d/revpipyload"]),
|
||||
("/etc/revpipyload", ["data/etc/revpipyload/revpipyload.conf"]),
|
||||
("share/revpipyload", glob("revpipyload/*.*")),
|
||||
("/var/lib/revpipyload", ["data/var/lib/revpipyload/.placeholder"])
|
||||
],
|
||||
|
||||
description="PLC Loader für Python-Projekte auf den RevolutionPi",
|
||||
@@ -49,7 +50,8 @@ setup(
|
||||
"zur Laufzeit überwacht werden.",
|
||||
|
||||
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",
|
||||
],
|
||||
cmdclass={"install_egg_info": MyEggInfo},
|
||||
|
||||
Reference in New Issue
Block a user