mirror of
https://github.com/naruxde/revpipycontrol.git
synced 2025-11-08 15:43:52 +01:00
AclManger angepasst, wenn zu leer hinzugef?gt wird
AclManager springt bei IP Eingabe weiter und zur?ck IpAclManager ausgelagert in shared shared ?bernehmen (setup.py) Anzeigelevel angepasst Einstellungen werden ?bertragen, da RevPiPyLoad diese dynamisch verarbeitet Codestyle
This commit is contained in:
@@ -18,9 +18,6 @@ Classes</h3>
|
||||
<tr>
|
||||
<td><a style="color:#0000FF" href="#AclManager">AclManager</a></td>
|
||||
<td>Hauptfenster des ACL-Managers.</td>
|
||||
</tr><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">
|
||||
@@ -66,9 +63,15 @@ Methods</h3>
|
||||
<td><a style="color:#0000FF" href="#AclManager._changesdone">_changesdone</a></td>
|
||||
<td>Prüft ob sich die Einstellungen geändert haben.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#AclManager._checkback">_checkback</a></td>
|
||||
<td>Springt bei Backspace in vorheriges Feld.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#AclManager._checkclose">_checkclose</a></td>
|
||||
<td>Prüft ob Fenster beendet werden soll.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#AclManager._checkdot">_checkdot</a></td>
|
||||
<td>Prüft auf .</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#AclManager._clearfields">_clearfields</a></td>
|
||||
<td>Leert die Eingabefelder.</td>
|
||||
</tr><tr>
|
||||
@@ -149,6 +152,23 @@ Prüft ob sich die Einstellungen geändert haben.
|
||||
<dd>
|
||||
True, wenn min. eine Einstellung geändert wurde
|
||||
</dd>
|
||||
</dl><a NAME="AclManager._checkback" ID="AclManager._checkback"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
AclManager._checkback</h3>
|
||||
<b>_checkback</b>(<i>event, tkvar, pretxt</i>)
|
||||
<p>
|
||||
Springt bei Backspace in vorheriges Feld.
|
||||
</p><dl>
|
||||
<dt><i>event</i></dt>
|
||||
<dd>
|
||||
TK Event
|
||||
</dd><dt><i>tkvar</i></dt>
|
||||
<dd>
|
||||
TK Variable zum prüfen
|
||||
</dd><dt><i>nexttxt</i></dt>
|
||||
<dd>
|
||||
Vorheriges IP Feld für Fokus
|
||||
</dd>
|
||||
</dl><a NAME="AclManager._checkclose" ID="AclManager._checkclose"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
AclManager._checkclose</h3>
|
||||
@@ -160,6 +180,23 @@ Prüft ob Fenster beendet werden soll.
|
||||
<dd>
|
||||
tkinter-Event
|
||||
</dd>
|
||||
</dl><a NAME="AclManager._checkdot" ID="AclManager._checkdot"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
AclManager._checkdot</h3>
|
||||
<b>_checkdot</b>(<i>event, tkvar, nexttxt</i>)
|
||||
<p>
|
||||
Prüft auf . und geht weiter.
|
||||
</p><dl>
|
||||
<dt><i>event</i></dt>
|
||||
<dd>
|
||||
TK Event
|
||||
</dd><dt><i>tkvar</i></dt>
|
||||
<dd>
|
||||
TK Variable zum prüfen
|
||||
</dd><dt><i>nexttxt</i></dt>
|
||||
<dd>
|
||||
Nächstes IP Feld für Fokus
|
||||
</dd>
|
||||
</dl><a NAME="AclManager._clearfields" ID="AclManager._clearfields"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
AclManager._clearfields</h3>
|
||||
@@ -215,137 +252,5 @@ ACL als <class 'str'>
|
||||
</dd>
|
||||
</dl>
|
||||
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||
<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><tr><td>regex_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.__get_regex_acl">__get_regex_acl</a></td>
|
||||
<td>Gibt formatierten RegEx-String zurueck.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#IpAclManager.__iter__">__iter__</a></td>
|
||||
<td>Gibt einzelne ACLs als <class 'tuple'> aus.</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><tr>
|
||||
<td><a style="color:#0000FF" href="#IpAclManager.loadacl">loadacl</a></td>
|
||||
<td>Laed ACL String und gibt erfolg zurueck.</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>minlevel, maxlevel, acl=None</i>)
|
||||
<p>
|
||||
Init IpAclManager class.
|
||||
</p><dl>
|
||||
<dt><i>minlevel</i></dt>
|
||||
<dd>
|
||||
Smallest access level (min. 0)
|
||||
</dd><dt><i>maxlevel</i></dt>
|
||||
<dd>
|
||||
Biggest access level (max. 9)
|
||||
</dd><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.__get_regex_acl" ID="IpAclManager.__get_regex_acl"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
IpAclManager.__get_regex_acl</h3>
|
||||
<b>__get_regex_acl</b>(<i></i>)
|
||||
<p>
|
||||
Gibt formatierten RegEx-String zurueck.
|
||||
return RegEx Code als <class 'str'>
|
||||
</p><a NAME="IpAclManager.__iter__" ID="IpAclManager.__iter__"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
IpAclManager.__iter__</h3>
|
||||
<b>__iter__</b>(<i></i>)
|
||||
<p>
|
||||
Gibt einzelne ACLs als <class 'tuple'> aus.
|
||||
</p><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>
|
||||
<class 'int'> ACL Wert oder -1 wenn nicht gefunden
|
||||
</dd>
|
||||
</dl><a NAME="IpAclManager.loadacl" ID="IpAclManager.loadacl"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
IpAclManager.loadacl</h3>
|
||||
<b>loadacl</b>(<i>str_acl</i>)
|
||||
<p>
|
||||
Laed ACL String und gibt erfolg zurueck.
|
||||
</p><dl>
|
||||
<dt><i>str_acl</i></dt>
|
||||
<dd>
|
||||
ACL als <class 'str'>
|
||||
</dd>
|
||||
</dl><dl>
|
||||
<dt>Returns:</dt>
|
||||
<dd>
|
||||
True, wenn erfolgreich uebernommen
|
||||
</dd>
|
||||
</dl>
|
||||
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||
<hr />
|
||||
</body></html>
|
||||
20
doc/index-revpipycontrol.shared.html
Normal file
20
doc/index-revpipycontrol.shared.html
Normal file
@@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head>
|
||||
<title>revpipycontrol.shared</title>
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
<body style="background-color:#FFFFFF;color:#000000">
|
||||
<h1 style="background-color:#FFFFFF;color:#0000FF">
|
||||
revpipycontrol.shared</h1>
|
||||
|
||||
|
||||
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
Modules</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<td><a style="color:#0000FF" href="revpipycontrol.shared.ipaclmanager.html">ipaclmanager</a></td>
|
||||
<td>Verwaltet IP Adressen und deren ACLs.</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body></html>
|
||||
@@ -8,6 +8,14 @@
|
||||
Table of contents</h1>
|
||||
|
||||
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
Packages</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<td><a style="color:#0000FF" href="index-revpipycontrol.shared.html">shared</a></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
Modules</h3>
|
||||
|
||||
239
doc/revpipycontrol.shared.ipaclmanager.html
Normal file
239
doc/revpipycontrol.shared.ipaclmanager.html
Normal file
@@ -0,0 +1,239 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head>
|
||||
<title>revpipycontrol.shared.ipaclmanager</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">
|
||||
revpipycontrol.shared.ipaclmanager</h1>
|
||||
<p>
|
||||
Verwaltet IP Adressen und deren ACLs.
|
||||
</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="#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><tr><td>filename</td></tr><tr><td>regex_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.__get_filename">__get_filename</a></td>
|
||||
<td>Getter fuer Dateinamen.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#IpAclManager.__get_regex_acl">__get_regex_acl</a></td>
|
||||
<td>Gibt formatierten RegEx-String zurueck.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#IpAclManager.__iter__">__iter__</a></td>
|
||||
<td>Gibt einzelne ACLs als <class 'tuple'> aus.</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><tr>
|
||||
<td><a style="color:#0000FF" href="#IpAclManager.loadacl">loadacl</a></td>
|
||||
<td>Laed ACL String und gibt erfolg zurueck.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#IpAclManager.loadaclfile">loadaclfile</a></td>
|
||||
<td>Laed ACL Definitionen aus Datei.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#IpAclManager.writeaclfile">writeaclfile</a></td>
|
||||
<td>Schreibt ACL Definitionen in Datei.</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>minlevel, maxlevel, acl=None</i>)
|
||||
<p>
|
||||
Init IpAclManager class.
|
||||
</p><dl>
|
||||
<dt><i>minlevel</i></dt>
|
||||
<dd>
|
||||
Smallest access level (min. 0)
|
||||
</dd><dt><i>maxlevel</i></dt>
|
||||
<dd>
|
||||
Biggest access level (max. 9)
|
||||
</dd><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.__get_filename" ID="IpAclManager.__get_filename"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
IpAclManager.__get_filename</h3>
|
||||
<b>__get_filename</b>(<i></i>)
|
||||
<p>
|
||||
Getter fuer Dateinamen.
|
||||
</p><dl>
|
||||
<dt>Returns:</dt>
|
||||
<dd>
|
||||
Filename der ACL <class 'str'>
|
||||
</dd>
|
||||
</dl><a NAME="IpAclManager.__get_regex_acl" ID="IpAclManager.__get_regex_acl"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
IpAclManager.__get_regex_acl</h3>
|
||||
<b>__get_regex_acl</b>(<i></i>)
|
||||
<p>
|
||||
Gibt formatierten RegEx-String zurueck.
|
||||
return RegEx Code als <class 'str'>
|
||||
</p><a NAME="IpAclManager.__iter__" ID="IpAclManager.__iter__"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
IpAclManager.__iter__</h3>
|
||||
<b>__iter__</b>(<i></i>)
|
||||
<p>
|
||||
Gibt einzelne ACLs als <class 'tuple'> aus.
|
||||
</p><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>
|
||||
<class 'int'> ACL Wert oder -1 wenn nicht gefunden
|
||||
</dd>
|
||||
</dl><a NAME="IpAclManager.loadacl" ID="IpAclManager.loadacl"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
IpAclManager.loadacl</h3>
|
||||
<b>loadacl</b>(<i>str_acl</i>)
|
||||
<p>
|
||||
Laed ACL String und gibt erfolg zurueck.
|
||||
</p><dl>
|
||||
<dt><i>str_acl</i></dt>
|
||||
<dd>
|
||||
ACL als <class 'str'>
|
||||
</dd>
|
||||
</dl><dl>
|
||||
<dt>Returns:</dt>
|
||||
<dd>
|
||||
True, wenn erfolgreich uebernommen
|
||||
</dd>
|
||||
</dl><a NAME="IpAclManager.loadaclfile" ID="IpAclManager.loadaclfile"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
IpAclManager.loadaclfile</h3>
|
||||
<b>loadaclfile</b>(<i>filename</i>)
|
||||
<p>
|
||||
Laed ACL Definitionen aus Datei.
|
||||
</p><dl>
|
||||
<dt><i>filename</i></dt>
|
||||
<dd>
|
||||
Dateiname fuer Definitionen
|
||||
</dd>
|
||||
</dl><dl>
|
||||
<dt>Returns:</dt>
|
||||
<dd>
|
||||
True, wenn Laden erfolgreich war
|
||||
</dd>
|
||||
</dl><a NAME="IpAclManager.writeaclfile" ID="IpAclManager.writeaclfile"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
IpAclManager.writeaclfile</h3>
|
||||
<b>writeaclfile</b>(<i>filename=None, aclname=None</i>)
|
||||
<p>
|
||||
Schreibt ACL Definitionen in Datei.
|
||||
</p><dl>
|
||||
<dt><i>filename</i></dt>
|
||||
<dd>
|
||||
Dateiname fuer Definitionen
|
||||
</dd>
|
||||
</dl><dl>
|
||||
<dt>Returns:</dt>
|
||||
<dd>
|
||||
True, wenn Schreiben erfolgreich war
|
||||
</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 />
|
||||
</body></html>
|
||||
@@ -2,7 +2,9 @@ aclmanager.AclManager.__get_acltext?6()
|
||||
aclmanager.AclManager.__set_acltext?6(value)
|
||||
aclmanager.AclManager._ask_delete?5()
|
||||
aclmanager.AclManager._changesdone?5()
|
||||
aclmanager.AclManager._checkback?5(event, tkvar, pretxt)
|
||||
aclmanager.AclManager._checkclose?5(event=None)
|
||||
aclmanager.AclManager._checkdot?5(event, tkvar, nexttxt)
|
||||
aclmanager.AclManager._clearfields?5()
|
||||
aclmanager.AclManager._createwidgets?5()
|
||||
aclmanager.AclManager._loadfields?5()
|
||||
@@ -15,15 +17,6 @@ aclmanager.AclManager.acltext?7
|
||||
aclmanager.AclManager.get_acl?4()
|
||||
aclmanager.AclManager.root?7
|
||||
aclmanager.AclManager?1(master, minlevel, maxlevel, acl_str="", readonly=False)
|
||||
aclmanager.IpAclManager.__get_acl?6()
|
||||
aclmanager.IpAclManager.__get_regex_acl?6()
|
||||
aclmanager.IpAclManager.__iter__?6()
|
||||
aclmanager.IpAclManager.__set_acl?6(value)
|
||||
aclmanager.IpAclManager.acl?7
|
||||
aclmanager.IpAclManager.get_acllevel?4(ipaddress)
|
||||
aclmanager.IpAclManager.loadacl?4(str_acl)
|
||||
aclmanager.IpAclManager.regex_acl?7
|
||||
aclmanager.IpAclManager?1(minlevel, maxlevel, acl=None)
|
||||
aclmanager._?8
|
||||
mytools.addroot?4(filename)
|
||||
mytools.gettrans?4(proglang=None)
|
||||
@@ -141,3 +134,17 @@ revpipycontrol.RevPiPyControl.visitwebsite?4()
|
||||
revpipycontrol.RevPiPyControl?1(master=None)
|
||||
revpipycontrol._?8
|
||||
revpipycontrol.pycontrolversion?7
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_acl?6()
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_filename?6()
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_regex_acl?6()
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.__iter__?6()
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.__set_acl?6(value)
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.acl?7
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.filename?7
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.get_acllevel?4(ipaddress)
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.loadacl?4(str_acl)
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.loadaclfile?4(filename)
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.regex_acl?7
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager.writeaclfile?4(filename=None, aclname=None)
|
||||
revpipycontrol.shared.ipaclmanager.IpAclManager?1(minlevel, maxlevel, acl=None)
|
||||
revpipycontrol.shared.ipaclmanager.refullmatch?4(regex, string)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
|
||||
<!-- eric project file for project revpipycontrol -->
|
||||
<!-- Saved: 2018-04-03, 12:04:56 -->
|
||||
<!-- Saved: 2018-04-04, 15:41:50 -->
|
||||
<!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
|
||||
<Project version="5.1">
|
||||
<Language>en_US</Language>
|
||||
@@ -25,6 +25,8 @@
|
||||
<Source>revpipycontrol/revpiinfo.py</Source>
|
||||
<Source>revpipycontrol/aclmanager.py</Source>
|
||||
<Source>revpipycontrol/revpilegacy.py</Source>
|
||||
<Source>revpipycontrol/shared/ipaclmanager.py</Source>
|
||||
<Source>revpipycontrol/shared/__init__.py</Source>
|
||||
</Sources>
|
||||
<Forms/>
|
||||
<Translations/>
|
||||
|
||||
@@ -9,117 +9,13 @@ u"""Manager für ACL Einträge."""
|
||||
import tkinter
|
||||
import tkinter.messagebox as tkmsg
|
||||
from mytools import gettrans
|
||||
from re import fullmatch
|
||||
from shared.ipaclmanager import IpAclManager
|
||||
from tkinter import ttk
|
||||
|
||||
# Übersetzung laden
|
||||
_ = gettrans()
|
||||
|
||||
|
||||
class IpAclManager():
|
||||
|
||||
"""Verwaltung fuer IP Adressen und deren ACL Level."""
|
||||
|
||||
def __init__(self, minlevel, maxlevel, acl=None):
|
||||
"""Init IpAclManager class.
|
||||
|
||||
@param minlevel Smallest access level (min. 0)
|
||||
@param maxlevel Biggest access level (max. 9)
|
||||
@param acl ACL Liste fuer Berechtigungen als <class 'str'>
|
||||
|
||||
"""
|
||||
if type(minlevel) != int:
|
||||
raise ValueError("parameter minlevel must be <class 'int'>")
|
||||
if type(maxlevel) != int:
|
||||
raise ValueError("parameter maxlevel must be <class 'int'>")
|
||||
if minlevel < 0:
|
||||
raise ValueError("minlevel must be 0 or more")
|
||||
if maxlevel > 9:
|
||||
raise ValueError("maxlevel maximum is 9")
|
||||
if minlevel > maxlevel:
|
||||
raise ValueError("minlevel is smaller than maxlevel")
|
||||
|
||||
self.__dict_acl = {}
|
||||
self.__dict_regex = {}
|
||||
self.__dict_knownips = {}
|
||||
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 __iter__(self):
|
||||
"""Gibt einzelne ACLs als <class 'tuple'> aus."""
|
||||
for aclip in sorted(self.__dict_acl):
|
||||
yield (aclip, self.__dict_acl[aclip])
|
||||
|
||||
def __get_acl(self):
|
||||
"""Getter fuer den rohen ACL-String.
|
||||
return ACLs als <class 'str'>"""
|
||||
str_acl = ""
|
||||
for aclip in sorted(self.__dict_acl):
|
||||
str_acl += "{},{} ".format(aclip, self.__dict_acl[aclip])
|
||||
return str_acl.strip()
|
||||
|
||||
def __get_regex_acl(self):
|
||||
"""Gibt formatierten RegEx-String zurueck.
|
||||
return RegEx Code als <class 'str'>"""
|
||||
return self.__re_ipacl
|
||||
|
||||
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'>")
|
||||
|
||||
value = value.strip()
|
||||
if fullmatch(self.__re_ipacl, value) is None:
|
||||
raise ValueError("acl format ist not okay - 1.2.3.4,0 5.6.7.8,1")
|
||||
|
||||
# Klassenwerte übernehmen
|
||||
self.__dict_acl = {}
|
||||
self.__dict_regex = {}
|
||||
self.__dict_knownips = {}
|
||||
|
||||
# Liste neu füllen mit regex Strings
|
||||
for ip_level in value.split():
|
||||
ip, level = ip_level.split(",", 1)
|
||||
self.__dict_acl[ip] = int(level)
|
||||
self.__dict_regex[ip] = \
|
||||
ip.replace(".", "\\.").replace("*", "\\d{1,3}")
|
||||
|
||||
def get_acllevel(self, ipaddress):
|
||||
"""Prueft IP gegen ACL List und gibt ACL-Wert aus.
|
||||
@param ipaddress zum pruefen
|
||||
@return <class 'int'> ACL Wert oder -1 wenn nicht gefunden"""
|
||||
# Bei bereits aufgelösten IPs direkt ACL auswerten
|
||||
if ipaddress in self.__dict_knownips:
|
||||
return self.__dict_knownips[ipaddress]
|
||||
|
||||
for aclip in sorted(self.__dict_acl, reverse=True):
|
||||
if fullmatch(self.__dict_regex[aclip], ipaddress) is not None:
|
||||
# IP und Level merken
|
||||
self.__dict_knownips[ipaddress] = self.__dict_acl[aclip]
|
||||
|
||||
# Level zurückgeben
|
||||
return self.__dict_acl[aclip]
|
||||
|
||||
return -1
|
||||
|
||||
def loadacl(self, str_acl):
|
||||
"""Laed ACL String und gibt erfolg zurueck.
|
||||
@param str_acl ACL als <class 'str'>
|
||||
@return True, wenn erfolgreich uebernommen"""
|
||||
if fullmatch(self.__re_ipacl, str_acl) is None:
|
||||
return False
|
||||
self.__set_acl(str_acl)
|
||||
return True
|
||||
|
||||
acl = property(__get_acl, __set_acl)
|
||||
regex_acl = property(__get_regex_acl)
|
||||
|
||||
|
||||
class AclManager(ttk.Frame):
|
||||
|
||||
u"""Hauptfenster des ACL-Managers."""
|
||||
@@ -258,22 +154,68 @@ class AclManager(ttk.Frame):
|
||||
self.var_ip4 = tkinter.StringVar(frame)
|
||||
self.var_acl = tkinter.StringVar(frame, self.minlevel)
|
||||
|
||||
ip_block = ttk.Entry(frame, width=4)
|
||||
ip_block["state"] = self.__ro
|
||||
ip_block["textvariable"] = self.var_ip1
|
||||
ip_block.grid(row=row, column=1)
|
||||
ip_block = ttk.Entry(frame, width=4)
|
||||
ip_block["state"] = self.__ro
|
||||
ip_block["textvariable"] = self.var_ip2
|
||||
ip_block.grid(row=row, column=3)
|
||||
ip_block = ttk.Entry(frame, width=4)
|
||||
ip_block["state"] = self.__ro
|
||||
ip_block["textvariable"] = self.var_ip3
|
||||
ip_block.grid(row=row, column=5)
|
||||
ip_block = ttk.Entry(frame, width=4)
|
||||
ip_block["state"] = self.__ro
|
||||
ip_block["textvariable"] = self.var_ip4
|
||||
ip_block.grid(row=row, column=7)
|
||||
ip_block1 = ttk.Entry(frame, width=4)
|
||||
ip_block2 = ttk.Entry(frame, width=4)
|
||||
ip_block3 = ttk.Entry(frame, width=4)
|
||||
ip_block4 = ttk.Entry(frame, width=4)
|
||||
|
||||
ip_block1.bind(
|
||||
"<KeyRelease>",
|
||||
lambda event, tkvar=self.var_ip1: self._checkdot(
|
||||
event, tkvar, ip_block2
|
||||
)
|
||||
)
|
||||
ip_block1["state"] = self.__ro
|
||||
ip_block1["textvariable"] = self.var_ip1
|
||||
ip_block1.grid(row=row, column=1)
|
||||
|
||||
ip_block2.bind(
|
||||
"<KeyRelease>",
|
||||
lambda event, tkvar=self.var_ip2: self._checkdot(
|
||||
event, tkvar, ip_block3
|
||||
)
|
||||
)
|
||||
ip_block2.bind(
|
||||
"<Key>",
|
||||
lambda event, tkvar=self.var_ip2: self._checkback(
|
||||
event, tkvar, ip_block1
|
||||
)
|
||||
)
|
||||
ip_block2["state"] = self.__ro
|
||||
ip_block2["textvariable"] = self.var_ip2
|
||||
ip_block2.grid(row=row, column=3)
|
||||
|
||||
ip_block3.bind(
|
||||
"<KeyRelease>",
|
||||
lambda event, tkvar=self.var_ip3: self._checkdot(
|
||||
event, tkvar, ip_block4
|
||||
)
|
||||
)
|
||||
ip_block3.bind(
|
||||
"<Key>",
|
||||
lambda event, tkvar=self.var_ip3: self._checkback(
|
||||
event, tkvar, ip_block2
|
||||
)
|
||||
)
|
||||
ip_block3["state"] = self.__ro
|
||||
ip_block3["textvariable"] = self.var_ip3
|
||||
ip_block3.grid(row=row, column=5)
|
||||
|
||||
ip_block4.bind(
|
||||
"<KeyRelease>",
|
||||
lambda event, tkvar=self.var_ip4: self._checkdot(
|
||||
event, tkvar, None
|
||||
)
|
||||
)
|
||||
ip_block4.bind(
|
||||
"<Key>",
|
||||
lambda event, tkvar=self.var_ip4: self._checkback(
|
||||
event, tkvar, ip_block3
|
||||
)
|
||||
)
|
||||
ip_block4["state"] = self.__ro
|
||||
ip_block4["textvariable"] = self.var_ip4
|
||||
ip_block4.grid(row=row, column=7)
|
||||
|
||||
# Punkte zwischen IP-Feldern
|
||||
for i in range(2, 7, 2):
|
||||
@@ -338,12 +280,44 @@ class AclManager(ttk.Frame):
|
||||
parent=self.master, default="no"
|
||||
)
|
||||
if ask:
|
||||
self.__acl.loadacl(
|
||||
self.__acl.acl.replace(
|
||||
"{},{}".format(*lst_ipacl), ""
|
||||
).replace(" ", " ")
|
||||
)
|
||||
self._refreshacls()
|
||||
new_acl = self.__acl.acl.replace(
|
||||
"{},{}".format(*lst_ipacl), ""
|
||||
).replace(" ", " ")
|
||||
|
||||
if self.__acl.loadacl(new_acl.strip()):
|
||||
# Liste neu aufbauen
|
||||
self._refreshacls()
|
||||
else:
|
||||
tkmsg.showerror(
|
||||
_("Error"),
|
||||
_("Can not delete ACL! Check format."),
|
||||
parent=self.master
|
||||
)
|
||||
|
||||
def _checkback(self, event, tkvar, pretxt):
|
||||
u"""Springt bei Backspace in vorheriges Feld.
|
||||
|
||||
@param event TK Event
|
||||
@param tkvar TK Variable zum prüfen
|
||||
@param nexttxt Vorheriges IP Feld für Fokus
|
||||
|
||||
"""
|
||||
if pretxt is not None and event.keycode == 22 and tkvar.get() == "":
|
||||
pretxt.focus_set()
|
||||
|
||||
def _checkdot(self, event, tkvar, nexttxt):
|
||||
u"""Prüft auf . und geht weiter.
|
||||
|
||||
@param event TK Event
|
||||
@param tkvar TK Variable zum prüfen
|
||||
@param nexttxt Nächstes IP Feld für Fokus
|
||||
|
||||
"""
|
||||
val = tkvar.get()
|
||||
if val.find(".") >= 0:
|
||||
tkvar.set(val[:-1])
|
||||
if nexttxt is not None:
|
||||
nexttxt.focus_set()
|
||||
|
||||
def _clearfields(self):
|
||||
u"""Leert die Eingabefelder."""
|
||||
@@ -387,7 +361,7 @@ class AclManager(ttk.Frame):
|
||||
self.var_ip4.get(),
|
||||
self.var_acl.get()
|
||||
)
|
||||
if self.__acl.loadacl(self.__acl.acl + " " + new_acl):
|
||||
if self.__acl.loadacl((self.__acl.acl + " " + new_acl).strip()):
|
||||
self._refreshacls()
|
||||
else:
|
||||
tkmsg.showerror(
|
||||
|
||||
@@ -205,7 +205,7 @@ class RevPiCheckClient(tkinter.Frame):
|
||||
|
||||
def _createwidgets(self):
|
||||
"""Erstellt den Fensterinhalt."""
|
||||
cFxPxy53 = {"fill": "x", "padx": 5, "pady": 3}
|
||||
cfxpxy53 = {"fill": "x", "padx": 5, "pady": 3}
|
||||
|
||||
devgrp = tkinter.LabelFrame(self)
|
||||
devgrp["text"] = _("Devices of RevPi")
|
||||
@@ -236,7 +236,7 @@ class RevPiCheckClient(tkinter.Frame):
|
||||
btn = tkinter.Button(devgrp)
|
||||
btn["command"] = lambda win=win: self.__showwin(win)
|
||||
btn["text"] = "{} | {}".format(dev, self.dict_devices[dev])
|
||||
btn.pack(**cFxPxy53)
|
||||
btn.pack(**cfxpxy53)
|
||||
|
||||
# Steuerungsfunktionen
|
||||
cntgrp = tkinter.LabelFrame(self)
|
||||
@@ -246,19 +246,19 @@ class RevPiCheckClient(tkinter.Frame):
|
||||
self.btn_refresh = tkinter.Button(cntgrp)
|
||||
self.btn_refresh["text"] = _("Read all IOs")
|
||||
self.btn_refresh["command"] = self.refreshvalues
|
||||
self.btn_refresh.pack(**cFxPxy53)
|
||||
self.btn_refresh.pack(**cfxpxy53)
|
||||
|
||||
self.btn_read = tkinter.Button(cntgrp)
|
||||
self.btn_read["text"] = _("Read just Inputs")
|
||||
self.btn_read["command"] = self.readvalues
|
||||
self.btn_read.pack(**cFxPxy53)
|
||||
self.btn_read.pack(**cfxpxy53)
|
||||
|
||||
self.btn_write = tkinter.Button(cntgrp)
|
||||
self.btn_write["state"] = "normal" if self.xmlmode >= 3 \
|
||||
else "disabled"
|
||||
self.btn_write["text"] = _("Write Outputs")
|
||||
self.btn_write["command"] = self.writevalues
|
||||
self.btn_write.pack(**cFxPxy53)
|
||||
self.btn_write.pack(**cfxpxy53)
|
||||
|
||||
self.chk_auto = tkinter.Checkbutton(cntgrp)
|
||||
self.chk_auto["command"] = self.toggleauto
|
||||
|
||||
@@ -293,14 +293,22 @@ class RevPiOption(tkinter.Frame):
|
||||
if not self._checkvalues():
|
||||
return None
|
||||
|
||||
ask = tkmsg.askyesnocancel(
|
||||
# ask = tkmsg.askyesnocancel(
|
||||
# _("Question"),
|
||||
# _("The settings are now saved on the Revolution Pi. \n\n"
|
||||
# "Should the new settings take effect immediately? \nThis "
|
||||
# "means a restart of the service and the PLC program!"),
|
||||
# parent=self.master
|
||||
# )
|
||||
ask = tkmsg.askokcancel(
|
||||
_("Question"),
|
||||
_("The settings are now saved on the Revolution Pi. \n\n"
|
||||
"Should the new settings take effect immediately? \nThis "
|
||||
"means a restart of the service and the PLC program!"),
|
||||
_("The settings will be set on the Revolution Pi now. \n\n"
|
||||
"If you made changes on the 'PCL Program' section, your plc "
|
||||
"program will restart! \n"
|
||||
"ACL changes and service settings are applied immediately."),
|
||||
parent=self.master
|
||||
)
|
||||
if ask is not None:
|
||||
if ask:
|
||||
self.dc["autoreload"] = int(self.var_reload.get())
|
||||
self.dc["autoreloaddelay"] = int(self.var_reload_delay.get())
|
||||
self.dc["autostart"] = int(self.var_start.get())
|
||||
|
||||
@@ -51,8 +51,7 @@ class RevPiProgram(tkinter.Frame):
|
||||
self.uploaded = False
|
||||
self.revpi = revpi
|
||||
self.xmlcli = xmlcli
|
||||
self.xmlmode = xmlmode
|
||||
self.xmlstate = "normal" if xmlmode == 3 else "disabled"
|
||||
self.xmlstate = "normal" if xmlmode >= 3 else "disabled"
|
||||
|
||||
# Letzte Einstellungen übernehmen
|
||||
self.opt = self._loaddefault()
|
||||
|
||||
@@ -326,7 +326,6 @@ class RevPiPyControl(tkinter.Frame):
|
||||
win.grab_set()
|
||||
|
||||
# Gegenstelle prüfen und passende Optionen laden
|
||||
print(self.revpipyversion)
|
||||
if self.revpipyversion[0] == 0 and self.revpipyversion[1] < 6:
|
||||
self.tkoptions = \
|
||||
revpilegacy.RevPiOption(win, self.cli)
|
||||
@@ -338,7 +337,7 @@ class RevPiPyControl(tkinter.Frame):
|
||||
if self.tkoptions.dc is not None and self.tkoptions.dorestart:
|
||||
|
||||
# Wenn XML-Modus anders und Dienstneustart
|
||||
if self.xmlmode != self.tkoptions.dc["xmlrpc"]:
|
||||
if self.xmlmode != self.cli.xmlmodus():
|
||||
self.serverdisconnect()
|
||||
self._opt_conn(self.revpiname, True)
|
||||
|
||||
|
||||
1
revpipycontrol/shared/__init__.py
Normal file
1
revpipycontrol/shared/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
"""Shared modules."""
|
||||
189
revpipycontrol/shared/ipaclmanager.py
Normal file
189
revpipycontrol/shared/ipaclmanager.py
Normal file
@@ -0,0 +1,189 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# IpAclManager
|
||||
#
|
||||
# (c) Sven Sager, License: LGPLv3
|
||||
# Version 0.1.0
|
||||
#
|
||||
"""Verwaltet IP Adressen und deren ACLs."""
|
||||
from os import access, R_OK, W_OK
|
||||
from re import match as rematch
|
||||
|
||||
|
||||
def refullmatch(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)
|
||||
|
||||
|
||||
class IpAclManager():
|
||||
|
||||
"""Verwaltung fuer IP Adressen und deren ACL Level."""
|
||||
|
||||
def __init__(self, minlevel, maxlevel, acl=None):
|
||||
"""Init IpAclManager class.
|
||||
|
||||
@param minlevel Smallest access level (min. 0)
|
||||
@param maxlevel Biggest access level (max. 9)
|
||||
@param acl ACL Liste fuer Berechtigungen als <class 'str'>
|
||||
|
||||
"""
|
||||
if type(minlevel) != int:
|
||||
raise ValueError("parameter minlevel must be <class 'int'>")
|
||||
if type(maxlevel) != int:
|
||||
raise ValueError("parameter maxlevel must be <class 'int'>")
|
||||
if minlevel < 0:
|
||||
raise ValueError("minlevel must be 0 or more")
|
||||
if maxlevel > 9:
|
||||
raise ValueError("maxlevel maximum is 9")
|
||||
if minlevel > maxlevel:
|
||||
raise ValueError("minlevel is smaller than maxlevel")
|
||||
|
||||
self.__dict_acl = {}
|
||||
self.__dict_regex = {}
|
||||
self.__dict_knownips = {}
|
||||
self.__filename = None
|
||||
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 __iter__(self):
|
||||
"""Gibt einzelne ACLs als <class 'tuple'> aus."""
|
||||
for aclip in sorted(self.__dict_acl):
|
||||
yield (aclip, self.__dict_acl[aclip])
|
||||
|
||||
def __get_acl(self):
|
||||
"""Getter fuer den rohen ACL-String.
|
||||
return ACLs als <class 'str'>"""
|
||||
str_acl = ""
|
||||
for aclip in sorted(self.__dict_acl):
|
||||
str_acl += "{},{} ".format(aclip, self.__dict_acl[aclip])
|
||||
return str_acl.strip()
|
||||
|
||||
def __get_filename(self):
|
||||
"""Getter fuer Dateinamen.
|
||||
@return Filename der ACL <class 'str'>"""
|
||||
return "" if self.__filename is None else self.__filename
|
||||
|
||||
def __get_regex_acl(self):
|
||||
"""Gibt formatierten RegEx-String zurueck.
|
||||
return RegEx Code als <class 'str'>"""
|
||||
return self.__re_ipacl
|
||||
|
||||
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'>")
|
||||
|
||||
value = value.strip()
|
||||
if not 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.__dict_regex = {}
|
||||
self.__dict_knownips = {}
|
||||
|
||||
# Liste neu füllen mit regex Strings
|
||||
for ip_level in value.split():
|
||||
ip, level = ip_level.split(",", 1)
|
||||
self.__dict_acl[ip] = int(level)
|
||||
self.__dict_regex[ip] = \
|
||||
ip.replace(".", "\\.").replace("*", "\\d{1,3}")
|
||||
|
||||
def get_acllevel(self, ipaddress):
|
||||
"""Prueft IP gegen ACL List und gibt ACL-Wert aus.
|
||||
@param ipaddress zum pruefen
|
||||
@return <class 'int'> ACL Wert oder -1 wenn nicht gefunden"""
|
||||
# Bei bereits aufgelösten IPs direkt ACL auswerten
|
||||
if ipaddress in self.__dict_knownips:
|
||||
return self.__dict_knownips[ipaddress]
|
||||
|
||||
for aclip in sorted(self.__dict_acl, reverse=True):
|
||||
if refullmatch(self.__dict_regex[aclip], ipaddress):
|
||||
# IP und Level merken
|
||||
self.__dict_knownips[ipaddress] = self.__dict_acl[aclip]
|
||||
|
||||
# Level zurückgeben
|
||||
return self.__dict_acl[aclip]
|
||||
|
||||
return -1
|
||||
|
||||
def loadacl(self, str_acl):
|
||||
"""Laed ACL String und gibt erfolg zurueck.
|
||||
@param str_acl ACL als <class 'str'>
|
||||
@return True, wenn erfolgreich uebernommen"""
|
||||
if not refullmatch(self.__re_ipacl, str_acl):
|
||||
return False
|
||||
self.__set_acl(str_acl)
|
||||
return True
|
||||
|
||||
def loadaclfile(self, filename):
|
||||
"""Laed ACL Definitionen aus Datei.
|
||||
@param filename Dateiname fuer Definitionen
|
||||
@return True, wenn Laden erfolgreich war"""
|
||||
if type(filename) != str:
|
||||
raise ValueError("parameter filename must be <class 'str'>")
|
||||
|
||||
# Zugriffsrecht prüfen
|
||||
if not access(filename, R_OK):
|
||||
return False
|
||||
|
||||
str_acl = ""
|
||||
with open(filename, "r") as fh:
|
||||
while True:
|
||||
buff = fh.readline()
|
||||
if buff == "":
|
||||
break
|
||||
buff = buff.split("#")[0].strip()
|
||||
if len(buff) > 0:
|
||||
str_acl += buff + " "
|
||||
|
||||
acl_okay = self.loadacl(str_acl.strip())
|
||||
if acl_okay:
|
||||
# Dateinamen für Schreiben übernehmen
|
||||
self.__filename = filename
|
||||
|
||||
return acl_okay
|
||||
|
||||
def writeaclfile(self, filename=None, aclname=None):
|
||||
"""Schreibt ACL Definitionen in Datei.
|
||||
@param filename Dateiname fuer Definitionen
|
||||
@return True, wenn Schreiben erfolgreich war"""
|
||||
if filename is not None and type(filename) != str:
|
||||
raise ValueError("parameter filename must be <class 'str'>")
|
||||
if aclname is not None and type(aclname) != str:
|
||||
raise ValueError("parameter aclname must be <class 'str'>")
|
||||
|
||||
# Dateinamen prüfen
|
||||
if filename is None and self.__filename is not None:
|
||||
filename = self.__filename
|
||||
|
||||
# Zugriffsrecht prüfen
|
||||
if not access(filename, W_OK):
|
||||
return False
|
||||
|
||||
header = "# {}Access Control List (acl)\n" \
|
||||
"# One entry per Line IPADRESS,LEVEL\n" \
|
||||
"#\n".format("" if aclname is None else aclname + " ")
|
||||
|
||||
with open(filename, "w") as fh:
|
||||
fh.write(header)
|
||||
for aclip in sorted(self.__dict_acl):
|
||||
fh.write("{},{}\n".format(aclip, self.__dict_acl[aclip]))
|
||||
|
||||
return True
|
||||
|
||||
acl = property(__get_acl, __set_acl)
|
||||
filename = property(__get_filename)
|
||||
regex_acl = property(__get_regex_acl)
|
||||
1
setup.py
1
setup.py
@@ -48,6 +48,7 @@ if platform == "linux":
|
||||
("share/applications", ["data/revpipycontrol.desktop"]),
|
||||
("share/icons/hicolor/32x32/apps", ["data/revpipycontrol.png"]),
|
||||
("share/revpipycontrol", glob("revpipycontrol/*.*")),
|
||||
("share/revpipycontrol/shared", glob("revpipycontrol/shared/*.*")),
|
||||
(
|
||||
"share/revpipycontrol/locale/de/LC_MESSAGES",
|
||||
glob("revpipycontrol/locale/de/LC_MESSAGES/*.mo")
|
||||
|
||||
Reference in New Issue
Block a user