mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-01-31 18:59:33 +00:00
configDB: #32296
git-svn-id: https://svn.fhem.de/fhem/trunk@7605 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
d4a9077a24
commit
981f4fbfd6
@ -375,6 +375,11 @@ compare device: telnetPort in current version 0 (left) to version: 1 (right)
|
|||||||
| 1|define telnetPort telnet 7072 global | 1|define telnetPort telnet 7072 global |
|
| 1|define telnetPort telnet 7072 global | 1|define telnetPort telnet 7072 global |
|
||||||
* 2|attr telnetPort room telnet * | |
|
* 2|attr telnetPort room telnet * | |
|
||||||
+--+--------------------------------------+--+--------------------------------------+</pre>
|
+--+--------------------------------------+--+--------------------------------------+</pre>
|
||||||
|
<b>Special: configdb diff all current</b><br/>
|
||||||
|
<br/>
|
||||||
|
Will show a diff table containing all changes between saved version 0<br/>
|
||||||
|
and UNSAVED version from memory (currently running installation).<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
<li><code>configdb filedelete <Filename></code></li><br/>
|
<li><code>configdb filedelete <Filename></code></li><br/>
|
||||||
Delete file from database.<br/>
|
Delete file from database.<br/>
|
||||||
@ -524,319 +529,4 @@ attr Melder_FAr peerIDs 00000000,2286BC03,
|
|||||||
|
|
||||||
=end html
|
=end html
|
||||||
|
|
||||||
=begin html_DE
|
|
||||||
|
|
||||||
<a name="configdb"></a>
|
|
||||||
<h3>configdb</h3>
|
|
||||||
<ul>
|
|
||||||
Seit version 5079 unterstützt fhem die Verwendung einer SQL Datenbank zum Abspeichern der kompletten Konfiguration<br/>
|
|
||||||
Dadurch kann man auf alle cfg Dateien, includes usw. verzichten und die daraus immer wieder resultierenden Probleme vermeiden.<br/>
|
|
||||||
Desweiteren gibt es damit eine Versionierung von Konfigurationen und die Möglichkeit,
|
|
||||||
jederzeit eine ältere Version wiederherstellen zu können.<br/>
|
|
||||||
Der Zugriff auf die Datenbank erfolgt über die perl-eigene Datenbankschnittstelle DBI.<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<b>Zusammenspiel mit anderen fhem Modulen</b><br/>
|
|
||||||
<ul><br/>
|
|
||||||
Momentan verwenden die Module<br/>
|
|
||||||
<br/>
|
|
||||||
<li>02_RSS.pm</li>
|
|
||||||
<li>91_eventTypes</li>
|
|
||||||
<li>93_DbLog.pm</li>
|
|
||||||
<li>95_holiday.pm</li>
|
|
||||||
<li>98_SVG.pm</li>
|
|
||||||
<br/>
|
|
||||||
die configDB, um ihre Konfigurationsdaten von dort zu lesen<br/>
|
|
||||||
anstatt aus den bisherigen Konfigurationsdateien im Dateisystem.<br/>
|
|
||||||
Hierzu ist es notwendig, die Konfigurationsdateien aus dem Dateisystem in die Datenbank zu importieren.<br/>
|
|
||||||
<br/>
|
|
||||||
Beispiel:<br/>
|
|
||||||
<code>configdb fileimport FHEM/nrw.holiday</code><br/>
|
|
||||||
<code>configdb fileimport FHEM/myrss.layout</code><br/>
|
|
||||||
<code>configdb fileimport www/gplot/xyz.gplot</code><br/>
|
|
||||||
<br/>
|
|
||||||
<b>Dies hat keinerlei Auswirkungen auf die Definition der holiday oder RSS Instanzen.</b><br/>
|
|
||||||
<br>
|
|
||||||
<b>Während einer Migration werden alle in der aktuell bestehenden Konfiguration verwendeten externen<br/>
|
|
||||||
Konfigurationsdateien automatisch in die Datenbank importiert.</b></br>
|
|
||||||
<br/>
|
|
||||||
Jeder Neuimport einer bereits in der Datenbank gespeicherten Datei überschreibt die vorherige Datei in der Datenbank.<br/>
|
|
||||||
<br/>
|
|
||||||
</ul><br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<b>Voraussetzungen / Installation</b><br/>
|
|
||||||
<ul><br/>
|
|
||||||
<li>Bitte das perl Paket Text::Diff installieren, falls noch nicht auf dem System vorhanden.</li><br/>
|
|
||||||
<li>Es muss eine SQL Datenbank verfügbar sein, untsrstützt werden SQLITE, MYSQL und POSTGRESQLL.</li><br/>
|
|
||||||
<li>Das zum Datenbanktype gehörende DBD Modul muss in perl installiert sein,<br/>
|
|
||||||
für sqlite3 auf einem Debian System z.B. das Paket libdbd-sqlite3-perl</li><br/>
|
|
||||||
<li>Eine leere Datenbank muss angelegt werden, z.B. in sqlite3:<br/>
|
|
||||||
<pre>
|
|
||||||
mba:fhem udo$ sqlite3 configDB.db
|
|
||||||
|
|
||||||
SQLite version 3.7.13 2012-07-17 17:46:21
|
|
||||||
Enter ".help" for instructions
|
|
||||||
Enter SQL statements terminated with a ";"
|
|
||||||
sqlite> pragma auto_vacuum=2;
|
|
||||||
sqlite> .quit
|
|
||||||
|
|
||||||
mba:fhem udo$
|
|
||||||
</pre></li>
|
|
||||||
<li>Die benötigten Datenbanktabellen werden automatisch angelegt.</li><br/>
|
|
||||||
<li>Eine Konfigurationsdatei für die Verbindung zur Datenbank muss angelegt werden.<br/>
|
|
||||||
<br/>
|
|
||||||
<b>WICHTIG:</b>
|
|
||||||
<ul><br/>
|
|
||||||
<li>Diese Datei <b>muss</b> den Namen "configDB.conf" haben</li>
|
|
||||||
<li>Diese Datei <b>muss</b> im gleichen Verzeichnis liegen wie fhem.pl und configDB.pm, z.B. /opt/fhem</li>
|
|
||||||
</ul>
|
|
||||||
<br/>
|
|
||||||
<pre>
|
|
||||||
## für MySQL
|
|
||||||
################################################################
|
|
||||||
#%dbconfig= (
|
|
||||||
# connection => "mysql:database=configDB;host=db;port=3306",
|
|
||||||
# user => "fhemuser",
|
|
||||||
# password => "fhempassword",
|
|
||||||
#);
|
|
||||||
################################################################
|
|
||||||
#
|
|
||||||
## für PostgreSQL
|
|
||||||
################################################################
|
|
||||||
#%dbconfig= (
|
|
||||||
# connection => "Pg:database=configDB;host=localhost",
|
|
||||||
# user => "fhemuser",
|
|
||||||
# password => "fhempassword"
|
|
||||||
#);
|
|
||||||
################################################################
|
|
||||||
#
|
|
||||||
## für SQLite (username and password bleiben bei SQLite leer)
|
|
||||||
################################################################
|
|
||||||
#%dbconfig= (
|
|
||||||
# connection => "SQLite:dbname=/opt/fhem/configDB.db",
|
|
||||||
# user => "",
|
|
||||||
# password => ""
|
|
||||||
#);
|
|
||||||
################################################################
|
|
||||||
</pre></li><br/>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<b>Aufruf mit einer vollständig neuen fhem Installation</b><br/>
|
|
||||||
<ul><br/>
|
|
||||||
Sehr einfach... fhem muss lediglich folgendermassen gestartet werden:<br/><br/>
|
|
||||||
<ul><code>perl fhem.pl configDB</code></ul><br/>
|
|
||||||
<b>configDB</b> ist das Schlüsselwort, an dem fhem erkennt, <br/>
|
|
||||||
dass eine Datenbank für die Konfiguration verwendet werden soll.<br/>
|
|
||||||
<br/>
|
|
||||||
<b>Das war es schon.</b> Alle Befehle (save, rereadcfg etc) arbeiten wie gewohnt.
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
<b>oder:</b><br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<b>übertragen einer bestehenden fhem Konfiguration in die Datenbank</b><br/>
|
|
||||||
<ul><br/>
|
|
||||||
Auch sehr einfach... <br/>
|
|
||||||
<br/>
|
|
||||||
<li>fhem wird zum letzten Mal mit der fhem.cfg gestartet<br/><br/>
|
|
||||||
<ul><code>perl fhem.pl fhem.cfg</code></ul></li><br/>
|
|
||||||
<br/>
|
|
||||||
<li>Bestehende Konfiguration in die Datenbank übertragen<br/><br/>
|
|
||||||
<ul><code>configdb migrate</code><br/>
|
|
||||||
<br/>
|
|
||||||
in die Befehlszeile der fhem-Oberfläche eingeben</ul><br/></br>
|
|
||||||
Nicht die Geduld verlieren! Die Migration eine Weile dauern, speziell bei Mini-Systemen wie<br/>
|
|
||||||
RaspberryPi or Beaglebone.<br/>
|
|
||||||
Am Ende der Migration wird eine aktuelle Datenbankstatistik angezeigt.<br/>
|
|
||||||
Die ursprüngliche Konfigurationsdatei wird bei diesem Vorgang nicht angetastet.</li><br/>
|
|
||||||
<li>fhem beenden.</li><br/>
|
|
||||||
<li>fhem mit dem Schlüsselwort configDB starten<br/><br/>
|
|
||||||
<ul><code>perl fhem.pl configDB</code></ul></li><br/>
|
|
||||||
<b>configDB</b> ist das Schlüsselwort, an dem fhem erkennt, <br/>
|
|
||||||
dass eine Datenbank für die Konfiguration verwendet werden soll.<br/>
|
|
||||||
<br/>
|
|
||||||
<b>Das war es schon.</b> Alle Befehle (save, rereadcfg etc) arbeiten wie gewohnt.
|
|
||||||
</ul>
|
|
||||||
<br/><br/>
|
|
||||||
|
|
||||||
<b>Zusätzliche Funktionen</b><br/>
|
|
||||||
<ul><br/>
|
|
||||||
Es wird ein neuer Befehl <code>configdb</code> bereitgestellt,<br/>
|
|
||||||
der mit verschiedenen Parametern aufgerufen werden kann.<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb attr [attribute] [value]</code></li><br/>
|
|
||||||
Hiermit lassen sich attribute setzen, die das Verhalten von Front- und Backend beeinflussen.<br/>
|
|
||||||
<br/>
|
|
||||||
<code> configdb attr private 1</code> - setzt das Attribut 'private' auf den Wert 1.<br/>
|
|
||||||
<br/>
|
|
||||||
<code> configdb attr private</code> - löscht das Attribut 'private'<br/>
|
|
||||||
<br/>
|
|
||||||
<code> configdb attr</code> - zeigt alle gespeicherten Attribute<br/>
|
|
||||||
<br/>
|
|
||||||
Im Moment ist nur ein Attribut definiert. Wenn 'private' auf 1 gesetzt wird, werden bei 'configdb info' <br/>
|
|
||||||
keine Benutzer- und Passwortdaten angezeigt.<br/>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb diff <device> <version></code></li><br/>
|
|
||||||
Vergleicht die Konfigurationsdaten des Gerätes <device> aus der aktuellen Version 0 mit den Daten aus Version <version><br/>
|
|
||||||
Beispielaufruf:<br/>
|
|
||||||
<br/>
|
|
||||||
<code>configdb diff telnetPort 1</code><br/>
|
|
||||||
<br/>
|
|
||||||
liefert ein Ergebnis ähnlich dieser Ausgabe:
|
|
||||||
<pre>
|
|
||||||
compare device: telnetPort in current version 0 (left) to version: 1 (right)
|
|
||||||
+--+--------------------------------------+--+--------------------------------------+
|
|
||||||
| 1|define telnetPort telnet 7072 global | 1|define telnetPort telnet 7072 global |
|
|
||||||
* 2|attr telnetPort room telnet * | |
|
|
||||||
+--+--------------------------------------+--+--------------------------------------+</pre>
|
|
||||||
|
|
||||||
<li><code>configdb filedelete <Dateiname></code></li><br/>
|
|
||||||
Löscht eine gespeicherte Datei aus der Datenbank.<br/>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb fileexport <zielDatei></code></li><br/>
|
|
||||||
Schreibt die angegebene Datei aus der Datenbank in das Dateisystem.
|
|
||||||
Beispiel:<br/>
|
|
||||||
<br/>
|
|
||||||
<code>configdb fileexport FHEM/99_myUtils.pm</code><br/>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb fileimport <quellDatei></code></li><br/>
|
|
||||||
Liest die angegbene Textdatei aus dem Dateisystem und schreibt den Inhalt in die Datenbank.<br/>
|
|
||||||
Beispiel:<br/>
|
|
||||||
<br/>
|
|
||||||
<code>configdb fileimport FHEM/99_myUtils.pm</code><br/>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb filelist</code></li><br/>
|
|
||||||
Liefert eine Liste mit allen Namen der gespeicherten Dateien.<br/>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb filemove <quellDatei></code></li><br/>
|
|
||||||
Liest die angegbene Datei aus dem Dateisystem und schreibt den Inhalt in die Datenbank.<br/>
|
|
||||||
Anschliessend wird die Datei aus dem lokalen Dateisystem gelöscht.<br/>
|
|
||||||
Beispiel:<br/>
|
|
||||||
<br/>
|
|
||||||
<code>configdb filemove FHEM/99_myUtils.pm</code><br/>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb fileshow <Dateiname></code></li><br/>
|
|
||||||
Zeigt den Inhalt einer in der Datenbank gespeichert Datei an.<br/>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb info</code></li><br/>
|
|
||||||
Liefert eine Datenbankstatistik<br/>
|
|
||||||
<pre>
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
configDB Database Information
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
dbconn: SQLite:dbname=/opt/fhem/configDB.db
|
|
||||||
dbuser:
|
|
||||||
dbpass:
|
|
||||||
dbtype: SQLITE
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
fhemconfig: 7707 entries
|
|
||||||
|
|
||||||
Ver 0 saved: Sat Mar 1 11:37:00 2014 def: 293 attr: 1248
|
|
||||||
Ver 1 saved: Fri Feb 28 23:55:13 2014 def: 293 attr: 1248
|
|
||||||
Ver 2 saved: Fri Feb 28 23:49:01 2014 def: 293 attr: 1248
|
|
||||||
Ver 3 saved: Fri Feb 28 22:24:40 2014 def: 293 attr: 1247
|
|
||||||
Ver 4 saved: Fri Feb 28 22:14:03 2014 def: 293 attr: 1246
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
fhemstate: 1890 entries saved: Sat Mar 1 12:05:00 2014
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
</pre>
|
|
||||||
Ver 0 bezeichnet immer die aktuell verwendete Konfiguration.<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb list [device] [version]</code></li><br/>
|
|
||||||
Sucht das Gerät [device] in der Konfiguration der Version [version]<br/>
|
|
||||||
in der Datenbank.<br/>
|
|
||||||
Standardwert für [device] = % um alle Geräte anzuzeigen<br/>
|
|
||||||
Standardwert für [version] = 0 um Geräte in der aktuellen Version anzuzeigen.<br/>
|
|
||||||
Beispiele für gültige Aufrufe:<br/>
|
|
||||||
<br/>
|
|
||||||
<code>configdb list</code><br/>
|
|
||||||
<code>configdb list global</code><br/>
|
|
||||||
<code>configdb list '' 1</code><br/>
|
|
||||||
<code>configdb list global 1</code><br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb recover <version></code></li><br/>
|
|
||||||
Stellt eine ältere Version aus dem Datenbankarchiv wieder her.<br/>
|
|
||||||
<code>configdb recover 3</code> <b>kopiert</b> die Version #3 aus der Datenbank
|
|
||||||
zur Version #0.<br/>
|
|
||||||
Die ursprüngliche Version #0 wird dabei gelöscht.<br/><br/>
|
|
||||||
<b>Wichtig!</b><br/>
|
|
||||||
Die zurückgeholte Version wird <b>NICHT</b> automatisch aktiviert!<br/>
|
|
||||||
Ein <code>rereadcfg</code> oder - besser - <code>shutdown restart</code> muss manuell erfolgen.<br/>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb reorg [keep]</code></li><br/>
|
|
||||||
Löscht alle gespeicherten Konfigurationen mit Versionsnummern größer als [keep].<br/>
|
|
||||||
Standardwert für den optionalen Parameter keep = 3.<br/>
|
|
||||||
Mit dieser Funktion läßt sich eine nächtliche Reorganisation per at umsetzen.<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb search <suchBegriff> [inVersion]</code></li><br/>
|
|
||||||
Sucht nach dem Suchbegriff in der angegeben Konfigurationsversion (default=0)<br/>
|
|
||||||
<pre>
|
|
||||||
Beispiel:
|
|
||||||
|
|
||||||
configdb search %2286BC%
|
|
||||||
|
|
||||||
Ergebnis:
|
|
||||||
|
|
||||||
search result for: %2286BC% in version: 0
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
define az_RT CUL_HM 2286BC
|
|
||||||
define az_RT_Clima CUL_HM 2286BC04
|
|
||||||
define az_RT_Climate CUL_HM 2286BC02
|
|
||||||
define az_RT_ClimaTeam CUL_HM 2286BC05
|
|
||||||
define az_RT_remote CUL_HM 2286BC06
|
|
||||||
define az_RT_Weather CUL_HM 2286BC01
|
|
||||||
define az_RT_WindowRec CUL_HM 2286BC03
|
|
||||||
attr Melder_FAl peerIDs 00000000,2286BC03,
|
|
||||||
attr Melder_FAr peerIDs 00000000,2286BC03,
|
|
||||||
</pre>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<li><code>configdb uuid</code></li><br/>
|
|
||||||
Liefert eine uuid, die man für eigene Zwecke verwenden kann.<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<b>Hinweise</b><br/>
|
|
||||||
<br/>
|
|
||||||
<ul>
|
|
||||||
<li>Im Verzeichnis contrib/configDB befinden sich zwei Vorlagen für Datenbank und Konfiguration,<br/>
|
|
||||||
die durch einfaches Kopieren in das fhem Verzeichnis sofort verwendet werden können (Nur für sqlite!).</li>
|
|
||||||
<br/>
|
|
||||||
<li>Der Menüpunkt "Edit files"->"config file" wird bei Verwendung von configDB nicht mehr angezeigt.</li>
|
|
||||||
<br/>
|
|
||||||
<li>Beim Speichern einer Konfiguration nicht ungeduldig werden (egal ob manuell oder durch Klicken auf "save config")<br/>
|
|
||||||
Durch das Schreiben der Versionsinformationen dauert das ein paar Sekunden.<br/>
|
|
||||||
Der Abschluss des Speichern wird durch eine entsprechende Meldung angezeigt.</li>
|
|
||||||
<br/>
|
|
||||||
<li>Diese Erweiterung wird laufend weiterentwickelt. Speziell an der Verbesserung der Performance wird gearbeitet.</li>
|
|
||||||
<br/>
|
|
||||||
<li>Viel Spass!</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
=end html_DE
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
@ -93,11 +93,16 @@
|
|||||||
#
|
#
|
||||||
# 2015-01-15 - changed remove 99_Utils.pm from filelist
|
# 2015-01-15 - changed remove 99_Utils.pm from filelist
|
||||||
#
|
#
|
||||||
|
# 2015-01-17 - added configdb diff all current
|
||||||
|
# shows diff table between version 0
|
||||||
|
# and currently running version (in memory)
|
||||||
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
#
|
#
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
use Text::Diff;
|
||||||
use DBI;
|
use DBI;
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
@ -119,14 +124,15 @@ sub cfgDB_FileWrite($@);
|
|||||||
sub cfgDB_FW_fileList($$@);
|
sub cfgDB_FW_fileList($$@);
|
||||||
sub cfgDB_Read99();
|
sub cfgDB_Read99();
|
||||||
sub cfgDB_ReadAll($);
|
sub cfgDB_ReadAll($);
|
||||||
sub cfgDB_SaveCfg();
|
sub cfgDB_SaveCfg(;$);
|
||||||
sub cfgDB_SaveState();
|
sub cfgDB_SaveState();
|
||||||
sub cfgDB_svnId();
|
sub cfgDB_svnId();
|
||||||
|
|
||||||
sub _cfgDB_binFileimport($$;$);
|
sub _cfgDB_binFileimport($$;$);
|
||||||
sub _cfgDB_Connect();
|
sub _cfgDB_Connect();
|
||||||
|
sub _cfgDB_DeleteTemp();
|
||||||
sub _cfgDB_Diff($$);
|
sub _cfgDB_Diff($$);
|
||||||
sub __cfgDB_Diff($$$);
|
sub __cfgDB_Diff($$$$);
|
||||||
sub _cfgDB_InsertLine($$$$);
|
sub _cfgDB_InsertLine($$$$);
|
||||||
sub _cfgDB_Execute($@);
|
sub _cfgDB_Execute($@);
|
||||||
sub _cfgDB_Filedelete($);
|
sub _cfgDB_Filedelete($);
|
||||||
@ -139,7 +145,7 @@ sub _cfgDB_ReadCfg(@);
|
|||||||
sub _cfgDB_ReadState(@);
|
sub _cfgDB_ReadState(@);
|
||||||
sub _cfgDB_Recover($);
|
sub _cfgDB_Recover($);
|
||||||
sub _cfgDB_Reorg(;$$);
|
sub _cfgDB_Reorg(;$$);
|
||||||
sub _cfgDB_Rotate($);
|
sub _cfgDB_Rotate($$);
|
||||||
sub _cfgDB_Search($$;$);
|
sub _cfgDB_Search($$;$);
|
||||||
sub _cfgDB_Uuid();
|
sub _cfgDB_Uuid();
|
||||||
|
|
||||||
@ -338,7 +344,11 @@ sub cfgDB_ReadAll($) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# save running configuration to version 0
|
# save running configuration to version 0
|
||||||
sub cfgDB_SaveCfg() {
|
sub cfgDB_SaveCfg(;$) {
|
||||||
|
|
||||||
|
my ($internal) = shift;
|
||||||
|
$internal = defined($internal) ? $internal : 0;
|
||||||
|
|
||||||
my (%devByNr, @rowList, %comments, $t, $out);
|
my (%devByNr, @rowList, %comments, $t, $out);
|
||||||
|
|
||||||
map { $devByNr{$defs{$_}{NR}} = $_ } keys %defs;
|
map { $devByNr{$defs{$_}{NR}} = $_ } keys %defs;
|
||||||
@ -384,14 +394,6 @@ sub cfgDB_SaveCfg() {
|
|||||||
push @rowList, "attr $d $a $val";
|
push @rowList, "attr $d $a $val";
|
||||||
}
|
}
|
||||||
|
|
||||||
# foreach my $a (sort keys %{$attr{$d}}) {
|
|
||||||
# next if($d eq "global" &&
|
|
||||||
# ($a eq "configfile" || $a eq "version"));
|
|
||||||
# my $val = $attr{$d}{$a};
|
|
||||||
# $val =~ s/;/;;/g;
|
|
||||||
# push @rowList, "attr $d $a $val";
|
|
||||||
# }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach my $a (sort keys %{$attr{configdb}}) {
|
foreach my $a (sort keys %{$attr{configdb}}) {
|
||||||
@ -402,7 +404,7 @@ sub cfgDB_SaveCfg() {
|
|||||||
|
|
||||||
# Insert @rowList into database table
|
# Insert @rowList into database table
|
||||||
my $fhem_dbh = _cfgDB_Connect;
|
my $fhem_dbh = _cfgDB_Connect;
|
||||||
my $uuid = _cfgDB_Rotate($fhem_dbh);
|
my $uuid = _cfgDB_Rotate($fhem_dbh,$internal);
|
||||||
$t = localtime;
|
$t = localtime;
|
||||||
$out = "#created $t";
|
$out = "#created $t";
|
||||||
push @rowList, $out;
|
push @rowList, $out;
|
||||||
@ -415,7 +417,7 @@ sub cfgDB_SaveCfg() {
|
|||||||
$fhem_dbh->disconnect();
|
$fhem_dbh->disconnect();
|
||||||
my $maxVersions = $attr{configdb}{maxversions};
|
my $maxVersions = $attr{configdb}{maxversions};
|
||||||
$maxVersions = ($maxVersions) ? $maxVersions : 0;
|
$maxVersions = ($maxVersions) ? $maxVersions : 0;
|
||||||
_cfgDB_Reorg($maxVersions,1) if($maxVersions);
|
_cfgDB_Reorg($maxVersions,1) if($maxVersions && $internal != -1);
|
||||||
return 'configDB saved.';
|
return 'configDB saved.';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -663,11 +665,11 @@ sub _cfgDB_ReadState(@) {
|
|||||||
|
|
||||||
# rotate all versions to versionnum + 1
|
# rotate all versions to versionnum + 1
|
||||||
# return uuid for new version 0
|
# return uuid for new version 0
|
||||||
sub _cfgDB_Rotate($) {
|
sub _cfgDB_Rotate($$) {
|
||||||
my ($fhem_dbh) = @_;
|
my ($fhem_dbh,$newversion) = @_;
|
||||||
my $uuid = _cfgDB_Uuid;
|
my $uuid = _cfgDB_Uuid;
|
||||||
$fhem_dbh->do("UPDATE fhemversions SET VERSION = VERSION+1");
|
$fhem_dbh->do("UPDATE fhemversions SET VERSION = VERSION+1 where VERSION >= 0") if $newversion == 0;
|
||||||
$fhem_dbh->do("INSERT INTO fhemversions values (0, '$uuid')");
|
$fhem_dbh->do("INSERT INTO fhemversions values ('$newversion', '$uuid')");
|
||||||
return $uuid;
|
return $uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -826,12 +828,25 @@ sub _cfgDB_Reorg(;$$) {
|
|||||||
my $fhem_dbh = _cfgDB_Connect;
|
my $fhem_dbh = _cfgDB_Connect;
|
||||||
$fhem_dbh->do("delete FROM fhemconfig where versionuuid in (select versionuuid from fhemversions where version > $lastversion)");
|
$fhem_dbh->do("delete FROM fhemconfig where versionuuid in (select versionuuid from fhemversions where version > $lastversion)");
|
||||||
$fhem_dbh->do("delete from fhemversions where version > $lastversion");
|
$fhem_dbh->do("delete from fhemversions where version > $lastversion");
|
||||||
|
$fhem_dbh->do("delete FROM fhemconfig where versionuuid in (select versionuuid from fhemversions where version = -1)");
|
||||||
|
$fhem_dbh->do("delete from fhemversions where version = -1");
|
||||||
$fhem_dbh->commit();
|
$fhem_dbh->commit();
|
||||||
$fhem_dbh->disconnect();
|
$fhem_dbh->disconnect();
|
||||||
return if(defined($quiet));
|
return if(defined($quiet));
|
||||||
return " Result after database reorg:\n"._cfgDB_Info;
|
return " Result after database reorg:\n"._cfgDB_Info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# delete temporary version
|
||||||
|
sub _cfgDB_DeleteTemp() {
|
||||||
|
Log3('configDB', 4, "configDB: delete temporary Version -1");
|
||||||
|
my $fhem_dbh = _cfgDB_Connect;
|
||||||
|
$fhem_dbh->do("delete FROM fhemconfig where versionuuid in (select versionuuid from fhemversions where version = -1)");
|
||||||
|
$fhem_dbh->do("delete from fhemversions where version = -1");
|
||||||
|
$fhem_dbh->commit();
|
||||||
|
$fhem_dbh->disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
# search for device or fulltext in db
|
# search for device or fulltext in db
|
||||||
sub _cfgDB_Search($$;$) {
|
sub _cfgDB_Search($$;$) {
|
||||||
my ($search,$searchversion,$dsearch) = @_;
|
my ($search,$searchversion,$dsearch) = @_;
|
||||||
@ -858,11 +873,16 @@ sub _cfgDB_Search($$;$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# called from cfgDB_Diff
|
# called from cfgDB_Diff
|
||||||
sub __cfgDB_Diff($$$) {
|
sub __cfgDB_Diff($$$$) {
|
||||||
my ($fhem_dbh,$search,$searchversion) = @_;
|
my ($fhem_dbh,$search,$searchversion,$svinternal) = @_;
|
||||||
my ($sql, $sth, @line, $ret);
|
my ($sql, $sth, @line, $ret);
|
||||||
|
if($svinternal != -1) {
|
||||||
$sql = "SELECT command, device, p1, p2 FROM fhemconfig as c join fhemversions as v ON v.versionuuid=c.versionuuid ".
|
$sql = "SELECT command, device, p1, p2 FROM fhemconfig as c join fhemversions as v ON v.versionuuid=c.versionuuid ".
|
||||||
"WHERE v.version = '$searchversion' AND device = '$search' ORDER BY command DESC";
|
"WHERE v.version = '$searchversion' AND device = '$search' ORDER BY command DESC";
|
||||||
|
} else {
|
||||||
|
$sql = "SELECT command, device, p1, p2 FROM fhemconfig as c join fhemversions as v ON v.versionuuid=c.versionuuid ".
|
||||||
|
"WHERE v.version = '$searchversion' ORDER BY command DESC";
|
||||||
|
}
|
||||||
$sth = $fhem_dbh->prepare( $sql);
|
$sth = $fhem_dbh->prepare( $sql);
|
||||||
$sth->execute();
|
$sth->execute();
|
||||||
while (@line = $sth->fetchrow_array()) {
|
while (@line = $sth->fetchrow_array()) {
|
||||||
@ -874,13 +894,23 @@ sub __cfgDB_Diff($$$) {
|
|||||||
# compare device configurations from 2 versions
|
# compare device configurations from 2 versions
|
||||||
sub _cfgDB_Diff($$) {
|
sub _cfgDB_Diff($$) {
|
||||||
my ($search,$searchversion) = @_;
|
my ($search,$searchversion) = @_;
|
||||||
use Text::Diff;
|
|
||||||
my ($ret, $v0, $v1);
|
my ($ret, $v0, $v1);
|
||||||
|
|
||||||
|
if ($search eq 'all' && $searchversion eq 'current') {
|
||||||
|
_cfgDB_DeleteTemp();
|
||||||
|
cfgDB_SaveCfg(-1);
|
||||||
|
$searchversion = -1;
|
||||||
|
}
|
||||||
|
|
||||||
my $fhem_dbh = _cfgDB_Connect;
|
my $fhem_dbh = _cfgDB_Connect;
|
||||||
$v0 = __cfgDB_Diff($fhem_dbh,$search,0);
|
$v0 = __cfgDB_Diff($fhem_dbh,$search,0,$searchversion);
|
||||||
$v1 = __cfgDB_Diff($fhem_dbh,$search,$searchversion);
|
$v1 = __cfgDB_Diff($fhem_dbh,$search,$searchversion,$searchversion);
|
||||||
$fhem_dbh->disconnect();
|
$fhem_dbh->disconnect();
|
||||||
$ret = diff \$v0, \$v1, { STYLE => "Table" };
|
$ret = diff \$v0, \$v1, { STYLE => "Table" };
|
||||||
|
if($searchversion == -1) {
|
||||||
|
_cfgDB_DeleteTemp();
|
||||||
|
$searchversion = "UNSAVED";
|
||||||
|
}
|
||||||
$ret = "\nNo differences found!" if !$ret;
|
$ret = "\nNo differences found!" if !$ret;
|
||||||
$ret = "compare device: $search in current version 0 (left) to version: $searchversion (right)\n$ret\n";
|
$ret = "compare device: $search in current version 0 (left) to version: $searchversion (right)\n$ret\n";
|
||||||
return $ret;
|
return $ret;
|
||||||
|
Loading…
Reference in New Issue
Block a user