mktemp gegen mkstemp getauscht

procimgserver hinzugefügt
XML-RPC Aufruffunktionen für ProcimgServer hinzugefügt
This commit is contained in:
2017-06-27 13:51:54 +02:00
parent d3e155e2c2
commit 5950c819f2
8 changed files with 442 additions and 8 deletions

183
doc/procimgserver.html Normal file
View File

@@ -0,0 +1,183 @@
<!DOCTYPE html>
<html><head>
<title>procimgserver</title>
<meta charset="UTF-8">
</head>
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
<h1 style="background-color:#FFFFFF;color:#0000FF">
procimgserver</h1>
<p>
Stellt Funktionen bereit um das Prozessabbild zu ueberwachen.
</p><p>
Bei ausreichend Rechten koennen Ausgaenge auch gesetzt werden um einen
IO-Check bei Inbetriebname durchzufuehren.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#ProcimgServer">ProcimgServer</a></td>
<td>Serverkomponente fuer zusaetzliche XML-RPC Funktionen.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="ProcimgServer" ID="ProcimgServer"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">ProcimgServer</h2>
<p>
Serverkomponente fuer zusaetzliche XML-RPC Funktionen.
</p><p>
Diese Klasse registriert zusaetzliche Funktionen an einem besthenden
XML-RPC-Server. Der Funktionsumfang wird erweitert um zyklisch das
Prozessabbild zu empfangen und bei ausreichend Rechten Ausgaenge zu
setzen.
</p><p>
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
None
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#ProcimgServer.__init__">ProcimgServer</a></td>
<td>Instantiiert RevPiCheckServer()-Klasse.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#ProcimgServer.devices">devices</a></td>
<td>Generiert Deviceliste mit Position und Namen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#ProcimgServer.ios">ios</a></td>
<td>Generiert ein dict() der Devices und IOs.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#ProcimgServer.setvalue">setvalue</a></td>
<td>Setzt einen Wert auf dem RevPi.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#ProcimgServer.start">start</a></td>
<td>Registriert XML Funktionen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#ProcimgServer.stop">stop</a></td>
<td>Entfernt XML-Funktionen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#ProcimgServer.values">values</a></td>
<td>Liefert Prozessabbild an Client.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="ProcimgServer.__init__" ID="ProcimgServer.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
ProcimgServer (Constructor)</h3>
<b>ProcimgServer</b>(<i>logger, xmlserver, configrsc, procimg, aclmode</i>)
<p>
Instantiiert RevPiCheckServer()-Klasse.
</p><dl>
<dt><i>xmlserver:</i></dt>
<dd>
XML-RPC Server
</dd><dt><i>procimg:</i></dt>
<dd>
Pfad zum Prozessabbild
</dd><dt><i>configrsc:</i></dt>
<dd>
Pfad zur piCtory Konfigurationsdatei
</dd><dt><i>logger:</i></dt>
<dd>
Loggerinstanz
</dd><dt><i>aclmode:</i></dt>
<dd>
Zugriffsrechte
</dd>
</dl><a NAME="ProcimgServer.devices" ID="ProcimgServer.devices"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
ProcimgServer.devices</h3>
<b>devices</b>(<i></i>)
<p>
Generiert Deviceliste mit Position und Namen.
</p><dl>
<dt>Returns:</dt>
<dd>
list() mit Tuple (pos, name)
</dd>
</dl><a NAME="ProcimgServer.ios" ID="ProcimgServer.ios"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
ProcimgServer.ios</h3>
<b>ios</b>(<i>type</i>)
<p>
Generiert ein dict() der Devices und IOs.
</p><dl>
<dt><i>type:</i></dt>
<dd>
IO Typ inp/out
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
pickled dict()
</dd>
</dl><a NAME="ProcimgServer.setvalue" ID="ProcimgServer.setvalue"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
ProcimgServer.setvalue</h3>
<b>setvalue</b>(<i>device, io, value</i>)
<p>
Setzt einen Wert auf dem RevPi.
</p><dl>
<dt><i>device:</i></dt>
<dd>
Device Position oder Name
</dd><dt><i>io:</i></dt>
<dd>
IO Name fuer neuen Wert
</dd><dt><i>value:</i></dt>
<dd>
Neuer Wert
</dd>
</dl><a NAME="ProcimgServer.start" ID="ProcimgServer.start"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
ProcimgServer.start</h3>
<b>start</b>(<i></i>)
<p>
Registriert XML Funktionen.
</p><a NAME="ProcimgServer.stop" ID="ProcimgServer.stop"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
ProcimgServer.stop</h3>
<b>stop</b>(<i></i>)
<p>
Entfernt XML-Funktionen.
</p><a NAME="ProcimgServer.values" ID="ProcimgServer.values"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
ProcimgServer.values</h3>
<b>values</b>(<i></i>)
<p>
Liefert Prozessabbild an Client.
</p><dl>
<dt>Returns:</dt>
<dd>
Binary() bytes or None
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -497,6 +497,12 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_plcuploadclean">xml_plcuploadclean</a></td>
<td>Loescht das gesamte plcworkdir Verzeichnis.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_psstart">xml_psstart</a></td>
<td>Starten den Prozessabbildserver.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_psstop">xml_psstop</a></td>
<td>Stoppt den Prozessabbildserver.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyLoad.xml_reload">xml_reload</a></td>
<td>Startet RevPiPyLoad neu und verwendet neue Konfiguraiton.</td>
</tr><tr>
@@ -727,6 +733,28 @@ Loescht das gesamte plcworkdir Verzeichnis.
<dd>
True, wenn erfolgreich
</dd>
</dl><a NAME="RevPiPyLoad.xml_psstart" ID="RevPiPyLoad.xml_psstart"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyLoad.xml_psstart</h3>
<b>xml_psstart</b>(<i></i>)
<p>
Starten den Prozessabbildserver.
</p><dl>
<dt>Returns:</dt>
<dd>
True, wenn start erfolgreich
</dd>
</dl><a NAME="RevPiPyLoad.xml_psstop" ID="RevPiPyLoad.xml_psstop"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyLoad.xml_psstop</h3>
<b>xml_psstop</b>(<i></i>)
<p>
Stoppt den Prozessabbildserver.
</p><dl>
<dt>Returns:</dt>
<dd>
True, wenn stop erfolgreich
</dd>
</dl><a NAME="RevPiPyLoad.xml_reload" ID="RevPiPyLoad.xml_reload"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyLoad.xml_reload</h3>

View File

@@ -1,3 +1,10 @@
procimgserver.ProcimgServer.devices?4()
procimgserver.ProcimgServer.ios?4(type)
procimgserver.ProcimgServer.setvalue?4(device, io, value)
procimgserver.ProcimgServer.start?4()
procimgserver.ProcimgServer.stop?4()
procimgserver.ProcimgServer.values?4()
procimgserver.ProcimgServer?1(logger, xmlserver, configrsc, procimg, aclmode)
proginit.cleanup?4()
proginit.configure?4()
proginit.forked?7
@@ -48,6 +55,8 @@ revpipyload.RevPiPyLoad.xml_plcstart?4()
revpipyload.RevPiPyLoad.xml_plcstop?4()
revpipyload.RevPiPyLoad.xml_plcupload?4(filedata, filename)
revpipyload.RevPiPyLoad.xml_plcuploadclean?4()
revpipyload.RevPiPyLoad.xml_psstart?4()
revpipyload.RevPiPyLoad.xml_psstop?4()
revpipyload.RevPiPyLoad.xml_reload?4()
revpipyload.RevPiPyLoad.xml_setconfig?4(dc, loadnow=False)
revpipyload.RevPiPyLoad.xml_setpictoryrsc?4(filebytes, reset=False)

View File

@@ -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-05-31, 15:02:13 -->
<!-- Saved: 2017-06-27, 12:47:26 -->
<!-- Copyright (C) 2017 Sven Sager, akira@narux.de -->
<Project version="5.1">
<Language>en_US</Language>
@@ -9,7 +9,7 @@
<ProgLanguage mixed="0">Python3</ProgLanguage>
<ProjectType>Console</ProjectType>
<Description>Dieser Loader wird über das Init-System geladen und führt das angegebene Pythonprogramm aus. Es ist für den RevolutionPi gedacht um automatisch das SPS-Programm zu starten.</Description>
<Version>0.3.0</Version>
<Version>0.4.0</Version>
<Author>Sven Sager</Author>
<Email>akira@narux.de</Email>
<Eol index="-1"/>
@@ -17,6 +17,7 @@
<Source>revpipyload/proginit.py</Source>
<Source>setup.py</Source>
<Source>revpipyload/revpipyload.py</Source>
<Source>revpipyload/procimgserver.py</Source>
</Sources>
<Forms/>
<Translations/>
@@ -28,7 +29,9 @@
<Other>doc</Other>
<Other>debian</Other>
<Other>eric-revpipyload.api</Other>
<Other>stdeb.cfg</Other>
</Others>
<MainScript>revpipyload/revpipyload.py</MainScript>
<Vcs>
<VcsType>Mercurial</VcsType>
<VcsOptions>

View File

@@ -0,0 +1,169 @@
#
# RevPiPyLoad
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
"""Stellt Funktionen bereit um das Prozessabbild zu ueberwachen.
Bei ausreichend Rechten koennen Ausgaenge auch gesetzt werden um einen
IO-Check bei Inbetriebname durchzufuehren.
"""
import pickle
import revpimodio
from xmlrpc.client import Binary
class ProcimgServer():
"""Serverkomponente fuer zusaetzliche XML-RPC Funktionen.
Diese Klasse registriert zusaetzliche Funktionen an einem besthenden
XML-RPC-Server. Der Funktionsumfang wird erweitert um zyklisch das
Prozessabbild zu empfangen und bei ausreichend Rechten Ausgaenge zu
setzen.
"""
def __init__(self, logger, xmlserver, configrsc, procimg, aclmode):
"""Instantiiert RevPiCheckServer()-Klasse.
@param xmlserver: XML-RPC Server
@param procimg: Pfad zum Prozessabbild
@param configrsc: Pfad zur piCtory Konfigurationsdatei
@param logger: Loggerinstanz
@param aclmode: Zugriffsrechte
"""
# Logger übernehmen
self.logger = logger
self.logger.debug("enter ProcimgServer.__init__()")
self.acl = aclmode
# XML-Server übernehmen
self.xmlsrv = xmlserver
self.xmlreadfuncs = {
"ps_devices": self.devices,
"ps_inps": lambda: self.ios("inp"),
"ps_outs": lambda: self.ios("out"),
"ps_mems": lambda: self.ios("mem"),
"ps_values": self.values,
}
self.xmlwritefuncs = {
"ps_setvalue": self.setvalue,
}
# RevPiModIO-Modul Instantiieren
self.logger.debug("create revpimodio class")
self.rpi = revpimodio.RevPiModIO(
configrsc=configrsc,
procimg=procimg,
)
self.rpi.devices.syncoutputs(device=0)
self.logger.debug("created revpimodio class")
self.logger.debug("leave ProcimgServer.__init__()")
def devices(self):
"""Generiert Deviceliste mit Position und Namen.
@returns: list() mit Tuple (pos, name)"""
return [
(dev.position, dev.name) for dev in self.rpi.devices
]
def ios(self, type):
"""Generiert ein dict() der Devices und IOs.
@param type: IO Typ inp/out
@returns: pickled dict()"""
dict_ios = {}
for dev in self.rpi.devices:
dict_ios[dev.position] = []
# IO Typen auswerten
if type == "inp":
lst_io = dev.get_inps()
elif type == "out":
lst_io = dev.get_outs()
elif type == "mem":
lst_io = dev.get_mems()
else:
lst_io = []
for io in lst_io:
dict_ios[dev.position].append([
io.name,
1 if io._bitlength == 1 else int(io._bitlength / 8),
io.slc_address.start + dev.offset,
io.bmk,
io._bitaddress,
])
return Binary(pickle.dumps(dict_ios))
def setvalue(self, device, io, value):
"""Setzt einen Wert auf dem RevPi.
@param device: Device Position oder Name
@param io: IO Name fuer neuen Wert
@param value: Neuer Wert
"""
# Zugriffsrechte prüfen
if self.acl < 3:
raise PermissionError(
"not allowed in XML-RPC permission mode {}".format(self.acl)
)
self.rpi.devices.syncoutputs(device=device)
# Neuen Wert übernehmen
if type(value) == bytes or type(value) == bool:
self.rpi.devices[device][io].set_value(value)
else:
self.rpi.devices[device][io].value = value.to_bytes(
self.rpi.devices[device][io].length, byteorder="little"
)
self.rpi.devices.writeprocimg(device=device)
def values(self):
"""Liefert Prozessabbild an Client.
@returns: Binary() bytes or None"""
if self.rpi.devices.readprocimg() and self.rpi.devices.syncoutputs():
bytebuff = b''
for dev in self.rpi.devices:
bytebuff += bytes(dev)
return Binary(bytebuff)
else:
return None
def start(self):
"""Registriert XML Funktionen."""
self.logger.debug("enter ProcimgServer.start()")
# Registriere Funktionen
for xmlfunc in self.xmlreadfuncs:
self.xmlsrv.register_function(self.xmlreadfuncs[xmlfunc], xmlfunc)
if self.acl >= 3:
for xmlfunc in self.xmlwritefuncs:
self.xmlsrv.register_function(
self.xmlwritefuncs[xmlfunc], xmlfunc
)
self.logger.debug("leave ProcimgServer.start()")
def stop(self):
"""Entfernt XML-Funktionen."""
self.logger.debug("enter ProcimgServer.stop()")
# Entferne Funktionen
for xmlfunc in self.xmlreadfuncs:
if xmlfunc in self.xmlsrv.funcs:
del self.xmlsrv.funcs[xmlfunc]
if self.acl >= 3:
for xmlfunc in self.xmlwritefuncs:
if xmlfunc in self.xmlsrv.funcs:
del self.xmlsrv.funcs[xmlfunc]
self.logger.debug("leave ProcimgServer.stop()")

View File

@@ -45,7 +45,7 @@ from json import loads as jloads
from re import match as rematch
from shutil import rmtree
from sys import stdout as sysstdout
from tempfile import mktemp
from tempfile import mkstemp
from threading import Thread, Event, Lock
from time import sleep, asctime
from xmlrpc.client import Binary
@@ -54,7 +54,7 @@ from xmlrpc.server import SimpleXMLRPCServer
configrsc = None
picontrolreset = "/opt/KUNBUS/piControlReset"
procimg = "/dev/piControl0"
pyloadverion = "0.3.0"
pyloadverion = "0.4.0"
class LogReader():
@@ -512,6 +512,7 @@ class RevPiPyLoad():
self.tfile = {}
self.tpe = None
self.xsrv = None
self.xml_ps = None
# Load config
self._loadconfig()
@@ -592,6 +593,23 @@ class RevPiPyLoad():
self.xsrv.register_function(self.xml_plcstop, "plcstop")
self.xsrv.register_function(self.xml_reload, "reload")
# Erweiterte Funktionen anmelden
try:
import procimgserver
self.xml_ps = procimgserver.ProcimgServer(
proginit.logger, self.xsrv, configrsc, procimg, self.xmlrpc
)
self.xsrv.register_function(self.xml_psstart, "psstart")
self.xsrv.register_function(self.xml_psstop, "psstop")
except:
self.xml_ps = None
proginit.logger.warning(
"can not load revpimodio module. maybe its not installed "
"or an old version (required at least 0.11.0). if you "
"like to use the process monitor feature, update/install "
"revpimodio: 'apt-get install python3-revpimodio'"
)
# XML Modus 2 Einstellungen lesen und Programm herunterladen
if self.xmlrpc >= 2:
self.xsrv.register_function(
@@ -691,7 +709,7 @@ class RevPiPyLoad():
@returns: Dateinamen des Archivs
"""
filename = mktemp(suffix=".packed", prefix="plc")
filename = mkstemp(suffix=".packed", prefix="plc")
if mode == "zip":
fh_pack = zipfile.ZipFile(filename, mode="w")
@@ -1008,6 +1026,8 @@ class RevPiPyLoad():
if chk not in jconfigrsc:
return -2
# TODO: Module prüfen, ob sie existieren
try:
with open(configrsc, "wb") as fh:
fh.write(filebytes.data)
@@ -1019,6 +1039,24 @@ class RevPiPyLoad():
else:
return 0
def xml_psstart(self):
"""Starten den Prozessabbildserver.
@returns: True, wenn start erfolgreich"""
if self.xml_ps is not None:
self.xml_ps.start()
return True
else:
return False
def xml_psstop(self):
"""Stoppt den Prozessabbildserver.
@returns: True, wenn stop erfolgreich"""
if self.xml_ps is not None:
self.xml_ps.stop()
return True
else:
return False
if __name__ == "__main__":
root = RevPiPyLoad()

View File

@@ -27,10 +27,12 @@ setup(
license="LGPLv3",
name="revpipyload",
version="0.3.0",
version="0.4.0",
scripts=["data/revpipyload"],
install_requires=["revpimodio"],
data_files=[
("/etc/default", ["data/etc/default/revpipyload"]),
("/etc/revpipyload", ["data/etc/revpipyload/revpipyload.conf"]),

View File

@@ -1,4 +1,6 @@
[DEFAULT]
X-Python3-Version: 3.2-
Debian-Version: 1
Depends3: python3-revpimodio (>= 0.11.0)
Package: revpipyload
Suite: stable
X-Python3-Version: >=3.2