mirror of
https://github.com/naruxde/revpipycontrol.git
synced 2025-11-08 15:43:52 +01:00
ACL Manger eingebaut
This commit is contained in:
351
doc/aclmanager.html
Normal file
351
doc/aclmanager.html
Normal file
@@ -0,0 +1,351 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head>
|
||||||
|
<title>aclmanager</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">
|
||||||
|
aclmanager</h1>
|
||||||
|
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Global Attributes</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>_</td></tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Classes</h3>
|
||||||
|
<table>
|
||||||
|
<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">
|
||||||
|
Functions</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<hr /><hr />
|
||||||
|
<a NAME="AclManager" ID="AclManager"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">AclManager</h2>
|
||||||
|
<p>
|
||||||
|
Hauptfenster des ACL-Managers.
|
||||||
|
</p>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Derived from</h3>
|
||||||
|
ttk.Frame
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Class Attributes</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>acl</td></tr><tr><td>acltext</td></tr><tr><td>root</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="#AclManager.__init__">AclManager</a></td>
|
||||||
|
<td>Init RevPiOption-Class.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclManager.__get_acltext">__get_acltext</a></td>
|
||||||
|
<td>Getter fuer Leveltexte.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclManager.__set_acltext">__set_acltext</a></td>
|
||||||
|
<td>Setter fuer Leveltexte.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclManager._ask_delete">_ask_delete</a></td>
|
||||||
|
<td>Löscht ein Eintrag der Liste.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<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._checkclose">_checkclose</a></td>
|
||||||
|
<td>Prüft ob Fenster beendet werden soll.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclManager._clearfields">_clearfields</a></td>
|
||||||
|
<td>Leert die Eingabefelder.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclManager._createwidgets">_createwidgets</a></td>
|
||||||
|
<td>Erstellt Widgets.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclManager._loadfields">_loadfields</a></td>
|
||||||
|
<td>Übernimmt Listeneintrag in Editfelder.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclManager._refreshacls">_refreshacls</a></td>
|
||||||
|
<td>Leert die ACL Liste und füllt sie neu.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclManager._save">_save</a></td>
|
||||||
|
<td>Übernimt die Änderungen.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclManager._savefields">_savefields</a></td>
|
||||||
|
<td>Übernimmt neuen ACL Eintrag.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclManager._status_editremove">_status_editremove</a></td>
|
||||||
|
<td>Setzt state der Buttons.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#AclManager.get_acl">get_acl</a></td>
|
||||||
|
<td>Gibt die Konfigurierten ACL zurück.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Static Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<a NAME="AclManager.__init__" ID="AclManager.__init__"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager (Constructor)</h3>
|
||||||
|
<b>AclManager</b>(<i>master, minlevel, maxlevel, acl_str="", readonly=False</i>)
|
||||||
|
<p>
|
||||||
|
Init RevPiOption-Class.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
None
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="AclManager.__get_acltext" ID="AclManager.__get_acltext"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager.__get_acltext</h3>
|
||||||
|
<b>__get_acltext</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Getter fuer Leveltexte.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
Leveltexte als <class 'dict'>
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="AclManager.__set_acltext" ID="AclManager.__set_acltext"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager.__set_acltext</h3>
|
||||||
|
<b>__set_acltext</b>(<i>value</i>)
|
||||||
|
<p>
|
||||||
|
Setter fuer Leveltexte.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>value</i></dt>
|
||||||
|
<dd>
|
||||||
|
Leveltexte als <class 'dict'>
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="AclManager._ask_delete" ID="AclManager._ask_delete"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager._ask_delete</h3>
|
||||||
|
<b>_ask_delete</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Löscht ein Eintrag der Liste.
|
||||||
|
</p><a NAME="AclManager._changesdone" ID="AclManager._changesdone"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager._changesdone</h3>
|
||||||
|
<b>_changesdone</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Prüft ob sich die Einstellungen geändert haben.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
True, wenn min. eine Einstellung geändert wurde
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="AclManager._checkclose" ID="AclManager._checkclose"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager._checkclose</h3>
|
||||||
|
<b>_checkclose</b>(<i>event=None</i>)
|
||||||
|
<p>
|
||||||
|
Prüft ob Fenster beendet werden soll.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>event</i></dt>
|
||||||
|
<dd>
|
||||||
|
tkinter-Event
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="AclManager._clearfields" ID="AclManager._clearfields"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager._clearfields</h3>
|
||||||
|
<b>_clearfields</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Leert die Eingabefelder.
|
||||||
|
</p><a NAME="AclManager._createwidgets" ID="AclManager._createwidgets"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager._createwidgets</h3>
|
||||||
|
<b>_createwidgets</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Erstellt Widgets.
|
||||||
|
</p><a NAME="AclManager._loadfields" ID="AclManager._loadfields"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager._loadfields</h3>
|
||||||
|
<b>_loadfields</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Übernimmt Listeneintrag in Editfelder.
|
||||||
|
</p><a NAME="AclManager._refreshacls" ID="AclManager._refreshacls"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager._refreshacls</h3>
|
||||||
|
<b>_refreshacls</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Leert die ACL Liste und füllt sie neu.
|
||||||
|
</p><a NAME="AclManager._save" ID="AclManager._save"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager._save</h3>
|
||||||
|
<b>_save</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Übernimt die Änderungen.
|
||||||
|
</p><a NAME="AclManager._savefields" ID="AclManager._savefields"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager._savefields</h3>
|
||||||
|
<b>_savefields</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Übernimmt neuen ACL Eintrag.
|
||||||
|
</p><a NAME="AclManager._status_editremove" ID="AclManager._status_editremove"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager._status_editremove</h3>
|
||||||
|
<b>_status_editremove</b>(<i>tkevt</i>)
|
||||||
|
<p>
|
||||||
|
Setzt state der Buttons.
|
||||||
|
</p><a NAME="AclManager.get_acl" ID="AclManager.get_acl"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
AclManager.get_acl</h3>
|
||||||
|
<b>get_acl</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Gibt die Konfigurierten ACL zurück.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
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>
|
||||||
@@ -13,9 +13,12 @@ Table of contents</h1>
|
|||||||
Modules</h3>
|
Modules</h3>
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td><a style="color:#0000FF" href="mytools.html">mytools</a></td>
|
<td><a style="color:#0000FF" href="aclmanager.html">aclmanager</a></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="mytools.html">mytools</a></td>
|
||||||
|
<td>Tools-Sammlung.</td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="revpicheckclient.html">revpicheckclient</a></td>
|
<td><a style="color:#0000FF" href="revpicheckclient.html">revpicheckclient</a></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
@@ -28,6 +31,9 @@ Modules</h3>
|
|||||||
<td><a style="color:#0000FF" href="revpioption.html">revpioption</a></td>
|
<td><a style="color:#0000FF" href="revpioption.html">revpioption</a></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="revpioptionlegacy.html">revpioptionlegacy</a></td>
|
||||||
|
<td></td>
|
||||||
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="revpiplclist.html">revpiplclist</a></td>
|
<td><a style="color:#0000FF" href="revpiplclist.html">revpiplclist</a></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
|||||||
@@ -6,7 +6,9 @@
|
|||||||
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
|
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
|
||||||
<h1 style="background-color:#FFFFFF;color:#0000FF">
|
<h1 style="background-color:#FFFFFF;color:#0000FF">
|
||||||
mytools</h1>
|
mytools</h1>
|
||||||
|
<p>
|
||||||
|
Tools-Sammlung.
|
||||||
|
</p>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Global Attributes</h3>
|
Global Attributes</h3>
|
||||||
<table>
|
<table>
|
||||||
@@ -25,7 +27,7 @@ Functions</h3>
|
|||||||
<td>Hängt root-dir der Anwendung vor Dateinamen.</td>
|
<td>Hängt root-dir der Anwendung vor Dateinamen.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#gettrans">gettrans</a></td>
|
<td><a style="color:#0000FF" href="#gettrans">gettrans</a></td>
|
||||||
<td></td>
|
<td>Wertet die Sprache des OS aus und gibt Übersetzung zurück.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<hr /><hr />
|
<hr /><hr />
|
||||||
@@ -53,7 +55,19 @@ root dir
|
|||||||
<a NAME="gettrans" ID="gettrans"></a>
|
<a NAME="gettrans" ID="gettrans"></a>
|
||||||
<h2 style="background-color:#FFFFFF;color:#0000FF">gettrans</h2>
|
<h2 style="background-color:#FFFFFF;color:#0000FF">gettrans</h2>
|
||||||
<b>gettrans</b>(<i>proglang=None</i>)
|
<b>gettrans</b>(<i>proglang=None</i>)
|
||||||
|
<p>
|
||||||
|
Wertet die Sprache des OS aus und gibt Übersetzung zurück.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>proglang</i></dt>
|
||||||
|
<dd>
|
||||||
|
Bestimmte Sprache laden
|
||||||
|
</dd>
|
||||||
|
</dl><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
gettext Übersetzung für Zuweisung an '_'
|
||||||
|
</dd>
|
||||||
|
</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 />
|
||||||
</body></html>
|
</body></html>
|
||||||
@@ -67,11 +67,11 @@ Methods</h3>
|
|||||||
<td><a style="color:#0000FF" href="#RevPiOption.askxmlon">askxmlon</a></td>
|
<td><a style="color:#0000FF" href="#RevPiOption.askxmlon">askxmlon</a></td>
|
||||||
<td>Fragt Nuter, ob wirklicht abgeschaltet werden soll.</td>
|
<td>Fragt Nuter, ob wirklicht abgeschaltet werden soll.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiOption.xmlmod2_tail">xmlmod2_tail</a></td>
|
<td><a style="color:#0000FF" href="#RevPiOption.btn_slaveacl">btn_slaveacl</a></td>
|
||||||
<td>Passt XML-Optionszugriff an.</td>
|
<td>Öffnet Fenster für ACL-Verwaltung.</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiOption.xmlmod_tail">xmlmod_tail</a></td>
|
<td><a style="color:#0000FF" href="#RevPiOption.btn_xmlacl">btn_xmlacl</a></td>
|
||||||
<td>Passt XML-Optionszugriff an.</td>
|
<td>Öffnet Fenster für ACL-Verwaltung.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
@@ -146,18 +146,18 @@ RevPiOption.askxmlon</h3>
|
|||||||
<b>askxmlon</b>(<i></i>)
|
<b>askxmlon</b>(<i></i>)
|
||||||
<p>
|
<p>
|
||||||
Fragt Nuter, ob wirklicht abgeschaltet werden soll.
|
Fragt Nuter, ob wirklicht abgeschaltet werden soll.
|
||||||
</p><a NAME="RevPiOption.xmlmod2_tail" ID="RevPiOption.xmlmod2_tail"></a>
|
</p><a NAME="RevPiOption.btn_slaveacl" ID="RevPiOption.btn_slaveacl"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiOption.xmlmod2_tail</h3>
|
RevPiOption.btn_slaveacl</h3>
|
||||||
<b>xmlmod2_tail</b>(<i></i>)
|
<b>btn_slaveacl</b>(<i></i>)
|
||||||
<p>
|
<p>
|
||||||
Passt XML-Optionszugriff an.
|
Öffnet Fenster für ACL-Verwaltung.
|
||||||
</p><a NAME="RevPiOption.xmlmod_tail" ID="RevPiOption.xmlmod_tail"></a>
|
</p><a NAME="RevPiOption.btn_xmlacl" ID="RevPiOption.btn_xmlacl"></a>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
RevPiOption.xmlmod_tail</h3>
|
RevPiOption.btn_xmlacl</h3>
|
||||||
<b>xmlmod_tail</b>(<i></i>)
|
<b>btn_xmlacl</b>(<i></i>)
|
||||||
<p>
|
<p>
|
||||||
Passt XML-Optionszugriff an.
|
Öffnet Fenster für ACL-Verwaltung.
|
||||||
</p>
|
</p>
|
||||||
<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 />
|
||||||
|
|||||||
164
doc/revpioptionlegacy.html
Normal file
164
doc/revpioptionlegacy.html
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head>
|
||||||
|
<title>revpioptionlegacy</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">
|
||||||
|
revpioptionlegacy</h1>
|
||||||
|
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Global Attributes</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>_</td></tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Classes</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiOption">RevPiOption</a></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Functions</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<hr /><hr />
|
||||||
|
<a NAME="RevPiOption" ID="RevPiOption"></a>
|
||||||
|
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiOption</h2>
|
||||||
|
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Derived from</h3>
|
||||||
|
tkinter.Frame
|
||||||
|
<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="#RevPiOption.__init__">RevPiOption</a></td>
|
||||||
|
<td>Init RevPiOption-Class.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiOption._changesdone">_changesdone</a></td>
|
||||||
|
<td>Prüft ob sich die Einstellungen geändert haben.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiOption._checkclose">_checkclose</a></td>
|
||||||
|
<td>Prüft ob Fenster beendet werden soll.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiOption._createwidgets">_createwidgets</a></td>
|
||||||
|
<td>Erstellt Widgets.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiOption._loadappdata">_loadappdata</a></td>
|
||||||
|
<td>Läd aktuelle Einstellungen vom RevPi.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiOption._setappdata">_setappdata</a></td>
|
||||||
|
<td>Speichert geänderte Einstellungen auf RevPi.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiOption.askxmlon">askxmlon</a></td>
|
||||||
|
<td>Fragt Nuter, ob wirklicht abgeschaltet werden soll.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiOption.xmlmod2_tail">xmlmod2_tail</a></td>
|
||||||
|
<td>Passt XML-Optionszugriff an.</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td><a style="color:#0000FF" href="#RevPiOption.xmlmod_tail">xmlmod_tail</a></td>
|
||||||
|
<td>Passt XML-Optionszugriff an.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
Static Methods</h3>
|
||||||
|
<table>
|
||||||
|
<tr><td>None</td></tr>
|
||||||
|
</table>
|
||||||
|
<a NAME="RevPiOption.__init__" ID="RevPiOption.__init__"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiOption (Constructor)</h3>
|
||||||
|
<b>RevPiOption</b>(<i>master, xmlcli</i>)
|
||||||
|
<p>
|
||||||
|
Init RevPiOption-Class.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
None
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiOption._changesdone" ID="RevPiOption._changesdone"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiOption._changesdone</h3>
|
||||||
|
<b>_changesdone</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Prüft ob sich die Einstellungen geändert haben.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
True, wenn min. eine Einstellung geändert wurde
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiOption._checkclose" ID="RevPiOption._checkclose"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiOption._checkclose</h3>
|
||||||
|
<b>_checkclose</b>(<i>event=None</i>)
|
||||||
|
<p>
|
||||||
|
Prüft ob Fenster beendet werden soll.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>event</i></dt>
|
||||||
|
<dd>
|
||||||
|
tkinter-Event
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiOption._createwidgets" ID="RevPiOption._createwidgets"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiOption._createwidgets</h3>
|
||||||
|
<b>_createwidgets</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Erstellt Widgets.
|
||||||
|
</p><a NAME="RevPiOption._loadappdata" ID="RevPiOption._loadappdata"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiOption._loadappdata</h3>
|
||||||
|
<b>_loadappdata</b>(<i>refresh=False</i>)
|
||||||
|
<p>
|
||||||
|
Läd aktuelle Einstellungen vom RevPi.
|
||||||
|
</p><dl>
|
||||||
|
<dt><i>refresh</i></dt>
|
||||||
|
<dd>
|
||||||
|
Wenn True, werden Einstellungen heruntergeladen.
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiOption._setappdata" ID="RevPiOption._setappdata"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiOption._setappdata</h3>
|
||||||
|
<b>_setappdata</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Speichert geänderte Einstellungen auf RevPi.
|
||||||
|
</p><dl>
|
||||||
|
<dt>Returns:</dt>
|
||||||
|
<dd>
|
||||||
|
None
|
||||||
|
</dd>
|
||||||
|
</dl><a NAME="RevPiOption.askxmlon" ID="RevPiOption.askxmlon"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiOption.askxmlon</h3>
|
||||||
|
<b>askxmlon</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Fragt Nuter, ob wirklicht abgeschaltet werden soll.
|
||||||
|
</p><a NAME="RevPiOption.xmlmod2_tail" ID="RevPiOption.xmlmod2_tail"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiOption.xmlmod2_tail</h3>
|
||||||
|
<b>xmlmod2_tail</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Passt XML-Optionszugriff an.
|
||||||
|
</p><a NAME="RevPiOption.xmlmod_tail" ID="RevPiOption.xmlmod_tail"></a>
|
||||||
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
|
RevPiOption.xmlmod_tail</h3>
|
||||||
|
<b>xmlmod_tail</b>(<i></i>)
|
||||||
|
<p>
|
||||||
|
Passt XML-Optionszugriff an.
|
||||||
|
</p>
|
||||||
|
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||||
|
<hr />
|
||||||
|
</body></html>
|
||||||
@@ -17,7 +17,7 @@ Classes</h3>
|
|||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td><a style="color:#0000FF" href="#RevPiPlcList">RevPiPlcList</a></td>
|
<td><a style="color:#0000FF" href="#RevPiPlcList">RevPiPlcList</a></td>
|
||||||
<td></td>
|
<td>TK Fenster.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
@@ -31,7 +31,9 @@ Functions</h3>
|
|||||||
<hr /><hr />
|
<hr /><hr />
|
||||||
<a NAME="RevPiPlcList" ID="RevPiPlcList"></a>
|
<a NAME="RevPiPlcList" ID="RevPiPlcList"></a>
|
||||||
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiPlcList</h2>
|
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiPlcList</h2>
|
||||||
|
<p>
|
||||||
|
TK Fenster.
|
||||||
|
</p>
|
||||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||||
Derived from</h3>
|
Derived from</h3>
|
||||||
tkinter.Frame
|
tkinter.Frame
|
||||||
|
|||||||
@@ -1,3 +1,30 @@
|
|||||||
|
aclmanager.AclManager.__get_acltext?6()
|
||||||
|
aclmanager.AclManager.__set_acltext?6(value)
|
||||||
|
aclmanager.AclManager._ask_delete?5()
|
||||||
|
aclmanager.AclManager._changesdone?5()
|
||||||
|
aclmanager.AclManager._checkclose?5(event=None)
|
||||||
|
aclmanager.AclManager._clearfields?5()
|
||||||
|
aclmanager.AclManager._createwidgets?5()
|
||||||
|
aclmanager.AclManager._loadfields?5()
|
||||||
|
aclmanager.AclManager._refreshacls?5()
|
||||||
|
aclmanager.AclManager._save?5()
|
||||||
|
aclmanager.AclManager._savefields?5()
|
||||||
|
aclmanager.AclManager._status_editremove?5(tkevt)
|
||||||
|
aclmanager.AclManager.acl?7
|
||||||
|
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.addroot?4(filename)
|
||||||
mytools.gettrans?4(proglang=None)
|
mytools.gettrans?4(proglang=None)
|
||||||
revpicheckclient.RevPiCheckClient.__chval?6(device, io, event=None)
|
revpicheckclient.RevPiCheckClient.__chval?6(device, io, event=None)
|
||||||
@@ -41,10 +68,20 @@ revpioption.RevPiOption._createwidgets?5()
|
|||||||
revpioption.RevPiOption._loadappdata?5(refresh=False)
|
revpioption.RevPiOption._loadappdata?5(refresh=False)
|
||||||
revpioption.RevPiOption._setappdata?5()
|
revpioption.RevPiOption._setappdata?5()
|
||||||
revpioption.RevPiOption.askxmlon?4()
|
revpioption.RevPiOption.askxmlon?4()
|
||||||
revpioption.RevPiOption.xmlmod2_tail?4()
|
revpioption.RevPiOption.btn_slaveacl?4()
|
||||||
revpioption.RevPiOption.xmlmod_tail?4()
|
revpioption.RevPiOption.btn_xmlacl?4()
|
||||||
revpioption.RevPiOption?1(master, xmlcli)
|
revpioption.RevPiOption?1(master, xmlcli)
|
||||||
revpioption._?8
|
revpioption._?8
|
||||||
|
revpioptionlegacy.RevPiOption._changesdone?5()
|
||||||
|
revpioptionlegacy.RevPiOption._checkclose?5(event=None)
|
||||||
|
revpioptionlegacy.RevPiOption._createwidgets?5()
|
||||||
|
revpioptionlegacy.RevPiOption._loadappdata?5(refresh=False)
|
||||||
|
revpioptionlegacy.RevPiOption._setappdata?5()
|
||||||
|
revpioptionlegacy.RevPiOption.askxmlon?4()
|
||||||
|
revpioptionlegacy.RevPiOption.xmlmod2_tail?4()
|
||||||
|
revpioptionlegacy.RevPiOption.xmlmod_tail?4()
|
||||||
|
revpioptionlegacy.RevPiOption?1(master, xmlcli)
|
||||||
|
revpioptionlegacy._?8
|
||||||
revpiplclist.RevPiPlcList._checkclose?5(event=None)
|
revpiplclist.RevPiPlcList._checkclose?5(event=None)
|
||||||
revpiplclist.RevPiPlcList._createwidgets?5()
|
revpiplclist.RevPiPlcList._createwidgets?5()
|
||||||
revpiplclist.RevPiPlcList._saveappdata?5()
|
revpiplclist.RevPiPlcList._saveappdata?5()
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
AclManager ttk.Frame
|
||||||
RevPiCheckClient tkinter.Frame
|
RevPiCheckClient tkinter.Frame
|
||||||
RevPiInfo tkinter.Frame
|
RevPiInfo tkinter.Frame
|
||||||
RevPiLogfile tkinter.Frame
|
RevPiLogfile tkinter.Frame
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
<?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 revpipycontrol -->
|
<!-- eric project file for project revpipycontrol -->
|
||||||
<!-- Saved: 2017-12-20, 14:05:18 -->
|
<!-- Saved: 2018-03-12, 15:45:28 -->
|
||||||
<!-- Copyright (C) 2017 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>
|
||||||
<Hash>66103e2eaf8a762f14d1fd51d8b1c9dcaf35a275</Hash>
|
<Hash>66103e2eaf8a762f14d1fd51d8b1c9dcaf35a275</Hash>
|
||||||
<ProgLanguage mixed="0">Python3</ProgLanguage>
|
<ProgLanguage mixed="0">Python3</ProgLanguage>
|
||||||
<ProjectType>Console</ProjectType>
|
<ProjectType>Console</ProjectType>
|
||||||
<Description></Description>
|
<Description></Description>
|
||||||
<Version>0.5.0</Version>
|
<Version>0.6.0</Version>
|
||||||
<Author>Sven Sager</Author>
|
<Author>Sven Sager</Author>
|
||||||
<Email>akira@narux.de</Email>
|
<Email>akira@narux.de</Email>
|
||||||
<Eol index="1"/>
|
<Eol index="1"/>
|
||||||
@@ -23,6 +23,8 @@
|
|||||||
<Source>revpipycontrol/revpiprogram.py</Source>
|
<Source>revpipycontrol/revpiprogram.py</Source>
|
||||||
<Source>revpipycontrol/mytools.py</Source>
|
<Source>revpipycontrol/mytools.py</Source>
|
||||||
<Source>revpipycontrol/revpiinfo.py</Source>
|
<Source>revpipycontrol/revpiinfo.py</Source>
|
||||||
|
<Source>revpipycontrol/revpioptionlegacy.py</Source>
|
||||||
|
<Source>revpipycontrol/aclmanager.py</Source>
|
||||||
</Sources>
|
</Sources>
|
||||||
<Forms/>
|
<Forms/>
|
||||||
<Translations/>
|
<Translations/>
|
||||||
|
|||||||
418
revpipycontrol/aclmanager.py
Normal file
418
revpipycontrol/aclmanager.py
Normal file
@@ -0,0 +1,418 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# RevPiPyControl
|
||||||
|
#
|
||||||
|
# Webpage: https://revpimodio.org/revpipyplc/
|
||||||
|
# (c) Sven Sager, License: LGPLv3
|
||||||
|
#
|
||||||
|
u"""Manager für ACL Einträge."""
|
||||||
|
import tkinter
|
||||||
|
import tkinter.messagebox as tkmsg
|
||||||
|
from mytools import gettrans
|
||||||
|
from re import fullmatch
|
||||||
|
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."""
|
||||||
|
|
||||||
|
def __init__(self, master, minlevel, maxlevel, acl_str="", readonly=False):
|
||||||
|
u"""Init RevPiOption-Class.
|
||||||
|
@return None"""
|
||||||
|
super().__init__(master)
|
||||||
|
self.master.bind("<KeyPress-Escape>", self._checkclose)
|
||||||
|
self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
|
||||||
|
self.pack(expand=True, fill="both")
|
||||||
|
|
||||||
|
# Daten laden
|
||||||
|
self.__acl = IpAclManager(minlevel, maxlevel, acl_str)
|
||||||
|
self.__dict_acltext = {}
|
||||||
|
self.__oldacl = self.__acl.acl
|
||||||
|
self.__ro = "disabled" if readonly else "normal"
|
||||||
|
self.maxlevel = maxlevel
|
||||||
|
self.minlevel = minlevel
|
||||||
|
|
||||||
|
# Fenster bauen
|
||||||
|
self._createwidgets()
|
||||||
|
|
||||||
|
def __get_acltext(self):
|
||||||
|
"""Getter fuer Leveltexte.
|
||||||
|
@return Leveltexte als <class 'dict'>"""
|
||||||
|
return self.__dict_acltext.copy()
|
||||||
|
|
||||||
|
def __set_acltext(self, value):
|
||||||
|
"""Setter fuer Leveltexte.
|
||||||
|
@param value Leveltexte als <class 'dict'>"""
|
||||||
|
if type(value) != dict:
|
||||||
|
raise ValueError("value must be <class 'dict'>")
|
||||||
|
self.__dict_acltext = value.copy()
|
||||||
|
|
||||||
|
# Infotexte aufbauen
|
||||||
|
self.aclinfo.destroy()
|
||||||
|
self.aclinfo = ttk.Frame(self)
|
||||||
|
for acltext in self.__dict_acltext:
|
||||||
|
lbl = ttk.Label(self.aclinfo)
|
||||||
|
lbl["text"] = _("Level") + " {}: {}".format(
|
||||||
|
acltext, self.__dict_acltext[acltext]
|
||||||
|
)
|
||||||
|
lbl.pack(anchor="w")
|
||||||
|
|
||||||
|
self.aclinfo.pack(anchor="w", padx=4, pady=4)
|
||||||
|
|
||||||
|
def _changesdone(self):
|
||||||
|
u"""Prüft ob sich die Einstellungen geändert haben.
|
||||||
|
@return True, wenn min. eine Einstellung geändert wurde"""
|
||||||
|
return not self.__acl.acl == self.__oldacl
|
||||||
|
|
||||||
|
def _checkclose(self, event=None):
|
||||||
|
u"""Prüft ob Fenster beendet werden soll.
|
||||||
|
@param event tkinter-Event"""
|
||||||
|
ask = True
|
||||||
|
if self._changesdone():
|
||||||
|
ask = tkmsg.askyesno(
|
||||||
|
_("Question"),
|
||||||
|
_("Do you really want to quit? \nUnsaved changes will "
|
||||||
|
"be lost"),
|
||||||
|
parent=self.master, default="no"
|
||||||
|
)
|
||||||
|
|
||||||
|
if ask:
|
||||||
|
self.master.destroy()
|
||||||
|
|
||||||
|
def _createwidgets(self):
|
||||||
|
u"""Erstellt Widgets."""
|
||||||
|
self.master.wm_title(_("IP access control list"))
|
||||||
|
self.master.wm_resizable(width=False, height=False)
|
||||||
|
|
||||||
|
cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
|
||||||
|
|
||||||
|
# Gruppe Bestehende ACL ######################################
|
||||||
|
gb_acl = ttk.LabelFrame(self)
|
||||||
|
gb_acl["text"] = _("Existing ACLs")
|
||||||
|
gb_acl.columnconfigure(0, weight=1)
|
||||||
|
gb_acl.columnconfigure(1, weight=1)
|
||||||
|
gb_acl.pack(expand=True, fill="both", padx=4, pady=4)
|
||||||
|
|
||||||
|
row = 0
|
||||||
|
frame = ttk.Frame(gb_acl)
|
||||||
|
frame.columnconfigure(0, weight=1)
|
||||||
|
|
||||||
|
scb_acl = ttk.Scrollbar(frame)
|
||||||
|
|
||||||
|
self.trv_acl = ttk.Treeview(frame)
|
||||||
|
self.trv_acl["columns"] = ("level")
|
||||||
|
self.trv_acl["yscrollcommand"] = scb_acl.set
|
||||||
|
self.trv_acl.heading("level", text=_("Access level"))
|
||||||
|
self.trv_acl.column("level", width=100)
|
||||||
|
self.trv_acl.bind("<<TreeviewSelect>>", self._status_editremove)
|
||||||
|
self._refreshacls()
|
||||||
|
self.trv_acl.grid(row=0, column=0, sticky="we")
|
||||||
|
|
||||||
|
scb_acl["command"] = self.trv_acl.yview
|
||||||
|
scb_acl.grid(row=0, column=1, sticky="ns")
|
||||||
|
|
||||||
|
frame.grid(row=row, columnspan=2, sticky="we")
|
||||||
|
|
||||||
|
row = 1
|
||||||
|
|
||||||
|
# Edit / Remove button
|
||||||
|
self.btn_edit = ttk.Button(gb_acl)
|
||||||
|
self.btn_edit["command"] = self._loadfields
|
||||||
|
self.btn_edit["text"] = _("load entry")
|
||||||
|
self.btn_edit["state"] = "disabled"
|
||||||
|
self.btn_edit.grid(row=row, column=0, pady=4)
|
||||||
|
|
||||||
|
self.btn_remove = ttk.Button(gb_acl)
|
||||||
|
self.btn_remove["command"] = self._ask_delete
|
||||||
|
self.btn_remove["text"] = _("remove entry")
|
||||||
|
self.btn_remove["state"] = "disabled"
|
||||||
|
self.btn_remove.grid(row=row, column=1, pady=4)
|
||||||
|
|
||||||
|
# ############################################################
|
||||||
|
|
||||||
|
# Gruppe Bearbeiten ##########################################
|
||||||
|
gb_edit = ttk.LabelFrame(self)
|
||||||
|
gb_edit["text"] = _("Edit acess control list")
|
||||||
|
gb_edit.pack(expand=True, fill="both", padx=4, pady=4)
|
||||||
|
|
||||||
|
frame = ttk.Frame(gb_edit)
|
||||||
|
frame.grid()
|
||||||
|
|
||||||
|
row = 0
|
||||||
|
lbl = ttk.Label(frame)
|
||||||
|
lbl["text"] = _("IP address") + ": "
|
||||||
|
lbl.grid(row=row, column=0, **cpadw)
|
||||||
|
|
||||||
|
# Variablen IP / Level
|
||||||
|
self.var_ip1 = tkinter.StringVar(frame)
|
||||||
|
self.var_ip2 = tkinter.StringVar(frame)
|
||||||
|
self.var_ip3 = tkinter.StringVar(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)
|
||||||
|
|
||||||
|
# Punkte zwischen IP-Feldern
|
||||||
|
for i in range(2, 7, 2):
|
||||||
|
lbl = ttk.Label(frame, text=".")
|
||||||
|
lbl.grid(row=row, column=i)
|
||||||
|
|
||||||
|
row = 1
|
||||||
|
lbl = ttk.Label(frame)
|
||||||
|
lbl["text"] = _("Access level") + ": "
|
||||||
|
lbl.grid(row=row, column=0, **cpadw)
|
||||||
|
|
||||||
|
self.sb_level = tkinter.Spinbox(frame, width=4)
|
||||||
|
self.sb_level["from_"] = self.minlevel
|
||||||
|
self.sb_level["to"] = self.maxlevel
|
||||||
|
self.sb_level["state"] = self.__ro
|
||||||
|
self.sb_level["textvariable"] = self.var_acl
|
||||||
|
self.sb_level.grid(row=row, column=1, columnspan=8, sticky="w")
|
||||||
|
|
||||||
|
# Buttons neben IP-Eintrag
|
||||||
|
self.btn_add = ttk.Button(gb_edit)
|
||||||
|
self.btn_add["command"] = self._savefields
|
||||||
|
self.btn_add["state"] = self.__ro
|
||||||
|
self.btn_add["text"] = _("add to list")
|
||||||
|
self.btn_add.grid(column=0, row=1, sticky="e", padx=4, pady=4)
|
||||||
|
self.btn_clear = ttk.Button(gb_edit)
|
||||||
|
self.btn_clear["command"] = self._clearfields
|
||||||
|
self.btn_clear["state"] = self.__ro
|
||||||
|
self.btn_clear["text"] = _("clear")
|
||||||
|
self.btn_clear.grid(column=1, row=1, padx=4, pady=4)
|
||||||
|
|
||||||
|
# ############################################################
|
||||||
|
|
||||||
|
frame = ttk.Frame(self)
|
||||||
|
frame.columnconfigure(0, weight=1)
|
||||||
|
frame.columnconfigure(1, weight=1)
|
||||||
|
frame.pack(expand=True, fill="both", pady=4)
|
||||||
|
|
||||||
|
# Buttons
|
||||||
|
btn_save = ttk.Button(frame)
|
||||||
|
btn_save["command"] = self._save
|
||||||
|
btn_save["state"] = self.__ro
|
||||||
|
btn_save["text"] = _("Save")
|
||||||
|
btn_save.grid(column=0, row=0)
|
||||||
|
|
||||||
|
btn_close = ttk.Button(frame)
|
||||||
|
btn_close["command"] = self._checkclose
|
||||||
|
btn_close["text"] = _("Close")
|
||||||
|
btn_close.grid(column=1, row=0)
|
||||||
|
|
||||||
|
# Infotexte vorbereiten
|
||||||
|
self.aclinfo = ttk.Frame(self)
|
||||||
|
|
||||||
|
def _ask_delete(self):
|
||||||
|
u"""Löscht ein Eintrag der Liste."""
|
||||||
|
str_acl = self.trv_acl.focus()
|
||||||
|
if str_acl != "":
|
||||||
|
lst_ipacl = str_acl.split()
|
||||||
|
ask = tkmsg.askyesno(
|
||||||
|
_("Question"),
|
||||||
|
_("Do you really want to delete the following item? \n"
|
||||||
|
"\nIP: {} / Level: {}").format(*lst_ipacl),
|
||||||
|
parent=self.master, default="no"
|
||||||
|
)
|
||||||
|
if ask:
|
||||||
|
self.__acl.loadacl(
|
||||||
|
self.__acl.acl.replace(
|
||||||
|
"{},{}".format(*lst_ipacl), ""
|
||||||
|
).replace(" ", " ")
|
||||||
|
)
|
||||||
|
self._refreshacls()
|
||||||
|
|
||||||
|
def _clearfields(self):
|
||||||
|
u"""Leert die Eingabefelder."""
|
||||||
|
self.var_ip1.set("")
|
||||||
|
self.var_ip2.set("")
|
||||||
|
self.var_ip3.set("")
|
||||||
|
self.var_ip4.set("")
|
||||||
|
self.var_acl.set(self.minlevel)
|
||||||
|
|
||||||
|
def _loadfields(self):
|
||||||
|
u"""Übernimmt Listeneintrag in Editfelder."""
|
||||||
|
str_acl = self.trv_acl.focus()
|
||||||
|
if str_acl != "":
|
||||||
|
lst_ip, acl = str_acl.split()
|
||||||
|
lst_ip = lst_ip.split(".")
|
||||||
|
self.var_ip1.set(lst_ip[0])
|
||||||
|
self.var_ip2.set(lst_ip[1])
|
||||||
|
self.var_ip3.set(lst_ip[2])
|
||||||
|
self.var_ip4.set(lst_ip[3])
|
||||||
|
self.var_acl.set(acl)
|
||||||
|
|
||||||
|
def _refreshacls(self):
|
||||||
|
u"""Leert die ACL Liste und füllt sie neu."""
|
||||||
|
self.trv_acl.delete(*self.trv_acl.get_children())
|
||||||
|
for tup_acl in self.__acl:
|
||||||
|
self.trv_acl.insert(
|
||||||
|
"", "end", tup_acl, text=tup_acl[0], values=tup_acl[1]
|
||||||
|
)
|
||||||
|
|
||||||
|
def _save(self):
|
||||||
|
u"""Übernimt die Änderungen."""
|
||||||
|
self.__oldacl = self.__acl.acl
|
||||||
|
|
||||||
|
def _savefields(self):
|
||||||
|
u"""Übernimmt neuen ACL Eintrag."""
|
||||||
|
new_acl = "{}.{}.{}.{},{}".format(
|
||||||
|
self.var_ip1.get(),
|
||||||
|
self.var_ip2.get(),
|
||||||
|
self.var_ip3.get(),
|
||||||
|
self.var_ip4.get(),
|
||||||
|
self.var_acl.get()
|
||||||
|
)
|
||||||
|
if self.__acl.loadacl(self.__acl.acl + " " + new_acl):
|
||||||
|
self._refreshacls()
|
||||||
|
else:
|
||||||
|
tkmsg.showerror(
|
||||||
|
_("Error"),
|
||||||
|
_("Can not load new ACL! Check format."),
|
||||||
|
parent=self.master
|
||||||
|
)
|
||||||
|
|
||||||
|
def _status_editremove(self, tkevt):
|
||||||
|
u"""Setzt state der Buttons."""
|
||||||
|
if self.__ro == "normal":
|
||||||
|
status = "disabled" if self.trv_acl.focus() == "" else "normal"
|
||||||
|
self.btn_edit["state"] = status
|
||||||
|
self.btn_remove["state"] = status
|
||||||
|
|
||||||
|
def get_acl(self):
|
||||||
|
u"""Gibt die Konfigurierten ACL zurück.
|
||||||
|
@return ACL als <class 'str'>"""
|
||||||
|
return self.__oldacl
|
||||||
|
|
||||||
|
acl = property(get_acl)
|
||||||
|
acltext = property(__get_acltext, __set_acltext)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
root = AclManager(tkinter.Tk(), 0, 9, " 192.168.50.100,2 127.0.0.*,1")
|
||||||
|
root.acltext = {0: "Keine Rechte", 1: "Hohe Rechte"}
|
||||||
|
root.mainloop()
|
||||||
|
print(root.acl)
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
#
|
#
|
||||||
import tkinter
|
import tkinter
|
||||||
import tkinter.messagebox as tkmsg
|
import tkinter.messagebox as tkmsg
|
||||||
|
from aclmanager import AclManager
|
||||||
from mytools import gettrans
|
from mytools import gettrans
|
||||||
|
|
||||||
# Übersetzung laden
|
# Übersetzung laden
|
||||||
@@ -29,9 +30,10 @@ class RevPiOption(tkinter.Frame):
|
|||||||
self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
|
self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
|
||||||
self.pack(expand=True, fill="both")
|
self.pack(expand=True, fill="both")
|
||||||
|
|
||||||
|
# XML-RPC Server konfigurieren
|
||||||
self.xmlcli = xmlcli
|
self.xmlcli = xmlcli
|
||||||
self.mrk_var_xmlmod2 = False
|
self.xmlmodus = self.xmlcli.xmlmodus()
|
||||||
self.mrk_var_xmlmod3 = False
|
|
||||||
self.mrk_xmlmodask = False
|
self.mrk_xmlmodask = False
|
||||||
self.dorestart = False
|
self.dorestart = False
|
||||||
|
|
||||||
@@ -43,18 +45,20 @@ class RevPiOption(tkinter.Frame):
|
|||||||
u"""Prüft ob sich die Einstellungen geändert haben.
|
u"""Prüft ob sich die Einstellungen geändert haben.
|
||||||
@return True, wenn min. eine Einstellung geändert wurde"""
|
@return True, wenn min. eine Einstellung geändert wurde"""
|
||||||
return (
|
return (
|
||||||
self.var_start.get() != self.dc.get("autostart", "1")
|
self.var_start.get() != self.dc.get("autostart", 1)
|
||||||
or self.var_reload.get() != self.dc.get("autoreload", "1")
|
or self.var_reload.get() != self.dc.get("autoreload", 1)
|
||||||
or self.var_zexit.get() != self.dc.get("zeroonexit", "0")
|
or self.var_reload_delay.get() !=
|
||||||
or self.var_zerr.get() != self.dc.get("zeroonerror", "0")
|
str(self.dc.get("autoreloaddelay", 5))
|
||||||
|
or self.var_zexit.get() != self.dc.get("zeroonexit", 0)
|
||||||
|
or self.var_zerr.get() != self.dc.get("zeroonerror", 0)
|
||||||
|
# TODO: rtlevel (0)
|
||||||
or self.var_startpy.get() != self.dc.get("plcprogram", "none.py")
|
or self.var_startpy.get() != self.dc.get("plcprogram", "none.py")
|
||||||
or self.var_startargs.get() != self.dc.get("plcarguments", "")
|
or self.var_startargs.get() != self.dc.get("plcarguments", "")
|
||||||
or self.var_pythonver.get() != self.dc.get("pythonversion", "3")
|
or self.var_pythonver.get() != self.dc.get("pythonversion", 3)
|
||||||
or self.var_slave.get() != self.dc.get("plcslave", "0")
|
or self.var_slave.get() != self.dc.get("plcslave", 0)
|
||||||
or self.var_xmlon.get() != (self.dc.get("xmlrpc", 0) >= 1)
|
or self.var_slaveacl.get() != self.dc.get("plcslaveacl", "")
|
||||||
or self.var_xmlmod2.get() != (self.dc.get("xmlrpc", 0) >= 2)
|
or self.var_xmlon.get() != self.dc.get("xmlrpc", 0)
|
||||||
or self.var_xmlmod3.get() != (self.dc.get("xmlrpc", 0) >= 3)
|
or self.var_xmlacl.get() != self.dc.get("xmlrpcacl", "")
|
||||||
or self.var_xmlport.get() != self.dc.get("xmlrpcport", "55123")
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def _checkclose(self, event=None):
|
def _checkclose(self, event=None):
|
||||||
@@ -77,8 +81,9 @@ class RevPiOption(tkinter.Frame):
|
|||||||
self.master.wm_title(_("RevPi Python PLC Options"))
|
self.master.wm_title(_("RevPi Python PLC Options"))
|
||||||
self.master.wm_resizable(width=False, height=False)
|
self.master.wm_resizable(width=False, height=False)
|
||||||
|
|
||||||
xmlstate = "normal" if self.dc["xmlrpc"] >= 3 else "disabled"
|
xmlstate = "normal" if self.xmlmodus >= 4 else "disabled"
|
||||||
|
|
||||||
|
cpade = {"padx": 4, "pady": 2, "sticky": "e"}
|
||||||
cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
|
cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
|
||||||
cpadwe = {"padx": 4, "pady": 2, "sticky": "we"}
|
cpadwe = {"padx": 4, "pady": 2, "sticky": "we"}
|
||||||
|
|
||||||
@@ -89,6 +94,7 @@ class RevPiOption(tkinter.Frame):
|
|||||||
|
|
||||||
self.var_start = tkinter.BooleanVar(stst)
|
self.var_start = tkinter.BooleanVar(stst)
|
||||||
self.var_reload = tkinter.BooleanVar(stst)
|
self.var_reload = tkinter.BooleanVar(stst)
|
||||||
|
self.var_reload_delay = tkinter.StringVar(stst)
|
||||||
self.var_zexit = tkinter.BooleanVar(stst)
|
self.var_zexit = tkinter.BooleanVar(stst)
|
||||||
self.var_zerr = tkinter.BooleanVar(stst)
|
self.var_zerr = tkinter.BooleanVar(stst)
|
||||||
|
|
||||||
@@ -104,24 +110,26 @@ class RevPiOption(tkinter.Frame):
|
|||||||
ckb_reload["variable"] = self.var_reload
|
ckb_reload["variable"] = self.var_reload
|
||||||
ckb_reload.grid(**cpadw)
|
ckb_reload.grid(**cpadw)
|
||||||
|
|
||||||
|
lbl = tkinter.Label(stst)
|
||||||
|
lbl["text"] = _("Set process image to NULL if program terminates...")
|
||||||
|
lbl.grid(**cpadw)
|
||||||
|
|
||||||
ckb_zexit = tkinter.Checkbutton(stst, justify="left")
|
ckb_zexit = tkinter.Checkbutton(stst, justify="left")
|
||||||
ckb_zexit["state"] = xmlstate
|
ckb_zexit["state"] = xmlstate
|
||||||
ckb_zexit["text"] = _(
|
ckb_zexit["text"] = _("... successfully")
|
||||||
"Set process image to NULL if program\n"
|
|
||||||
"terminates successfully")
|
|
||||||
ckb_zexit["variable"] = self.var_zexit
|
ckb_zexit["variable"] = self.var_zexit
|
||||||
ckb_zexit.grid(**cpadw)
|
ckb_zexit.grid(**cpadw)
|
||||||
|
|
||||||
ckb_zerr = tkinter.Checkbutton(stst, justify="left")
|
ckb_zerr = tkinter.Checkbutton(stst, justify="left")
|
||||||
ckb_zerr["state"] = xmlstate
|
ckb_zerr["state"] = xmlstate
|
||||||
ckb_zerr["text"] = _(
|
ckb_zerr["text"] = _("... with errors")
|
||||||
"Set process image to NULL if program\n"
|
|
||||||
"terminates with errors")
|
|
||||||
ckb_zerr["variable"] = self.var_zerr
|
ckb_zerr["variable"] = self.var_zerr
|
||||||
ckb_zerr.grid(**cpadw)
|
ckb_zerr.grid(**cpadw)
|
||||||
|
|
||||||
# Gruppe Programm
|
# Gruppe Programm
|
||||||
prog = tkinter.LabelFrame(self)
|
prog = tkinter.LabelFrame(self)
|
||||||
|
prog.columnconfigure(0, weight=1)
|
||||||
|
prog.columnconfigure(1, weight=1)
|
||||||
prog["text"] = _("PLC program")
|
prog["text"] = _("PLC program")
|
||||||
prog.grid(columnspan=2, pady=2, sticky="we")
|
prog.grid(columnspan=2, pady=2, sticky="we")
|
||||||
|
|
||||||
@@ -129,18 +137,20 @@ class RevPiOption(tkinter.Frame):
|
|||||||
self.var_startpy = tkinter.StringVar(prog)
|
self.var_startpy = tkinter.StringVar(prog)
|
||||||
self.var_startargs = tkinter.StringVar(prog)
|
self.var_startargs = tkinter.StringVar(prog)
|
||||||
self.var_slave = tkinter.BooleanVar(prog)
|
self.var_slave = tkinter.BooleanVar(prog)
|
||||||
|
self.var_slaveacl = tkinter.StringVar(prog)
|
||||||
|
|
||||||
self.var_pythonver.set(3)
|
self.var_pythonver.set(3)
|
||||||
|
|
||||||
lbl = tkinter.Label(prog)
|
lbl = tkinter.Label(prog)
|
||||||
lbl["text"] = _("Python version")
|
lbl["text"] = _("Python version") + ":"
|
||||||
lbl.grid(columnspan=2, row=0, **cpadw)
|
lbl.grid(columnspan=2, row=0, **cpadw)
|
||||||
|
|
||||||
rbn = tkinter.Radiobutton(prog)
|
rbn = tkinter.Radiobutton(prog)
|
||||||
rbn["state"] = xmlstate
|
rbn["state"] = xmlstate
|
||||||
rbn["text"] = "Python2"
|
rbn["text"] = "Python2"
|
||||||
rbn["value"] = 2
|
rbn["value"] = 2
|
||||||
rbn["variable"] = self.var_pythonver
|
rbn["variable"] = self.var_pythonver
|
||||||
rbn.grid(column=0, row=1, **cpadw)
|
rbn.grid(column=0, row=1, **cpade)
|
||||||
|
|
||||||
rbn = tkinter.Radiobutton(prog)
|
rbn = tkinter.Radiobutton(prog)
|
||||||
rbn["state"] = xmlstate
|
rbn["state"] = xmlstate
|
||||||
@@ -149,32 +159,42 @@ class RevPiOption(tkinter.Frame):
|
|||||||
rbn["variable"] = self.var_pythonver
|
rbn["variable"] = self.var_pythonver
|
||||||
rbn.grid(column=1, row=1, **cpadw)
|
rbn.grid(column=1, row=1, **cpadw)
|
||||||
|
|
||||||
|
# Row 2
|
||||||
lbl = tkinter.Label(prog)
|
lbl = tkinter.Label(prog)
|
||||||
lbl["text"] = _("Python PLC program name")
|
lbl["text"] = _("Python PLC program name")
|
||||||
lbl.grid(columnspan=2, **cpadw)
|
lbl.grid(columnspan=2, **cpadw)
|
||||||
|
|
||||||
|
# Row 3
|
||||||
lst = self.xmlcli.get_filelist()
|
lst = self.xmlcli.get_filelist()
|
||||||
if len(lst) == 0:
|
if len(lst) == 0:
|
||||||
lst.append("none")
|
lst.append("none")
|
||||||
opt_startpy = tkinter.OptionMenu(
|
opt_startpy = tkinter.OptionMenu(
|
||||||
prog, self.var_startpy, *lst)
|
prog, self.var_startpy, *lst
|
||||||
|
)
|
||||||
opt_startpy["state"] = xmlstate
|
opt_startpy["state"] = xmlstate
|
||||||
opt_startpy.grid(columnspan=2, **cpadwe)
|
opt_startpy.grid(columnspan=2, **cpadwe)
|
||||||
|
|
||||||
|
# Row 4
|
||||||
lbl = tkinter.Label(prog)
|
lbl = tkinter.Label(prog)
|
||||||
lbl["text"] = _("Program arguments")
|
lbl["text"] = _("Program arguments")
|
||||||
lbl.grid(columnspan=2, **cpadw)
|
lbl.grid(columnspan=2, **cpadw)
|
||||||
|
|
||||||
|
# Row 5
|
||||||
txt = tkinter.Entry(prog)
|
txt = tkinter.Entry(prog)
|
||||||
txt["textvariable"] = self.var_startargs
|
txt["textvariable"] = self.var_startargs
|
||||||
txt.grid(columnspan=2, **cpadw)
|
txt.grid(columnspan=2, **cpadw)
|
||||||
|
|
||||||
|
# Row 6
|
||||||
ckb_slave = tkinter.Checkbutton(prog, justify="left")
|
ckb_slave = tkinter.Checkbutton(prog, justify="left")
|
||||||
ckb_slave["state"] = xmlstate
|
ckb_slave["state"] = xmlstate
|
||||||
ckb_slave["text"] = _("Use RevPi as PLC-Slave")
|
ckb_slave["text"] = _("Use RevPi as PLC-Slave")
|
||||||
ckb_slave["state"] = "disabled"
|
|
||||||
ckb_slave["variable"] = self.var_slave
|
ckb_slave["variable"] = self.var_slave
|
||||||
ckb_slave.grid(columnspan=2, **cpadw)
|
ckb_slave.grid(column=0, **cpadw)
|
||||||
|
|
||||||
|
btn_slaveacl = tkinter.Button(prog, justify="center")
|
||||||
|
btn_slaveacl["command"] = self.btn_slaveacl
|
||||||
|
btn_slaveacl["text"] = _("Edit ACL")
|
||||||
|
btn_slaveacl.grid(column=1, row=6, **cpade)
|
||||||
|
|
||||||
# Gruppe XMLRPC
|
# Gruppe XMLRPC
|
||||||
xmlrpc = tkinter.LabelFrame(self)
|
xmlrpc = tkinter.LabelFrame(self)
|
||||||
@@ -182,10 +202,7 @@ class RevPiOption(tkinter.Frame):
|
|||||||
xmlrpc.grid(columnspan=2, pady=2, sticky="we")
|
xmlrpc.grid(columnspan=2, pady=2, sticky="we")
|
||||||
|
|
||||||
self.var_xmlon = tkinter.BooleanVar(xmlrpc)
|
self.var_xmlon = tkinter.BooleanVar(xmlrpc)
|
||||||
self.var_xmlmod2 = tkinter.BooleanVar(xmlrpc)
|
self.var_xmlacl = tkinter.StringVar(xmlrpc)
|
||||||
self.var_xmlmod3 = tkinter.BooleanVar(xmlrpc)
|
|
||||||
self.var_xmlport = tkinter.StringVar(xmlrpc)
|
|
||||||
self.var_xmlport.set("55123")
|
|
||||||
|
|
||||||
ckb_xmlon = tkinter.Checkbutton(xmlrpc)
|
ckb_xmlon = tkinter.Checkbutton(xmlrpc)
|
||||||
ckb_xmlon["command"] = self.askxmlon
|
ckb_xmlon["command"] = self.askxmlon
|
||||||
@@ -194,31 +211,10 @@ class RevPiOption(tkinter.Frame):
|
|||||||
ckb_xmlon["variable"] = self.var_xmlon
|
ckb_xmlon["variable"] = self.var_xmlon
|
||||||
ckb_xmlon.grid(**cpadw)
|
ckb_xmlon.grid(**cpadw)
|
||||||
|
|
||||||
self.ckb_xmlmod2 = tkinter.Checkbutton(xmlrpc, justify="left")
|
btn_slaveacl = tkinter.Button(xmlrpc, justify="center")
|
||||||
self.ckb_xmlmod2["command"] = self.xmlmod2_tail
|
btn_slaveacl["command"] = self.btn_xmlacl
|
||||||
self.ckb_xmlmod2["state"] = xmlstate
|
btn_slaveacl["text"] = _("Edit ACL")
|
||||||
self.ckb_xmlmod2["text"] = \
|
btn_slaveacl.grid(column=1, row=0, **cpade)
|
||||||
_("Allow download of piCtory configuration and\nPLC programm")
|
|
||||||
self.ckb_xmlmod2["variable"] = self.var_xmlmod2
|
|
||||||
self.ckb_xmlmod2.grid(**cpadw)
|
|
||||||
|
|
||||||
self.ckb_xmlmod3 = tkinter.Checkbutton(xmlrpc, justify="left")
|
|
||||||
self.ckb_xmlmod3["state"] = xmlstate
|
|
||||||
self.ckb_xmlmod3["text"] = \
|
|
||||||
_("Allow upload of piCtory configuration and\nPLC programm")
|
|
||||||
self.ckb_xmlmod3["variable"] = self.var_xmlmod3
|
|
||||||
self.ckb_xmlmod3.grid(**cpadw)
|
|
||||||
|
|
||||||
lbl = tkinter.Label(xmlrpc)
|
|
||||||
lbl["text"] = _("XML-RPC server port")
|
|
||||||
lbl.grid(**cpadw)
|
|
||||||
|
|
||||||
spb_xmlport = tkinter.Spinbox(xmlrpc)
|
|
||||||
spb_xmlport["to"] = 65535
|
|
||||||
spb_xmlport["from"] = 1024
|
|
||||||
spb_xmlport["state"] = xmlstate
|
|
||||||
spb_xmlport["textvariable"] = self.var_xmlport
|
|
||||||
spb_xmlport.grid(**cpadwe)
|
|
||||||
|
|
||||||
# Buttons
|
# Buttons
|
||||||
btn_save = tkinter.Button(self)
|
btn_save = tkinter.Button(self)
|
||||||
@@ -238,23 +234,22 @@ class RevPiOption(tkinter.Frame):
|
|||||||
if refresh:
|
if refresh:
|
||||||
self.dc = self.xmlcli.get_config()
|
self.dc = self.xmlcli.get_config()
|
||||||
|
|
||||||
self.var_start.set(self.dc.get("autostart", "1"))
|
self.var_start.set(self.dc.get("autostart", 1))
|
||||||
self.var_reload.set(self.dc.get("autoreload", "1"))
|
self.var_reload.set(self.dc.get("autoreload", 1))
|
||||||
self.var_zexit.set(self.dc.get("zeroonexit", "0"))
|
self.var_reload_delay.set(self.dc.get("autoreloaddelay", 5))
|
||||||
self.var_zerr.set(self.dc.get("zeroonerror", "0"))
|
self.var_zexit.set(self.dc.get("zeroonexit", 0))
|
||||||
|
self.var_zerr.set(self.dc.get("zeroonerror", 0))
|
||||||
|
# TODO: rtlevel (0)
|
||||||
|
|
||||||
self.var_startpy.set(self.dc.get("plcprogram", "none.py"))
|
self.var_startpy.set(self.dc.get("plcprogram", "none.py"))
|
||||||
self.var_startargs.set(self.dc.get("plcarguments", ""))
|
self.var_startargs.set(self.dc.get("plcarguments", ""))
|
||||||
self.var_pythonver.set(self.dc.get("pythonversion", "3"))
|
self.var_pythonver.set(self.dc.get("pythonversion", 3))
|
||||||
self.var_slave.set(self.dc.get("plcslave", "0"))
|
|
||||||
|
|
||||||
self.var_xmlon.set(self.dc.get("xmlrpc", 0) >= 1)
|
self.var_slave.set(self.dc.get("plcslave", 0))
|
||||||
self.var_xmlmod2.set(self.dc.get("xmlrpc", 0) >= 2)
|
self.var_slaveacl.set(self.dc.get("plcslaveacl", ""))
|
||||||
self.mrk_var_xmlmod2 = self.var_xmlmod2.get()
|
|
||||||
self.var_xmlmod3.set(self.dc.get("xmlrpc", 0) >= 3)
|
|
||||||
self.mrk_var_xmlmod3 = self.var_xmlmod3.get()
|
|
||||||
|
|
||||||
self.var_xmlport.set(self.dc.get("xmlrpcport", "55123"))
|
self.var_xmlon.set(self.dc.get("xmlrpc", 0))
|
||||||
|
self.var_xmlacl.set(self.dc.get("xmlrpcacl", ""))
|
||||||
|
|
||||||
def _setappdata(self):
|
def _setappdata(self):
|
||||||
u"""Speichert geänderte Einstellungen auf RevPi.
|
u"""Speichert geänderte Einstellungen auf RevPi.
|
||||||
@@ -276,25 +271,21 @@ class RevPiOption(tkinter.Frame):
|
|||||||
parent=self.master
|
parent=self.master
|
||||||
)
|
)
|
||||||
if ask is not None:
|
if ask is not None:
|
||||||
self.dc["autostart"] = int(self.var_start.get())
|
|
||||||
self.dc["autoreload"] = int(self.var_reload.get())
|
self.dc["autoreload"] = int(self.var_reload.get())
|
||||||
self.dc["zeroonexit"] = int(self.var_zexit.get())
|
self.dc["autoreloaddelay"] = int(self.var_reload_delay.get())
|
||||||
self.dc["zeroonerror"] = int(self.var_zerr.get())
|
self.dc["autostart"] = int(self.var_start.get())
|
||||||
|
|
||||||
self.dc["plcprogram"] = self.var_startpy.get()
|
self.dc["plcprogram"] = self.var_startpy.get()
|
||||||
self.dc["plcarguments"] = self.var_startargs.get()
|
self.dc["plcarguments"] = self.var_startargs.get()
|
||||||
self.dc["pythonversion"] = self.var_pythonver.get()
|
self.dc["pythonversion"] = self.var_pythonver.get()
|
||||||
|
# TODO: rtlevel (0)
|
||||||
|
self.dc["zeroonerror"] = int(self.var_zerr.get())
|
||||||
|
self.dc["zeroonexit"] = int(self.var_zexit.get())
|
||||||
|
|
||||||
self.dc["plcslave"] = int(self.var_slave.get())
|
self.dc["plcslave"] = int(self.var_slave.get())
|
||||||
|
self.dc["plcslaveacl"] = self.var_slaveacl.get()
|
||||||
|
|
||||||
self.dc["xmlrpc"] = 0
|
self.dc["xmlrpc"] = int(self.var_xmlon.get())
|
||||||
if self.var_xmlon.get():
|
self.dc["xmlrpcacl"] = self.var_xmlacl.get()
|
||||||
self.dc["xmlrpc"] += 1
|
|
||||||
if self.var_xmlmod2.get():
|
|
||||||
self.dc["xmlrpc"] += 1
|
|
||||||
if self.var_xmlmod3.get():
|
|
||||||
self.dc["xmlrpc"] += 1
|
|
||||||
|
|
||||||
self.dc["xmlrpcport"] = self.var_xmlport.get()
|
|
||||||
|
|
||||||
if self.xmlcli.set_config(self.dc, ask):
|
if self.xmlcli.set_config(self.dc, ask):
|
||||||
tkmsg.showinfo(
|
tkmsg.showinfo(
|
||||||
@@ -325,25 +316,39 @@ class RevPiOption(tkinter.Frame):
|
|||||||
if not self.mrk_xmlmodask:
|
if not self.mrk_xmlmodask:
|
||||||
self.var_xmlon.set(True)
|
self.var_xmlon.set(True)
|
||||||
|
|
||||||
self.xmlmod_tail()
|
def btn_slaveacl(self):
|
||||||
|
u"""Öffnet Fenster für ACL-Verwaltung."""
|
||||||
|
win = tkinter.Toplevel(self)
|
||||||
|
win.focus_set()
|
||||||
|
win.grab_set()
|
||||||
|
slaveacl = AclManager(
|
||||||
|
win, 0, 1,
|
||||||
|
self.var_slaveacl.get(),
|
||||||
|
readonly=self.xmlmodus < 4
|
||||||
|
)
|
||||||
|
slaveacl.acltext = {
|
||||||
|
0: _("read only"),
|
||||||
|
1: _("read and write")
|
||||||
|
}
|
||||||
|
self.wait_window(win)
|
||||||
|
self.var_slaveacl.set(slaveacl.acl)
|
||||||
|
|
||||||
def xmlmod_tail(self):
|
def btn_xmlacl(self):
|
||||||
u"""Passt XML-Optionszugriff an."""
|
u"""Öffnet Fenster für ACL-Verwaltung."""
|
||||||
if self.var_xmlon.get():
|
win = tkinter.Toplevel(self)
|
||||||
self.var_xmlmod2.set(self.mrk_var_xmlmod2)
|
win.focus_set()
|
||||||
self.ckb_xmlmod2["state"] = "normal"
|
win.grab_set()
|
||||||
else:
|
slaveacl = AclManager(
|
||||||
self.mrk_var_xmlmod2 = self.var_xmlmod2.get()
|
win, 0, 4,
|
||||||
self.var_xmlmod2.set(False)
|
self.var_xmlacl.get(),
|
||||||
self.ckb_xmlmod2["state"] = "disabled"
|
readonly=self.xmlmodus < 4
|
||||||
self.xmlmod2_tail()
|
)
|
||||||
|
slaveacl.acltext = {
|
||||||
def xmlmod2_tail(self):
|
0: _("Start/Stop PLC program and read logs"),
|
||||||
u"""Passt XML-Optionszugriff an."""
|
1: _("+ read IOs in watch modus"),
|
||||||
if self.var_xmlmod2.get():
|
2: _("+ read properties and download PLC program"),
|
||||||
self.var_xmlmod3.set(self.mrk_var_xmlmod3)
|
3: _("+ upload PLC program"),
|
||||||
self.ckb_xmlmod3["state"] = "normal"
|
4: _("+ set properties")
|
||||||
else:
|
}
|
||||||
self.mrk_var_xmlmod3 = self.var_xmlmod3.get()
|
self.wait_window(win)
|
||||||
self.var_xmlmod3.set(False)
|
self.var_xmlacl.set(slaveacl.acl)
|
||||||
self.ckb_xmlmod3["state"] = "disabled"
|
|
||||||
|
|||||||
355
revpipycontrol/revpioptionlegacy.py
Normal file
355
revpipycontrol/revpioptionlegacy.py
Normal file
@@ -0,0 +1,355 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# RevPiPyControl
|
||||||
|
#
|
||||||
|
# Webpage: https://revpimodio.org/revpipyplc/
|
||||||
|
# (c) Sven Sager, License: LGPLv3
|
||||||
|
#
|
||||||
|
import tkinter
|
||||||
|
import tkinter.messagebox as tkmsg
|
||||||
|
from mytools import gettrans
|
||||||
|
|
||||||
|
# Übersetzung laden
|
||||||
|
_ = gettrans()
|
||||||
|
|
||||||
|
|
||||||
|
class RevPiOption(tkinter.Frame):
|
||||||
|
|
||||||
|
def __init__(self, master, xmlcli):
|
||||||
|
u"""Init RevPiOption-Class.
|
||||||
|
@return None"""
|
||||||
|
try:
|
||||||
|
self.dc = xmlcli.get_config()
|
||||||
|
except:
|
||||||
|
self.dc = None
|
||||||
|
return None
|
||||||
|
|
||||||
|
super().__init__(master)
|
||||||
|
self.master.bind("<KeyPress-Escape>", self._checkclose)
|
||||||
|
self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
|
||||||
|
self.pack(expand=True, fill="both")
|
||||||
|
|
||||||
|
self.xmlcli = xmlcli
|
||||||
|
self.mrk_var_xmlmod2 = False
|
||||||
|
self.mrk_var_xmlmod3 = False
|
||||||
|
self.mrk_xmlmodask = False
|
||||||
|
self.dorestart = False
|
||||||
|
|
||||||
|
# Fenster bauen
|
||||||
|
self._createwidgets()
|
||||||
|
self._loadappdata()
|
||||||
|
|
||||||
|
def _changesdone(self):
|
||||||
|
u"""Prüft ob sich die Einstellungen geändert haben.
|
||||||
|
@return True, wenn min. eine Einstellung geändert wurde"""
|
||||||
|
return (
|
||||||
|
self.var_start.get() != self.dc.get("autostart", "1")
|
||||||
|
or self.var_reload.get() != self.dc.get("autoreload", "1")
|
||||||
|
or self.var_zexit.get() != self.dc.get("zeroonexit", "0")
|
||||||
|
or self.var_zerr.get() != self.dc.get("zeroonerror", "0")
|
||||||
|
or self.var_startpy.get() != self.dc.get("plcprogram", "none.py")
|
||||||
|
or self.var_startargs.get() != self.dc.get("plcarguments", "")
|
||||||
|
or self.var_pythonver.get() != self.dc.get("pythonversion", "3")
|
||||||
|
or self.var_slave.get() != self.dc.get("plcslave", "0")
|
||||||
|
or self.var_xmlon.get() != (self.dc.get("xmlrpc", 0) >= 1)
|
||||||
|
or self.var_xmlmod2.get() != (self.dc.get("xmlrpc", 0) >= 2)
|
||||||
|
or self.var_xmlmod3.get() != (self.dc.get("xmlrpc", 0) >= 3)
|
||||||
|
# or self.var_xmlport.get() != self.dc.get("xmlrpcport", "55123")
|
||||||
|
)
|
||||||
|
|
||||||
|
def _checkclose(self, event=None):
|
||||||
|
u"""Prüft ob Fenster beendet werden soll.
|
||||||
|
@param event tkinter-Event"""
|
||||||
|
ask = True
|
||||||
|
if self._changesdone():
|
||||||
|
ask = tkmsg.askyesno(
|
||||||
|
_("Question"),
|
||||||
|
_("Do you really want to quit? \nUnsaved changes will "
|
||||||
|
"be lost"),
|
||||||
|
parent=self.master, default="no"
|
||||||
|
)
|
||||||
|
|
||||||
|
if ask:
|
||||||
|
self.master.destroy()
|
||||||
|
|
||||||
|
def _createwidgets(self):
|
||||||
|
u"""Erstellt Widgets."""
|
||||||
|
self.master.wm_title(_("RevPi Python PLC Options"))
|
||||||
|
self.master.wm_resizable(width=False, height=False)
|
||||||
|
|
||||||
|
xmlstate = "normal" if self.dc["xmlrpc"] >= 3 else "disabled"
|
||||||
|
|
||||||
|
cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
|
||||||
|
cpadwe = {"padx": 4, "pady": 2, "sticky": "we"}
|
||||||
|
|
||||||
|
# Gruppe Start/Stop
|
||||||
|
stst = tkinter.LabelFrame(self)
|
||||||
|
stst["text"] = _("Start / Stop behavior")
|
||||||
|
stst.grid(columnspan=2, pady=2, sticky="we")
|
||||||
|
|
||||||
|
self.var_start = tkinter.BooleanVar(stst)
|
||||||
|
self.var_reload = tkinter.BooleanVar(stst)
|
||||||
|
self.var_zexit = tkinter.BooleanVar(stst)
|
||||||
|
self.var_zerr = tkinter.BooleanVar(stst)
|
||||||
|
|
||||||
|
ckb_start = tkinter.Checkbutton(stst)
|
||||||
|
ckb_start["text"] = _("Start program automatically")
|
||||||
|
ckb_start["state"] = xmlstate
|
||||||
|
ckb_start["variable"] = self.var_start
|
||||||
|
ckb_start.grid(**cpadw)
|
||||||
|
|
||||||
|
ckb_reload = tkinter.Checkbutton(stst)
|
||||||
|
ckb_reload["text"] = _("Restart program after exit")
|
||||||
|
ckb_reload["state"] = xmlstate
|
||||||
|
ckb_reload["variable"] = self.var_reload
|
||||||
|
ckb_reload.grid(**cpadw)
|
||||||
|
|
||||||
|
lbl = tkinter.Label(stst)
|
||||||
|
lbl["text"] = _("Set process image to NULL if program terminates...")
|
||||||
|
lbl.grid(**cpadw)
|
||||||
|
|
||||||
|
ckb_zexit = tkinter.Checkbutton(stst, justify="left")
|
||||||
|
ckb_zexit["state"] = xmlstate
|
||||||
|
ckb_zexit["text"] = _("... successfully")
|
||||||
|
ckb_zexit["variable"] = self.var_zexit
|
||||||
|
ckb_zexit.grid(**cpadw)
|
||||||
|
|
||||||
|
ckb_zerr = tkinter.Checkbutton(stst, justify="left")
|
||||||
|
ckb_zerr["state"] = xmlstate
|
||||||
|
ckb_zerr["text"] = _("... with errors")
|
||||||
|
ckb_zerr["variable"] = self.var_zerr
|
||||||
|
ckb_zerr.grid(**cpadw)
|
||||||
|
|
||||||
|
# Gruppe Programm
|
||||||
|
prog = tkinter.LabelFrame(self)
|
||||||
|
prog["text"] = _("PLC program")
|
||||||
|
prog.grid(columnspan=2, pady=2, sticky="we")
|
||||||
|
|
||||||
|
self.var_pythonver = tkinter.IntVar(prog)
|
||||||
|
self.var_startpy = tkinter.StringVar(prog)
|
||||||
|
self.var_startargs = tkinter.StringVar(prog)
|
||||||
|
self.var_slave = tkinter.BooleanVar(prog)
|
||||||
|
|
||||||
|
self.var_pythonver.set(3)
|
||||||
|
|
||||||
|
lbl = tkinter.Label(prog)
|
||||||
|
lbl["text"] = _("Python version")
|
||||||
|
lbl.grid(columnspan=2, row=0, **cpadw)
|
||||||
|
|
||||||
|
rbn = tkinter.Radiobutton(prog)
|
||||||
|
rbn["state"] = xmlstate
|
||||||
|
rbn["text"] = "Python2"
|
||||||
|
rbn["value"] = 2
|
||||||
|
rbn["variable"] = self.var_pythonver
|
||||||
|
rbn.grid(column=0, row=1, **cpadw)
|
||||||
|
|
||||||
|
rbn = tkinter.Radiobutton(prog)
|
||||||
|
rbn["state"] = xmlstate
|
||||||
|
rbn["text"] = "Python3"
|
||||||
|
rbn["value"] = 3
|
||||||
|
rbn["variable"] = self.var_pythonver
|
||||||
|
rbn.grid(column=1, row=1, **cpadw)
|
||||||
|
|
||||||
|
# Row 2
|
||||||
|
lbl = tkinter.Label(prog)
|
||||||
|
lbl["text"] = _("Python PLC program name")
|
||||||
|
lbl.grid(columnspan=2, **cpadw)
|
||||||
|
|
||||||
|
# Row 3
|
||||||
|
lst = self.xmlcli.get_filelist()
|
||||||
|
if len(lst) == 0:
|
||||||
|
lst.append("none")
|
||||||
|
opt_startpy = tkinter.OptionMenu(
|
||||||
|
prog, self.var_startpy, *lst
|
||||||
|
)
|
||||||
|
opt_startpy["state"] = xmlstate
|
||||||
|
opt_startpy.grid(columnspan=2, **cpadwe)
|
||||||
|
|
||||||
|
# Row 4
|
||||||
|
lbl = tkinter.Label(prog)
|
||||||
|
lbl["text"] = _("Program arguments")
|
||||||
|
lbl.grid(columnspan=2, **cpadw)
|
||||||
|
|
||||||
|
# Row 5
|
||||||
|
txt = tkinter.Entry(prog)
|
||||||
|
txt["textvariable"] = self.var_startargs
|
||||||
|
txt.grid(columnspan=2, **cpadw)
|
||||||
|
|
||||||
|
# Row 6
|
||||||
|
ckb_slave = tkinter.Checkbutton(prog, justify="left")
|
||||||
|
ckb_slave["state"] = xmlstate
|
||||||
|
ckb_slave["text"] = _("Use RevPi as PLC-Slave")
|
||||||
|
ckb_slave["variable"] = self.var_slave
|
||||||
|
ckb_slave.grid(column=0, **cpadw)
|
||||||
|
|
||||||
|
# Gruppe XMLRPC
|
||||||
|
xmlrpc = tkinter.LabelFrame(self)
|
||||||
|
xmlrpc["text"] = _("XML-RPC server")
|
||||||
|
xmlrpc.grid(columnspan=2, pady=2, sticky="we")
|
||||||
|
|
||||||
|
self.var_xmlon = tkinter.BooleanVar(xmlrpc)
|
||||||
|
self.var_xmlmod2 = tkinter.BooleanVar(xmlrpc)
|
||||||
|
self.var_xmlmod3 = tkinter.BooleanVar(xmlrpc)
|
||||||
|
# self.var_xmlport = tkinter.StringVar(xmlrpc)
|
||||||
|
# self.var_xmlport.set("55123")
|
||||||
|
|
||||||
|
ckb_xmlon = tkinter.Checkbutton(xmlrpc)
|
||||||
|
ckb_xmlon["command"] = self.askxmlon
|
||||||
|
ckb_xmlon["state"] = xmlstate
|
||||||
|
ckb_xmlon["text"] = _("Activate XML-RPC server on RevPi")
|
||||||
|
ckb_xmlon["variable"] = self.var_xmlon
|
||||||
|
ckb_xmlon.grid(**cpadw)
|
||||||
|
|
||||||
|
self.ckb_xmlmod2 = tkinter.Checkbutton(xmlrpc, justify="left")
|
||||||
|
self.ckb_xmlmod2["command"] = self.xmlmod2_tail
|
||||||
|
self.ckb_xmlmod2["state"] = xmlstate
|
||||||
|
self.ckb_xmlmod2["text"] = \
|
||||||
|
_("Allow download of piCtory configuration and\nPLC programm")
|
||||||
|
self.ckb_xmlmod2["variable"] = self.var_xmlmod2
|
||||||
|
self.ckb_xmlmod2.grid(**cpadw)
|
||||||
|
|
||||||
|
self.ckb_xmlmod3 = tkinter.Checkbutton(xmlrpc, justify="left")
|
||||||
|
self.ckb_xmlmod3["state"] = xmlstate
|
||||||
|
self.ckb_xmlmod3["text"] = \
|
||||||
|
_("Allow upload of piCtory configuration and\nPLC programm")
|
||||||
|
self.ckb_xmlmod3["variable"] = self.var_xmlmod3
|
||||||
|
self.ckb_xmlmod3.grid(**cpadw)
|
||||||
|
|
||||||
|
lbl = tkinter.Label(xmlrpc)
|
||||||
|
lbl["text"] = _("XML-RPC server port")
|
||||||
|
lbl.grid(**cpadw)
|
||||||
|
|
||||||
|
# spb_xmlport = tkinter.Spinbox(xmlrpc)
|
||||||
|
# spb_xmlport["to"] = 65535
|
||||||
|
# spb_xmlport["from"] = 1024
|
||||||
|
# spb_xmlport["state"] = xmlstate
|
||||||
|
# spb_xmlport["textvariable"] = self.var_xmlport
|
||||||
|
# spb_xmlport.grid(**cpadwe)
|
||||||
|
|
||||||
|
# Buttons
|
||||||
|
btn_save = tkinter.Button(self)
|
||||||
|
btn_save["command"] = self._setappdata
|
||||||
|
btn_save["state"] = xmlstate
|
||||||
|
btn_save["text"] = _("Save")
|
||||||
|
btn_save.grid(column=0, row=3)
|
||||||
|
|
||||||
|
btn_close = tkinter.Button(self)
|
||||||
|
btn_close["command"] = self._checkclose
|
||||||
|
btn_close["text"] = _("Close")
|
||||||
|
btn_close.grid(column=1, row=3)
|
||||||
|
|
||||||
|
def _loadappdata(self, refresh=False):
|
||||||
|
u"""Läd aktuelle Einstellungen vom RevPi.
|
||||||
|
@param refresh Wenn True, werden Einstellungen heruntergeladen."""
|
||||||
|
if refresh:
|
||||||
|
self.dc = self.xmlcli.get_config()
|
||||||
|
|
||||||
|
self.var_start.set(self.dc.get("autostart", "1"))
|
||||||
|
self.var_reload.set(self.dc.get("autoreload", "1"))
|
||||||
|
self.var_zexit.set(self.dc.get("zeroonexit", "0"))
|
||||||
|
self.var_zerr.set(self.dc.get("zeroonerror", "0"))
|
||||||
|
|
||||||
|
self.var_startpy.set(self.dc.get("plcprogram", "none.py"))
|
||||||
|
self.var_startargs.set(self.dc.get("plcarguments", ""))
|
||||||
|
self.var_pythonver.set(self.dc.get("pythonversion", "3"))
|
||||||
|
self.var_slave.set(self.dc.get("plcslave", "0"))
|
||||||
|
|
||||||
|
self.var_xmlon.set(self.dc.get("xmlrpc", 0) >= 1)
|
||||||
|
self.var_xmlmod2.set(self.dc.get("xmlrpc", 0) >= 2)
|
||||||
|
self.mrk_var_xmlmod2 = self.var_xmlmod2.get()
|
||||||
|
self.var_xmlmod3.set(self.dc.get("xmlrpc", 0) >= 3)
|
||||||
|
self.mrk_var_xmlmod3 = self.var_xmlmod3.get()
|
||||||
|
|
||||||
|
# self.var_xmlport.set(self.dc.get("xmlrpcport", "55123"))
|
||||||
|
|
||||||
|
def _setappdata(self):
|
||||||
|
u"""Speichert geänderte Einstellungen auf RevPi.
|
||||||
|
@return None"""
|
||||||
|
|
||||||
|
if not self._changesdone():
|
||||||
|
tkmsg.showinfo(
|
||||||
|
_("Information"),
|
||||||
|
_("You have not made any changes to save."),
|
||||||
|
)
|
||||||
|
self._checkclose()
|
||||||
|
return None
|
||||||
|
|
||||||
|
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
|
||||||
|
)
|
||||||
|
if ask is not None:
|
||||||
|
self.dc["autostart"] = int(self.var_start.get())
|
||||||
|
self.dc["autoreload"] = int(self.var_reload.get())
|
||||||
|
self.dc["zeroonexit"] = int(self.var_zexit.get())
|
||||||
|
self.dc["zeroonerror"] = int(self.var_zerr.get())
|
||||||
|
|
||||||
|
self.dc["plcprogram"] = self.var_startpy.get()
|
||||||
|
self.dc["plcarguments"] = self.var_startargs.get()
|
||||||
|
self.dc["pythonversion"] = self.var_pythonver.get()
|
||||||
|
self.dc["plcslave"] = int(self.var_slave.get())
|
||||||
|
|
||||||
|
self.dc["xmlrpc"] = 0
|
||||||
|
if self.var_xmlon.get():
|
||||||
|
self.dc["xmlrpc"] += 1
|
||||||
|
if self.var_xmlmod2.get():
|
||||||
|
self.dc["xmlrpc"] += 1
|
||||||
|
if self.var_xmlmod3.get():
|
||||||
|
self.dc["xmlrpc"] += 1
|
||||||
|
|
||||||
|
# self.dc["xmlrpcport"] = self.var_xmlport.get()
|
||||||
|
|
||||||
|
if self.xmlcli.set_config(self.dc, ask):
|
||||||
|
tkmsg.showinfo(
|
||||||
|
_("Information"),
|
||||||
|
_("Settings saved"),
|
||||||
|
parent=self.master
|
||||||
|
)
|
||||||
|
self.dorestart = ask
|
||||||
|
self._checkclose()
|
||||||
|
else:
|
||||||
|
tkmsg.showerror(
|
||||||
|
_("Error"),
|
||||||
|
_("The settings could not be saved. This can happen if "
|
||||||
|
"values are wrong!"),
|
||||||
|
parent=self.master
|
||||||
|
)
|
||||||
|
|
||||||
|
def askxmlon(self):
|
||||||
|
u"""Fragt Nuter, ob wirklicht abgeschaltet werden soll."""
|
||||||
|
if not (self.var_xmlon.get() or self.mrk_xmlmodask):
|
||||||
|
self.mrk_xmlmodask = tkmsg.askyesno(
|
||||||
|
_("Question"),
|
||||||
|
_("Are you sure you want to deactivate the XML-RPC server? "
|
||||||
|
"You will NOT be able to access the Revolution Pi with "
|
||||||
|
"this program."),
|
||||||
|
parent=self.master
|
||||||
|
)
|
||||||
|
if not self.mrk_xmlmodask:
|
||||||
|
self.var_xmlon.set(True)
|
||||||
|
|
||||||
|
self.xmlmod_tail()
|
||||||
|
|
||||||
|
def xmlmod_tail(self):
|
||||||
|
u"""Passt XML-Optionszugriff an."""
|
||||||
|
if self.var_xmlon.get():
|
||||||
|
self.var_xmlmod2.set(self.mrk_var_xmlmod2)
|
||||||
|
self.ckb_xmlmod2["state"] = "normal"
|
||||||
|
else:
|
||||||
|
self.mrk_var_xmlmod2 = self.var_xmlmod2.get()
|
||||||
|
self.var_xmlmod2.set(False)
|
||||||
|
self.ckb_xmlmod2["state"] = "disabled"
|
||||||
|
self.xmlmod2_tail()
|
||||||
|
|
||||||
|
def xmlmod2_tail(self):
|
||||||
|
u"""Passt XML-Optionszugriff an."""
|
||||||
|
if self.var_xmlmod2.get():
|
||||||
|
self.var_xmlmod3.set(self.mrk_var_xmlmod3)
|
||||||
|
self.ckb_xmlmod3["state"] = "normal"
|
||||||
|
else:
|
||||||
|
self.mrk_var_xmlmod3 = self.var_xmlmod3.get()
|
||||||
|
self.var_xmlmod3.set(False)
|
||||||
|
self.ckb_xmlmod3["state"] = "disabled"
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
# Webpage: https://revpimodio.org/revpipyplc/
|
# Webpage: https://revpimodio.org/revpipyplc/
|
||||||
# (c) Sven Sager, License: LGPLv3
|
# (c) Sven Sager, License: LGPLv3
|
||||||
#
|
#
|
||||||
|
u"""Hauptprogramm."""
|
||||||
import revpicheckclient
|
import revpicheckclient
|
||||||
import revpiinfo
|
import revpiinfo
|
||||||
import revpilogfile
|
import revpilogfile
|
||||||
@@ -23,7 +24,7 @@ from xmlrpc.client import ServerProxy
|
|||||||
# Übersetzung laden
|
# Übersetzung laden
|
||||||
_ = gettrans()
|
_ = gettrans()
|
||||||
|
|
||||||
pycontrolversion = "0.5.0"
|
pycontrolversion = "0.6.0"
|
||||||
|
|
||||||
|
|
||||||
class RevPiPyControl(tkinter.Frame):
|
class RevPiPyControl(tkinter.Frame):
|
||||||
@@ -238,8 +239,8 @@ class RevPiPyControl(tkinter.Frame):
|
|||||||
_("Warning"),
|
_("Warning"),
|
||||||
_("The watch mode ist not supported in version {} "
|
_("The watch mode ist not supported in version {} "
|
||||||
"of RevPiPyLoad on your RevPi! You need at least version "
|
"of RevPiPyLoad on your RevPi! You need at least version "
|
||||||
"0.4.0. Or the python3-revpimodio module is not installt"
|
"0.5.3! Maybe the python3-revpimodio2 module is not "
|
||||||
"on your RevPi at least version 0.15.0."
|
"installed on your RevPi at least version 2.0.0."
|
||||||
"").format(self.cli.version()),
|
"").format(self.cli.version()),
|
||||||
parent=self.master
|
parent=self.master
|
||||||
)
|
)
|
||||||
@@ -256,7 +257,7 @@ class RevPiPyControl(tkinter.Frame):
|
|||||||
tkmsg.showwarning(
|
tkmsg.showwarning(
|
||||||
_("Error"),
|
_("Error"),
|
||||||
_("Can not load piCtory configuration. \n"
|
_("Can not load piCtory configuration. \n"
|
||||||
"Have you created a hardware configuration? "
|
"Did you create a hardware configuration? "
|
||||||
"Please check this in piCtory!"),
|
"Please check this in piCtory!"),
|
||||||
parent=self.master
|
parent=self.master
|
||||||
)
|
)
|
||||||
|
|||||||
2
setup.py
2
setup.py
@@ -22,7 +22,7 @@ globsetup = {
|
|||||||
"author_email": "akira@narux.de",
|
"author_email": "akira@narux.de",
|
||||||
"url": "https://revpimodio.org/revpipyplc/",
|
"url": "https://revpimodio.org/revpipyplc/",
|
||||||
"license": "LGPLv3",
|
"license": "LGPLv3",
|
||||||
"version": "0.5.0",
|
"version": "0.6.0",
|
||||||
|
|
||||||
"name": "revpipycontrol",
|
"name": "revpipycontrol",
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user