diff --git a/fhem/FHEM/98_configdb.pm b/fhem/FHEM/98_configdb.pm index 50a04530e..46e00e017 100644 --- a/fhem/FHEM/98_configdb.pm +++ b/fhem/FHEM/98_configdb.pm @@ -59,64 +59,66 @@ sub CommandConfigdb($$) { } when ('dump') { - - my ($dbconn,$dbuser,$dbpass,$dbtype) = _cfgDB_readConfig(); - my ($dbname,$dbhostname,$dbport,$gzip,$mp,$ret,$size,$source,$target,$ts); - $ts = strftime('%Y-%m-%d_%H-%M-%S',localtime); - $mp = $configDB{attr}{'dumpPath'}; - $mp //= AttrVal('global','modpath','.').'/log'; - $target = "$mp/configDB_$ts.dump"; - - if (lc($param1) eq 'unzipped') { - $gzip = ''; - } else { - $gzip = '| gzip -c'; - $target .= '.gz'; - } - - if ($dbtype eq 'SQLITE') { - (undef,$source) = split (/=/, $dbconn); - my $dumpcmd = "echo '.dump fhem%' | sqlite3 $source $gzip > $target"; - Log 4,"configDB: $dumpcmd"; - $ret = qx($dumpcmd); - return $ret if $ret; # return error message if available - - } elsif ($dbtype eq 'MYSQL') { - ($dbname,$dbhostname,$dbport) = split (/;/,$dbconn); - $dbport //= '=3306'; - (undef,$dbname) = split (/=/,$dbname); - (undef,$dbhostname) = split (/=/,$dbhostname); - (undef,$dbport) = split (/=/,$dbport); - my $dbtables = "fhemversions fhemconfig fhemstate fhemb64filesave"; - my $dumpcmd = "mysqldump --user=$dbuser --password=$dbpass --host=$dbhostname --port=$dbport -Q $dbname $dbtables $gzip > $target"; - Log 4,"configDB: $dumpcmd"; - $ret = qx($dumpcmd); - return $ret if $ret; - $source = $dbname; - - } elsif ($dbtype eq 'POSTGRESQL') { - ($dbname,$dbhostname,$dbport) = split (/;/,$dbconn); - $dbport //= '=5432'; - (undef,$dbname) = split (/=/,$dbname); - (undef,$dbhostname) = split (/=/,$dbhostname); - (undef,$dbport) = split (/=/,$dbport); - my $dbtables = "-t fhemversions -t fhemconfig -t fhemstate -t fhemb64filesave"; - my $dumpcmd = "PGPASSWORD=$dbpass pg_dump -U $dbuser -h $dbhostname -p $dbport $dbname $dbtables $gzip > $target"; - Log 4,"configDB: $dumpcmd"; - $ret = qx($dumpcmd); - return $ret if $ret; - $source = $dbname; - - } else { - return "configdb dump not supported for $dbtype!"; - } - - $size = -s $target; - $size //= 0; - $ret = "configDB dumped $size bytes\nfrom: $source\n to: $target"; - return $ret; + return _cfgDB_dump($param1); } +# my ($dbconn,$dbuser,$dbpass,$dbtype) = _cfgDB_readConfig(); +# my ($dbname,$dbhostname,$dbport,$gzip,$mp,$ret,$size,$source,$target,$ts); +# $ts = strftime('%Y-%m-%d_%H-%M-%S',localtime); +# $mp = $configDB{attr}{'dumpPath'}; +# $mp //= AttrVal('global','modpath','.').'/log'; +# $target = "$mp/configDB_$ts.dump"; +# +# if (lc($param1) eq 'unzipped') { +# $gzip = ''; +# } else { +# $gzip = '| gzip -c'; +# $target .= '.gz'; +# } +# +# if ($dbtype eq 'SQLITE') { +# (undef,$source) = split (/=/, $dbconn); +# my $dumpcmd = "echo '.dump fhem%' | sqlite3 $source $gzip > $target"; +# Log 4,"configDB: $dumpcmd"; +# $ret = qx($dumpcmd); +# return $ret if $ret; # return error message if available +# +# } elsif ($dbtype eq 'MYSQL') { +# ($dbname,$dbhostname,$dbport) = split (/;/,$dbconn); +# $dbport //= '=3306'; +# (undef,$dbname) = split (/=/,$dbname); +# (undef,$dbhostname) = split (/=/,$dbhostname); +# (undef,$dbport) = split (/=/,$dbport); +# my $dbtables = "fhemversions fhemconfig fhemstate fhemb64filesave"; +# my $dumpcmd = "mysqldump --user=$dbuser --password=$dbpass --host=$dbhostname --port=$dbport -Q $dbname $dbtables $gzip > $target"; +# Log 4,"configDB: $dumpcmd"; +# $ret = qx($dumpcmd); +# return $ret if $ret; +# $source = $dbname; +# +# } elsif ($dbtype eq 'POSTGRESQL') { +# ($dbname,$dbhostname,$dbport) = split (/;/,$dbconn); +# $dbport //= '=5432'; +# (undef,$dbname) = split (/=/,$dbname); +# (undef,$dbhostname) = split (/=/,$dbhostname); +# (undef,$dbport) = split (/=/,$dbport); +# my $dbtables = "-t fhemversions -t fhemconfig -t fhemstate -t fhemb64filesave"; +# my $dumpcmd = "PGPASSWORD=$dbpass pg_dump -U $dbuser -h $dbhostname -p $dbport $dbname $dbtables $gzip > $target"; +# Log 4,"configDB: $dumpcmd"; +# $ret = qx($dumpcmd); +# return $ret if $ret; +# $source = $dbname; +# +# } else { +# return "configdb dump not supported for $dbtype!"; +# } +# +# $size = -s $target; +# $size //= 0; +# $ret = "configDB dumped $size bytes\nfrom: $source\n to: $target"; +# return $ret; +# } + when ('diff') { return "\n Syntax: configdb diff " if @a != 3; Log3('configdb', 4, "configdb: diff requested for device: $param1 in version $param2."); diff --git a/fhem/configDB.pm b/fhem/configDB.pm index 85eb00202..befade5b4 100644 --- a/fhem/configDB.pm +++ b/fhem/configDB.pm @@ -126,7 +126,8 @@ # # 2017-08-31 - changed improve table_info for migration check # -# 2018-02-17 - changed. remove experimenatal cache functions +# 2018-02-17 - changed remove experimenatal cache functions +# 2018-02-18 - changed move dump processing to backend # ############################################################################## =cut @@ -182,6 +183,7 @@ sub _cfgDB_Rotate($$); sub _cfgDB_Search($$;$); sub _cfgDB_Uuid(); sub _cfgDB_table_exists($$); +sub _cfgDB_dump($); ################################################## # Read configuration file for DB connection @@ -1150,6 +1152,68 @@ sub _cfgDB_type() { return "$cfgDB_dbtype (b64)"; } +sub _cfgDB_dump($) { + my ($param1) = @_; + $param1 //= ''; + + my ($dbconn,$dbuser,$dbpass,$dbtype) = _cfgDB_readConfig(); + my ($dbname,$dbhostname,$dbport,$gzip,$mp,$ret,$size,$source,$target,$ts); + $ts = strftime('%Y-%m-%d_%H-%M-%S',localtime); + $mp = $configDB{attr}{'dumpPath'}; + $mp //= AttrVal('global','modpath','.').'/log'; + $target = "$mp/configDB_$ts.dump"; + + if (lc($param1) eq 'unzipped') { + $gzip = ''; + } else { + $gzip = '| gzip -c'; + $target .= '.gz'; + } + + if ($dbtype eq 'SQLITE') { + (undef,$source) = split (/=/, $dbconn); + my $dumpcmd = "echo '.dump fhem%' | sqlite3 $source $gzip > $target"; + Log 4,"configDB: $dumpcmd"; + $ret = qx($dumpcmd); + return $ret if $ret; # return error message if available + + } elsif ($dbtype eq 'MYSQL') { + ($dbname,$dbhostname,$dbport) = split (/;/,$dbconn); + $dbport //= '=3306'; + (undef,$dbname) = split (/=/,$dbname); + (undef,$dbhostname) = split (/=/,$dbhostname); + (undef,$dbport) = split (/=/,$dbport); + my $dbtables = "fhemversions fhemconfig fhemstate fhemb64filesave"; + my $dumpcmd = "mysqldump --user=$dbuser --password=$dbpass --host=$dbhostname --port=$dbport -Q $dbname $dbtables $gzip > $target"; + Log 4,"configDB: $dumpcmd"; + $ret = qx($dumpcmd); + return $ret if $ret; + $source = $dbname; + + } elsif ($dbtype eq 'POSTGRESQL') { + ($dbname,$dbhostname,$dbport) = split (/;/,$dbconn); + $dbport //= '=5432'; + (undef,$dbname) = split (/=/,$dbname); + (undef,$dbhostname) = split (/=/,$dbhostname); + (undef,$dbport) = split (/=/,$dbport); + my $dbtables = "-t fhemversions -t fhemconfig -t fhemstate -t fhemb64filesave"; + my $dumpcmd = "PGPASSWORD=$dbpass pg_dump -U $dbuser -h $dbhostname -p $dbport $dbname $dbtables $gzip > $target"; + Log 4,"configDB: $dumpcmd"; + $ret = qx($dumpcmd); + return $ret if $ret; + $source = $dbname; + + } else { + return "configdb dump not supported for $dbtype!"; + } + + $size = -s $target; + $size //= 0; + $ret = "configDB dumped $size bytes\nfrom: $source\n to: $target"; + return $ret; + +} + ################################################## # functions used for file handling # called by 98_configdb.pm