diff --git a/fhem/FHEM/98_configdb.pm b/fhem/FHEM/98_configdb.pm
index bf1244ebe..c35594bd8 100644
--- a/fhem/FHEM/98_configdb.pm
+++ b/fhem/FHEM/98_configdb.pm
@@ -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 |
* 2|attr telnetPort room telnet * | |
+--+--------------------------------------+--+--------------------------------------+
+ Special: configdb diff all current
+
+ Will show a diff table containing all changes between saved version 0
+ and UNSAVED version from memory (currently running installation).
+
configdb filedelete <Filename>
Delete file from database.
@@ -524,319 +529,4 @@ attr Melder_FAr peerIDs 00000000,2286BC03,
=end html
-=begin html_DE
-
-
-configdb
-
- Seit version 5079 unterstützt fhem die Verwendung einer SQL Datenbank zum Abspeichern der kompletten Konfiguration
- Dadurch kann man auf alle cfg Dateien, includes usw. verzichten und die daraus immer wieder resultierenden Probleme vermeiden.
- Desweiteren gibt es damit eine Versionierung von Konfigurationen und die Möglichkeit,
- jederzeit eine ältere Version wiederherstellen zu können.
- Der Zugriff auf die Datenbank erfolgt über die perl-eigene Datenbankschnittstelle DBI.
-
-
- Zusammenspiel mit anderen fhem Modulen
-
- Momentan verwenden die Module
-
- - 02_RSS.pm
- - 91_eventTypes
- - 93_DbLog.pm
- - 95_holiday.pm
- - 98_SVG.pm
-
- die configDB, um ihre Konfigurationsdaten von dort zu lesen
- anstatt aus den bisherigen Konfigurationsdateien im Dateisystem.
- Hierzu ist es notwendig, die Konfigurationsdateien aus dem Dateisystem in die Datenbank zu importieren.
-
- Beispiel:
- configdb fileimport FHEM/nrw.holiday
- configdb fileimport FHEM/myrss.layout
- configdb fileimport www/gplot/xyz.gplot
-
- Dies hat keinerlei Auswirkungen auf die Definition der holiday oder RSS Instanzen.
-
- Während einer Migration werden alle in der aktuell bestehenden Konfiguration verwendeten externen
- Konfigurationsdateien automatisch in die Datenbank importiert.
-
- Jeder Neuimport einer bereits in der Datenbank gespeicherten Datei überschreibt die vorherige Datei in der Datenbank.
-
-
-
-
- Voraussetzungen / Installation
-
- - Bitte das perl Paket Text::Diff installieren, falls noch nicht auf dem System vorhanden.
- - Es muss eine SQL Datenbank verfügbar sein, untsrstützt werden SQLITE, MYSQL und POSTGRESQLL.
- - Das zum Datenbanktype gehörende DBD Modul muss in perl installiert sein,
- für sqlite3 auf einem Debian System z.B. das Paket libdbd-sqlite3-perl
- - Eine leere Datenbank muss angelegt werden, z.B. in sqlite3:
-
- 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$
-
- - Die benötigten Datenbanktabellen werden automatisch angelegt.
- - Eine Konfigurationsdatei für die Verbindung zur Datenbank muss angelegt werden.
-
- WICHTIG:
-
- - Diese Datei muss den Namen "configDB.conf" haben
- - Diese Datei muss im gleichen Verzeichnis liegen wie fhem.pl und configDB.pm, z.B. /opt/fhem
-
-
-
-## 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 => ""
-#);
-################################################################
-
-
-
- Aufruf mit einer vollständig neuen fhem Installation
-
- Sehr einfach... fhem muss lediglich folgendermassen gestartet werden:
-
- configDB ist das Schlüsselwort, an dem fhem erkennt,
- dass eine Datenbank für die Konfiguration verwendet werden soll.
-
- Das war es schon. Alle Befehle (save, rereadcfg etc) arbeiten wie gewohnt.
-
-
-
- oder:
-
-
- übertragen einer bestehenden fhem Konfiguration in die Datenbank
-
- Auch sehr einfach...
-
- - fhem wird zum letzten Mal mit der fhem.cfg gestartet
-
-
- - Bestehende Konfiguration in die Datenbank übertragen
- configdb migrate
-
- in die Befehlszeile der fhem-Oberfläche eingeben
- Nicht die Geduld verlieren! Die Migration eine Weile dauern, speziell bei Mini-Systemen wie
- RaspberryPi or Beaglebone.
- Am Ende der Migration wird eine aktuelle Datenbankstatistik angezeigt.
- Die ursprüngliche Konfigurationsdatei wird bei diesem Vorgang nicht angetastet.
- - fhem beenden.
- - fhem mit dem Schlüsselwort configDB starten
-
- configDB ist das Schlüsselwort, an dem fhem erkennt,
- dass eine Datenbank für die Konfiguration verwendet werden soll.
-
- Das war es schon. Alle Befehle (save, rereadcfg etc) arbeiten wie gewohnt.
-
-
-
- Zusätzliche Funktionen
-
- Es wird ein neuer Befehl configdb bereitgestellt,
- der mit verschiedenen Parametern aufgerufen werden kann.
-
-
- configdb attr [attribute] [value]
- Hiermit lassen sich attribute setzen, die das Verhalten von Front- und Backend beeinflussen.
-
- configdb attr private 1 - setzt das Attribut 'private' auf den Wert 1.
-
- configdb attr private - löscht das Attribut 'private'
-
- configdb attr - zeigt alle gespeicherten Attribute
-
- Im Moment ist nur ein Attribut definiert. Wenn 'private' auf 1 gesetzt wird, werden bei 'configdb info'
- keine Benutzer- und Passwortdaten angezeigt.
-
-
-
- configdb diff <device> <version>
- Vergleicht die Konfigurationsdaten des Gerätes <device> aus der aktuellen Version 0 mit den Daten aus Version <version>
- Beispielaufruf:
-
- configdb diff telnetPort 1
-
- liefert ein Ergebnis ähnlich dieser Ausgabe:
-
-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 * | |
-+--+--------------------------------------+--+--------------------------------------+
-
- configdb filedelete <Dateiname>
- Löscht eine gespeicherte Datei aus der Datenbank.
-
-
-
- configdb fileexport <zielDatei>
- Schreibt die angegebene Datei aus der Datenbank in das Dateisystem.
- Beispiel:
-
- configdb fileexport FHEM/99_myUtils.pm
-
-
-
- configdb fileimport <quellDatei>
- Liest die angegbene Textdatei aus dem Dateisystem und schreibt den Inhalt in die Datenbank.
- Beispiel:
-
- configdb fileimport FHEM/99_myUtils.pm
-
-
-
- configdb filelist
- Liefert eine Liste mit allen Namen der gespeicherten Dateien.
-
-
-
- configdb filemove <quellDatei>
- Liest die angegbene Datei aus dem Dateisystem und schreibt den Inhalt in die Datenbank.
- Anschliessend wird die Datei aus dem lokalen Dateisystem gelöscht.
- Beispiel:
-
- configdb filemove FHEM/99_myUtils.pm
-
-
-
- configdb fileshow <Dateiname>
- Zeigt den Inhalt einer in der Datenbank gespeichert Datei an.
-
-
-
- configdb info
- Liefert eine Datenbankstatistik
-
---------------------------------------------------------------------------------
- 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
---------------------------------------------------------------------------------
-
-Ver 0 bezeichnet immer die aktuell verwendete Konfiguration.
-
-
- configdb list [device] [version]
- Sucht das Gerät [device] in der Konfiguration der Version [version]
- in der Datenbank.
- Standardwert für [device] = % um alle Geräte anzuzeigen
- Standardwert für [version] = 0 um Geräte in der aktuellen Version anzuzeigen.
- Beispiele für gültige Aufrufe:
-
- configdb list
- configdb list global
- configdb list '' 1
- configdb list global 1
-
-
- configdb recover <version>
- Stellt eine ältere Version aus dem Datenbankarchiv wieder her.
- configdb recover 3 kopiert die Version #3 aus der Datenbank
- zur Version #0.
- Die ursprüngliche Version #0 wird dabei gelöscht.
- Wichtig!
- Die zurückgeholte Version wird NICHT automatisch aktiviert!
- Ein rereadcfg oder - besser - shutdown restart muss manuell erfolgen.
-
-
-
- configdb reorg [keep]
- Löscht alle gespeicherten Konfigurationen mit Versionsnummern größer als [keep].
- Standardwert für den optionalen Parameter keep = 3.
- Mit dieser Funktion läßt sich eine nächtliche Reorganisation per at umsetzen.
-
-
- configdb search [inVersion]
- Sucht nach dem Suchbegriff in der angegeben Konfigurationsversion (default=0)
-
-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,
-
-
-
- configdb uuid
- Liefert eine uuid, die man für eigene Zwecke verwenden kann.
-
-
- Hinweise
-
-
- - Im Verzeichnis contrib/configDB befinden sich zwei Vorlagen für Datenbank und Konfiguration,
- die durch einfaches Kopieren in das fhem Verzeichnis sofort verwendet werden können (Nur für sqlite!).
-
- - Der Menüpunkt "Edit files"->"config file" wird bei Verwendung von configDB nicht mehr angezeigt.
-
- - Beim Speichern einer Konfiguration nicht ungeduldig werden (egal ob manuell oder durch Klicken auf "save config")
- Durch das Schreiben der Versionsinformationen dauert das ein paar Sekunden.
- Der Abschluss des Speichern wird durch eine entsprechende Meldung angezeigt.
-
- - Diese Erweiterung wird laufend weiterentwickelt. Speziell an der Verbesserung der Performance wird gearbeitet.
-
- - Viel Spass!
-
-
-
-
-
-=end html_DE
-
=cut
diff --git a/fhem/configDB.pm b/fhem/configDB.pm
index 53845a522..ec0407b9c 100644
--- a/fhem/configDB.pm
+++ b/fhem/configDB.pm
@@ -93,11 +93,16 @@
#
# 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 warnings;
+use Text::Diff;
use DBI;
##################################################
@@ -119,14 +124,15 @@ sub cfgDB_FileWrite($@);
sub cfgDB_FW_fileList($$@);
sub cfgDB_Read99();
sub cfgDB_ReadAll($);
-sub cfgDB_SaveCfg();
+sub cfgDB_SaveCfg(;$);
sub cfgDB_SaveState();
sub cfgDB_svnId();
sub _cfgDB_binFileimport($$;$);
sub _cfgDB_Connect();
+sub _cfgDB_DeleteTemp();
sub _cfgDB_Diff($$);
-sub __cfgDB_Diff($$$);
+sub __cfgDB_Diff($$$$);
sub _cfgDB_InsertLine($$$$);
sub _cfgDB_Execute($@);
sub _cfgDB_Filedelete($);
@@ -139,7 +145,7 @@ sub _cfgDB_ReadCfg(@);
sub _cfgDB_ReadState(@);
sub _cfgDB_Recover($);
sub _cfgDB_Reorg(;$$);
-sub _cfgDB_Rotate($);
+sub _cfgDB_Rotate($$);
sub _cfgDB_Search($$;$);
sub _cfgDB_Uuid();
@@ -338,7 +344,11 @@ sub cfgDB_ReadAll($) {
}
# 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);
map { $devByNr{$defs{$_}{NR}} = $_ } keys %defs;
@@ -384,14 +394,6 @@ sub cfgDB_SaveCfg() {
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}}) {
@@ -402,7 +404,7 @@ sub cfgDB_SaveCfg() {
# Insert @rowList into database table
my $fhem_dbh = _cfgDB_Connect;
- my $uuid = _cfgDB_Rotate($fhem_dbh);
+ my $uuid = _cfgDB_Rotate($fhem_dbh,$internal);
$t = localtime;
$out = "#created $t";
push @rowList, $out;
@@ -415,7 +417,7 @@ sub cfgDB_SaveCfg() {
$fhem_dbh->disconnect();
my $maxVersions = $attr{configdb}{maxversions};
$maxVersions = ($maxVersions) ? $maxVersions : 0;
- _cfgDB_Reorg($maxVersions,1) if($maxVersions);
+ _cfgDB_Reorg($maxVersions,1) if($maxVersions && $internal != -1);
return 'configDB saved.';
}
@@ -663,11 +665,11 @@ sub _cfgDB_ReadState(@) {
# rotate all versions to versionnum + 1
# return uuid for new version 0
-sub _cfgDB_Rotate($) {
- my ($fhem_dbh) = @_;
+sub _cfgDB_Rotate($$) {
+ my ($fhem_dbh,$newversion) = @_;
my $uuid = _cfgDB_Uuid;
- $fhem_dbh->do("UPDATE fhemversions SET VERSION = VERSION+1");
- $fhem_dbh->do("INSERT INTO fhemversions values (0, '$uuid')");
+ $fhem_dbh->do("UPDATE fhemversions SET VERSION = VERSION+1 where VERSION >= 0") if $newversion == 0;
+ $fhem_dbh->do("INSERT INTO fhemversions values ('$newversion', '$uuid')");
return $uuid;
}
@@ -826,12 +828,25 @@ sub _cfgDB_Reorg(;$$) {
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 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->disconnect();
return if(defined($quiet));
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
sub _cfgDB_Search($$;$) {
my ($search,$searchversion,$dsearch) = @_;
@@ -858,11 +873,16 @@ sub _cfgDB_Search($$;$) {
}
# called from cfgDB_Diff
-sub __cfgDB_Diff($$$) {
- my ($fhem_dbh,$search,$searchversion) = @_;
+sub __cfgDB_Diff($$$$) {
+ my ($fhem_dbh,$search,$searchversion,$svinternal) = @_;
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 ".
"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->execute();
while (@line = $sth->fetchrow_array()) {
@@ -874,13 +894,23 @@ sub __cfgDB_Diff($$$) {
# compare device configurations from 2 versions
sub _cfgDB_Diff($$) {
my ($search,$searchversion) = @_;
- use Text::Diff;
my ($ret, $v0, $v1);
+
+ if ($search eq 'all' && $searchversion eq 'current') {
+ _cfgDB_DeleteTemp();
+ cfgDB_SaveCfg(-1);
+ $searchversion = -1;
+ }
+
my $fhem_dbh = _cfgDB_Connect;
- $v0 = __cfgDB_Diff($fhem_dbh,$search,0);
- $v1 = __cfgDB_Diff($fhem_dbh,$search,$searchversion);
+ $v0 = __cfgDB_Diff($fhem_dbh,$search,0,$searchversion);
+ $v1 = __cfgDB_Diff($fhem_dbh,$search,$searchversion,$searchversion);
$fhem_dbh->disconnect();
$ret = diff \$v0, \$v1, { STYLE => "Table" };
+ if($searchversion == -1) {
+ _cfgDB_DeleteTemp();
+ $searchversion = "UNSAVED";
+ }
$ret = "\nNo differences found!" if !$ret;
$ret = "compare device: $search in current version 0 (left) to version: $searchversion (right)\n$ret\n";
return $ret;