IP Prüfung für XML-RPC begonnen. Prüft lediglich auf IP und noch keine Level

This commit is contained in:
2018-03-08 15:27:46 +01:00
parent a60a15690a
commit 1210f84664
11 changed files with 559 additions and 97 deletions

221
doc/helper.html Normal file
View File

@@ -0,0 +1,221 @@
<!DOCTYPE html>
<html><head>
<title>helper</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">
helper</h1>
<p>
Helperfunktionen fuer das gesamte RevPiPyLoad-System.
</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="#IpAclManager">IpAclManager</a></td>
<td>Verwaltung fuer IP Adressen und deren ACL Level.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#_ipmatch">_ipmatch</a></td>
<td>Prueft IP gegen ACL List und gibt ACL aus.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#_setuprt">_setuprt</a></td>
<td>Konfiguriert Programm fuer den RT-Scheduler.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#_zeroprocimg">_zeroprocimg</a></td>
<td>Setzt Prozessabbild auf NULL.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#refullmatch">refullmatch</a></td>
<td>re.fullmatch wegen alter python version aus wheezy nachgebaut.</td>
</tr>
</table>
<hr /><hr />
<a NAME="IpAclManager" ID="IpAclManager"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">IpAclManager</h2>
<p>
Verwaltung fuer IP Adressen und deren ACL Level.
</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>acl</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="#IpAclManager.__init__">IpAclManager</a></td>
<td>Init IpAclManager class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.__get_acl">__get_acl</a></td>
<td>Getter fuer den rohen ACL-String.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.__refullmatch">__refullmatch</a></td>
<td>re.fullmatch wegen alter python version aus wheezy nachgebaut.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.__set_acl">__set_acl</a></td>
<td>Uebernimmt neue ACL-Liste fuer die Ausertung der Level.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.get_acllevel">get_acllevel</a></td>
<td>Prueft IP gegen ACL List und gibt ACL-Wert aus.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="IpAclManager.__init__" ID="IpAclManager.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager (Constructor)</h3>
<b>IpAclManager</b>(<i>acl=None, minlevel=0, maxlevel=1</i>)
<p>
Init IpAclManager class.
</p><dl>
<dt><i>acl</i></dt>
<dd>
ACL Liste fuer Berechtigungen als <class 'str'>
</dd>
</dl><a NAME="IpAclManager.__get_acl" ID="IpAclManager.__get_acl"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.__get_acl</h3>
<b>__get_acl</b>(<i></i>)
<p>
Getter fuer den rohen ACL-String.
return ACLs als <class 'str'>
</p><a NAME="IpAclManager.__refullmatch" ID="IpAclManager.__refullmatch"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.__refullmatch</h3>
<b>__refullmatch</b>(<i>regex, string</i>)
<p>
re.fullmatch wegen alter python version aus wheezy nachgebaut.
</p><dl>
<dt><i>regex</i></dt>
<dd>
RegEx Statement
</dd><dt><i>string</i></dt>
<dd>
Zeichenfolge gegen die getestet wird
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
True, wenn komplett passt sonst False
</dd>
</dl><a NAME="IpAclManager.__set_acl" ID="IpAclManager.__set_acl"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.__set_acl</h3>
<b>__set_acl</b>(<i>value</i>)
<p>
Uebernimmt neue ACL-Liste fuer die Ausertung der Level.
</p><dl>
<dt><i>value</i></dt>
<dd>
Neue ACL-Liste als <class 'str'>
</dd>
</dl><a NAME="IpAclManager.get_acllevel" ID="IpAclManager.get_acllevel"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.get_acllevel</h3>
<b>get_acllevel</b>(<i>ipaddress</i>)
<p>
Prueft IP gegen ACL List und gibt ACL-Wert aus.
</p><dl>
<dt><i>ipaddress</i></dt>
<dd>
zum pruefen
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
int() ACL Wert oder -1 wenn nicht gefunden
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="_ipmatch" ID="_ipmatch"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_ipmatch</h2>
<b>_ipmatch</b>(<i>ipaddress, dict_acl</i>)
<p>
Prueft IP gegen ACL List und gibt ACL aus.
</p><dl>
<dt><i>ipaddress</i></dt>
<dd>
zum pruefen
</dd><dt><i>dict_acl</i></dt>
<dd>
ACL Dict gegen die IP zu pruefen ist
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
int() ACL Wert oder -1 wenn nicht gefunden
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="_setuprt" ID="_setuprt"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_setuprt</h2>
<b>_setuprt</b>(<i>pid, evt_exit</i>)
<p>
Konfiguriert Programm fuer den RT-Scheduler.
</p><dl>
<dt><i>pid</i></dt>
<dd>
PID, der angehoben werden soll
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="_zeroprocimg" ID="_zeroprocimg"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_zeroprocimg</h2>
<b>_zeroprocimg</b>(<i></i>)
<p>
Setzt Prozessabbild auf NULL.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="refullmatch" ID="refullmatch"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">refullmatch</h2>
<b>refullmatch</b>(<i>regex, string</i>)
<p>
re.fullmatch wegen alter python version aus wheezy nachgebaut.
</p><dl>
<dt><i>regex</i></dt>
<dd>
RegEx Statement
</dd><dt><i>string</i></dt>
<dd>
Zeichenfolge gegen die getestet wird
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
True, wenn komplett passt sonst False
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -13,6 +13,9 @@ Table of contents</h1>
Modules</h3> Modules</h3>
<table> <table>
<tr> <tr>
<td><a style="color:#0000FF" href="helper.html">helper</a></td>
<td>Helperfunktionen fuer das gesamte RevPiPyLoad-System.</td>
</tr><tr>
<td><a style="color:#0000FF" href="logsystem.html">logsystem</a></td> <td><a style="color:#0000FF" href="logsystem.html">logsystem</a></td>
<td>Modul fuer die Verwaltung der Logdateien.</td> <td>Modul fuer die Verwaltung der Logdateien.</td>
</tr><tr> </tr><tr>
@@ -30,6 +33,9 @@ Modules</h3>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="revpipyload.html">revpipyload</a></td> <td><a style="color:#0000FF" href="revpipyload.html">revpipyload</a></td>
<td>Revolution Pi Python PLC Loader.</td> <td>Revolution Pi Python PLC Loader.</td>
</tr><tr>
<td><a style="color:#0000FF" href="xrpcserver.html">xrpcserver</a></td>
<td>XML-RPC Server anpassungen fuer Absicherung.</td>
</tr> </tr>
</table> </table>
</body></html> </body></html>

View File

@@ -23,12 +23,6 @@ Classes</h3>
Functions</h3> Functions</h3>
<table> <table>
<tr> <tr>
<td><a style="color:#0000FF" href="#_setuprt">_setuprt</a></td>
<td>Konfiguriert Programm fuer den RT-Scheduler.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#_zeroprocimg">_zeroprocimg</a></td>
<td>Setzt Prozessabbild auf NULL.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#cleanup">cleanup</a></td> <td><a style="color:#0000FF" href="#cleanup">cleanup</a></td>
<td>Clean up program.</td> <td>Clean up program.</td>
</tr><tr> </tr><tr>
@@ -37,32 +31,6 @@ Functions</h3>
</tr> </tr>
</table> </table>
<hr /><hr /> <hr /><hr />
<a NAME="_setuprt" ID="_setuprt"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_setuprt</h2>
<b>_setuprt</b>(<i>pid, evt_exit</i>)
<p>
Konfiguriert Programm fuer den RT-Scheduler.
</p><dl>
<dt><i>pid</i></dt>
<dd>
PID, der angehoben werden soll
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="_zeroprocimg" ID="_zeroprocimg"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_zeroprocimg</h2>
<b>_zeroprocimg</b>(<i></i>)
<p>
Setzt Prozessabbild auf NULL.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="cleanup" ID="cleanup"></a> <a NAME="cleanup" ID="cleanup"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">cleanup</h2> <h2 style="background-color:#FFFFFF;color:#0000FF">cleanup</h2>
<b>cleanup</b>(<i></i>) <b>cleanup</b>(<i></i>)

View File

@@ -45,13 +45,7 @@ Classes</h3>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3> Functions</h3>
<table> <table>
<tr> <tr><td>None</td></tr>
<td><a style="color:#0000FF" href="#_ipmatch">_ipmatch</a></td>
<td>Prueft IP gegen ACL List und gibt ACL aus.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#refullmatch">refullmatch</a></td>
<td>re.fullmatch wegen alter python version aus wheezy nachgebaut.</td>
</tr>
</table> </table>
<hr /><hr /> <hr /><hr />
<a NAME="RevPiPyLoad" ID="RevPiPyLoad"></a> <a NAME="RevPiPyLoad" ID="RevPiPyLoad"></a>
@@ -505,47 +499,5 @@ Statuscode:
</dd> </dd>
</dl> </dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div> <div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="_ipmatch" ID="_ipmatch"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_ipmatch</h2>
<b>_ipmatch</b>(<i>ipaddress, dict_acl</i>)
<p>
Prueft IP gegen ACL List und gibt ACL aus.
</p><dl>
<dt><i>ipaddress</i></dt>
<dd>
zum pruefen
</dd><dt><i>dict_acl</i></dt>
<dd>
ACL Dict gegen die IP zu pruefen ist
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
int() ACL Wert oder -1 wenn nicht gefunden
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="refullmatch" ID="refullmatch"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">refullmatch</h2>
<b>refullmatch</b>(<i>regex, string</i>)
<p>
re.fullmatch wegen alter python version aus wheezy nachgebaut.
</p><dl>
<dt><i>regex</i></dt>
<dd>
RegEx Statement
</dd><dt><i>string</i></dt>
<dd>
Zeichenfolge gegen die getestet wird
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
True, wenn komplett passt sonst False
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /> <hr />
</body></html> </body></html>

151
doc/xrpcserver.html Normal file
View File

@@ -0,0 +1,151 @@
<!DOCTYPE html>
<html><head>
<title>xrpcserver</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">
xrpcserver</h1>
<p>
XML-RPC Server anpassungen fuer Absicherung.
</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="#SaveXMLRPCRequestHandler">SaveXMLRPCRequestHandler</a></td>
<td>Verwaltet die XML-Requests und prueft Berechtigungen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#SaveXMLRPCServer">SaveXMLRPCServer</a></td>
<td>Erstellt einen erweiterten XMLRPCServer.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="SaveXMLRPCRequestHandler" ID="SaveXMLRPCRequestHandler"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">SaveXMLRPCRequestHandler</h2>
<p>
Verwaltet die XML-Requests und prueft Berechtigungen.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
SimpleXMLRPCRequestHandler
<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="#SaveXMLRPCRequestHandler.parse_request">parse_request</a></td>
<td>Berechtigungen pruefen.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="SaveXMLRPCRequestHandler.parse_request" ID="SaveXMLRPCRequestHandler.parse_request"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
SaveXMLRPCRequestHandler.parse_request</h3>
<b>parse_request</b>(<i></i>)
<p>
Berechtigungen pruefen.
</p><dl>
<dt>Returns:</dt>
<dd>
True, wenn Parsen erfolgreich war
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="SaveXMLRPCServer" ID="SaveXMLRPCServer"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">SaveXMLRPCServer</h2>
<p>
Erstellt einen erweiterten XMLRPCServer.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
SimpleXMLRPCServer
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>aclmgr</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="#SaveXMLRPCServer.__init__">SaveXMLRPCServer</a></td>
<td>Init SaveXMLRPCServer class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#SaveXMLRPCServer.isAlive">isAlive</a></td>
<td>Prueft ob der XML RPC Server laeuft.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#SaveXMLRPCServer.start">start</a></td>
<td>Startet den XML-RPC Server.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#SaveXMLRPCServer.stop">stop</a></td>
<td>Stoppt den XML-RPC Server.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="SaveXMLRPCServer.__init__" ID="SaveXMLRPCServer.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
SaveXMLRPCServer (Constructor)</h3>
<b>SaveXMLRPCServer</b>(<i>addr, logRequests=True, allow_none=False, use_builtin_types=False, acl=""</i>)
<p>
Init SaveXMLRPCServer class.
</p><a NAME="SaveXMLRPCServer.isAlive" ID="SaveXMLRPCServer.isAlive"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
SaveXMLRPCServer.isAlive</h3>
<b>isAlive</b>(<i></i>)
<p>
Prueft ob der XML RPC Server laeuft.
</p><dl>
<dt>Returns:</dt>
<dd>
True, wenn Server noch laeuft
</dd>
</dl><a NAME="SaveXMLRPCServer.start" ID="SaveXMLRPCServer.start"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
SaveXMLRPCServer.start</h3>
<b>start</b>(<i></i>)
<p>
Startet den XML-RPC Server.
</p><a NAME="SaveXMLRPCServer.stop" ID="SaveXMLRPCServer.stop"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
SaveXMLRPCServer.stop</h3>
<b>stop</b>(<i></i>)
<p>
Stoppt den XML-RPC Server.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,3 +1,13 @@
helper.IpAclManager.__get_acl?6()
helper.IpAclManager.__refullmatch?6(regex, string)
helper.IpAclManager.__set_acl?6(value)
helper.IpAclManager.acl?7
helper.IpAclManager.get_acllevel?4(ipaddress)
helper.IpAclManager?1(acl=None, minlevel=0, maxlevel=1)
helper._ipmatch?5(ipaddress, dict_acl)
helper._setuprt?5(pid, evt_exit)
helper._zeroprocimg?5()
helper.refullmatch?4(regex, string)
logsystem.LogReader.closeall?4() logsystem.LogReader.closeall?4()
logsystem.LogReader.load_applog?4(start, count) logsystem.LogReader.load_applog?4(start, count)
logsystem.LogReader.load_plclog?4(start, count) logsystem.LogReader.load_plclog?4(start, count)
@@ -31,8 +41,6 @@ procimgserver.ProcimgServer.start?4()
procimgserver.ProcimgServer.stop?4() procimgserver.ProcimgServer.stop?4()
procimgserver.ProcimgServer.values?4() procimgserver.ProcimgServer.values?4()
procimgserver.ProcimgServer?1(xmlserver, aclmode) procimgserver.ProcimgServer?1(xmlserver, aclmode)
proginit._setuprt?5(pid, evt_exit)
proginit._zeroprocimg?5()
proginit.cleanup?4() proginit.cleanup?4()
proginit.configure?4() proginit.configure?4()
proginit.forked?7 proginit.forked?7
@@ -74,7 +82,11 @@ revpipyload.RevPiPyLoad.xml_reload?4()
revpipyload.RevPiPyLoad.xml_setconfig?4(dc, loadnow=False) revpipyload.RevPiPyLoad.xml_setconfig?4(dc, loadnow=False)
revpipyload.RevPiPyLoad.xml_setpictoryrsc?4(filebytes, reset=False) revpipyload.RevPiPyLoad.xml_setpictoryrsc?4(filebytes, reset=False)
revpipyload.RevPiPyLoad?1() revpipyload.RevPiPyLoad?1()
revpipyload._ipmatch?5(ipaddress, dict_acl)
revpipyload.pyloadversion?7 revpipyload.pyloadversion?7
revpipyload.re_ipacl?7 revpipyload.re_ipacl?7
revpipyload.refullmatch?4(regex, string) xrpcserver.SaveXMLRPCRequestHandler.parse_request?4()
xrpcserver.SaveXMLRPCServer.aclmgr?7
xrpcserver.SaveXMLRPCServer.isAlive?4()
xrpcserver.SaveXMLRPCServer.start?4()
xrpcserver.SaveXMLRPCServer.stop?4()
xrpcserver.SaveXMLRPCServer?1(addr, logRequests=True, allow_none=False, use_builtin_types=False, acl="")

View File

@@ -2,3 +2,5 @@ PipeLogwriter Thread
RevPiPlc Thread RevPiPlc Thread
RevPiSlave Thread RevPiSlave Thread
RevPiSlaveDev Thread RevPiSlaveDev Thread
SaveXMLRPCRequestHandler SimpleXMLRPCRequestHandler
SaveXMLRPCServer SimpleXMLRPCServer

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: 2018-03-08, 10:30:46 --> <!-- Saved: 2018-03-08, 10:56:15 -->
<!-- Copyright (C) 2018 Sven Sager, akira@narux.de --> <!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
<Project version="5.1"> <Project version="5.1">
<Language>en_US</Language> <Language>en_US</Language>
@@ -21,8 +21,8 @@
<Source>revpipyload/logsystem.py</Source> <Source>revpipyload/logsystem.py</Source>
<Source>revpipyload/plcsystem.py</Source> <Source>revpipyload/plcsystem.py</Source>
<Source>revpipyload/picontrolserver.py</Source> <Source>revpipyload/picontrolserver.py</Source>
<Source>revpipyload/xmlinterface.py</Source>
<Source>revpipyload/helper.py</Source> <Source>revpipyload/helper.py</Source>
<Source>revpipyload/xrpcserver.py</Source>
</Sources> </Sources>
<Forms/> <Forms/>
<Translations/> <Translations/>

View File

@@ -12,6 +12,72 @@ from re import match as rematch
from subprocess import Popen, PIPE from subprocess import Popen, PIPE
class IpAclManager():
"""Verwaltung fuer IP Adressen und deren ACL Level."""
def __init__(self, acl=None, minlevel=0, maxlevel=1):
"""Init IpAclManager class.
@param acl ACL Liste fuer Berechtigungen als <class 'str'>"""
if minlevel >= maxlevel:
raise ValueError("minlevel is smaller or equal than maxlevel")
self.__dict_acl = {}
self.__rawacl = ""
self.__re_ipacl = "(([\\d\\*]{1,3}\\.){3}[\\d\\*]{1,3},[" \
+ str(minlevel) + "-" + str(maxlevel) + "] ?)*"
# Liste erstellen, wenn übergeben
if acl is not None:
self.__set_acl(acl)
def __get_acl(self):
"""Getter fuer den rohen ACL-String.
return ACLs als <class 'str'>"""
return self.__rawacl
def __refullmatch(self, regex, string):
"""re.fullmatch wegen alter python version aus wheezy nachgebaut.
@param regex RegEx Statement
@param string Zeichenfolge gegen die getestet wird
@return True, wenn komplett passt sonst False
"""
m = rematch(regex, string)
return m is not None and m.end() == len(string)
def __set_acl(self, value):
"""Uebernimmt neue ACL-Liste fuer die Ausertung der Level.
@param value Neue ACL-Liste als <class 'str'>"""
if type(value) != str:
raise ValueError("parameter acl must be <class 'str'>")
if not self.__refullmatch(self.__re_ipacl, value):
raise ValueError("acl format ist not okay - 1.2.3.4,0 5.6.7.8,1")
# Klassenwerte übernehmen
self.__dict_acl = {}
self.__rawacl = value
# Liste neu füllen mit regex Strings
for ip_level in value.split():
ip, level = ip_level.split(",", 1)
ip = ip.replace(".", "\\.").replace("*", "\\d{1,3}")
self.__dict_acl[ip] = int(level)
def get_acllevel(self, ipaddress):
"""Prueft IP gegen ACL List und gibt ACL-Wert aus.
@param ipaddress zum pruefen
@return int() ACL Wert oder -1 wenn nicht gefunden"""
for aclip in sorted(self.__dict_acl, reverse=True):
if self.__refullmatch(aclip, ipaddress):
return self.__dict_acl[aclip]
return -1
acl = property(__get_acl, __set_acl)
def _ipmatch(ipaddress, dict_acl): def _ipmatch(ipaddress, dict_acl):
"""Prueft IP gegen ACL List und gibt ACL aus. """Prueft IP gegen ACL List und gibt ACL aus.

View File

@@ -39,7 +39,6 @@ import os
import signal import signal
import tarfile import tarfile
import zipfile import zipfile
from concurrent import futures
from configparser import ConfigParser from configparser import ConfigParser
from helper import refullmatch from helper import refullmatch
from json import loads as jloads from json import loads as jloads
@@ -48,7 +47,7 @@ from tempfile import mkstemp
from threading import Event from threading import Event
from time import asctime from time import asctime
from xmlrpc.client import Binary from xmlrpc.client import Binary
from xmlrpc.server import SimpleXMLRPCServer from xrpcserver import SaveXMLRPCServer
pyloadversion = "0.6.0" pyloadversion = "0.6.0"
re_ipacl = "(([\\d\\*]{1,3}\\.){3}[\\d\\*]{1,3},[0-1] ?)*" re_ipacl = "(([\\d\\*]{1,3}\\.){3}[\\d\\*]{1,3},[0-1] ?)*"
@@ -76,7 +75,6 @@ class RevPiPyLoad():
self.plc = None self.plc = None
self.plc_pause = False self.plc_pause = False
self.tfile = {} self.tfile = {}
self.tpe = None
self.xsrv = None self.xsrv = None
self.xml_ps = None self.xml_ps = None
@@ -172,13 +170,14 @@ class RevPiPyLoad():
# XMLRPC-Server Instantiieren und konfigurieren # XMLRPC-Server Instantiieren und konfigurieren
if self.xmlrpc >= 1: if self.xmlrpc >= 1:
proginit.logger.debug("create xmlrpc server") proginit.logger.debug("create xmlrpc server")
self.xsrv = SimpleXMLRPCServer( self.xsrv = SaveXMLRPCServer(
( (
"", "",
int(self.globalconfig["DEFAULT"].get("xmlrpcport", 55123)) int(self.globalconfig["DEFAULT"].get("xmlrpcport", 55123))
), ),
logRequests=False, logRequests=False,
allow_none=True allow_none=True,
acl=self.xmlrpcacl
) )
self.xsrv.register_introspection_functions() self.xsrv.register_introspection_functions()
self.xsrv.register_multicall_functions() self.xsrv.register_multicall_functions()
@@ -387,8 +386,7 @@ class RevPiPyLoad():
if self.xmlrpc >= 1: if self.xmlrpc >= 1:
proginit.logger.info("start xmlrpc-server") proginit.logger.info("start xmlrpc-server")
self.tpe = futures.ThreadPoolExecutor(max_workers=1) self.xsrv.start()
self.tpe.submit(self.xsrv.serve_forever)
if self.plcslave: if self.plcslave:
# Slaveausfuehrung übergeben # Slaveausfuehrung übergeben
@@ -450,9 +448,7 @@ class RevPiPyLoad():
if self.xmlrpc >= 1: if self.xmlrpc >= 1:
proginit.logger.info("shutting down xmlrpc-server") proginit.logger.info("shutting down xmlrpc-server")
self.xsrv.shutdown() self.xsrv.stop()
self.tpe.shutdown()
self.xsrv.server_close()
# Logreader schließen # Logreader schließen
self.logr.closeall() self.logr.closeall()

88
revpipyload/xrpcserver.py Normal file
View File

@@ -0,0 +1,88 @@
# -*- coding: utf-8 -*-
#
# RevPiPyLoad
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
"""XML-RPC Server anpassungen fuer Absicherung."""
from helper import IpAclManager
from concurrent import futures
from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
class SaveXMLRPCServer(SimpleXMLRPCServer):
"""Erstellt einen erweiterten XMLRPCServer."""
aclmgr = IpAclManager()
def __init__(
self, addr, logRequests=True, allow_none=False,
use_builtin_types=False, acl=""):
"""Init SaveXMLRPCServer class."""
SaveXMLRPCServer.aclmgr.acl = acl
# Vererbte Klasse instantiieren
super().__init__(
addr=addr,
requestHandler=SaveXMLRPCRequestHandler,
logRequests=logRequests,
allow_none=allow_none,
encoding="utf-8",
bind_and_activate=False,
use_builtin_types=use_builtin_types
)
# Klassenvariablen
self.tpe = futures.ThreadPoolExecutor(max_workers=1)
self.fut = None
def isAlive(self):
"""Prueft ob der XML RPC Server laeuft.
@return True, wenn Server noch laeuft"""
return False if self.fut is None else self.fut.running()
def start(self):
"""Startet den XML-RPC Server."""
if self.fut is None:
self.server_bind()
self.server_activate()
self.fut = self.tpe.submit(self.serve_forever)
else:
raise RuntimeError("savexmlrpcservers can only be started once")
def stop(self):
"""Stoppt den XML-RPC Server."""
if self.fut is not None:
self.shutdown()
self.tpe.shutdown()
self.server_close()
else:
raise RuntimeError("save xml rpc server was not started")
class SaveXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
"""Verwaltet die XML-Requests und prueft Berechtigungen."""
def parse_request(self):
"""Berechtigungen pruefen.
@return True, wenn Parsen erfolgreich war"""
# Request parsen und ggf. schon abbrechen
if not super().parse_request():
return False
# IP-Adresse prüfen
int_acl = SaveXMLRPCServer.aclmgr.get_acllevel(self.address_string())
if int_acl >= 0:
return True
else:
self.send_error(
401,
"IP '{}' not allowed with acl level '{}'"
"".format(self.address_string(), int_acl)
)
return False