From a525aee351bac7ce7f5a952ab8e6aef12e8e83b4 Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Fri, 28 Oct 2016 06:46:52 +0000 Subject: [PATCH] update/restore: save & restore the configuration files too. git-svn-id: https://svn.fhem.de/fhem/trunk@12450 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_restore.pm | 36 +++++++++++++++++++++++------------- fhem/FHEM/98_update.pm | 22 ++++++++++++++++++++++ 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/fhem/FHEM/98_restore.pm b/fhem/FHEM/98_restore.pm index 29c45bb8a..fd3db676c 100644 --- a/fhem/FHEM/98_restore.pm +++ b/fhem/FHEM/98_restore.pm @@ -7,8 +7,8 @@ use warnings; use File::Copy qw(cp); sub CommandUpdate($$); -sub restoreFile($$); -sub restoreDir($$); +sub restoreFile($$$); +sub restoreDir($$$); ######################################## sub @@ -29,12 +29,14 @@ CommandRestore($$) my @args = split(/ +/,$param); my $list = (@args > 0 && $args[0] eq "list"); shift @args if($list); + my $all = (@args > 0 && $args[0] eq "-a"); + shift @args if($all); my $filename = shift @args; my $dest = $attr{global}{modpath}; my $src = "$dest/restoreDir"; $list = 1 if(!$list && !$filename); - return "Usage: restore [list] filename|directory" + return "Usage: restore [-a|list] filename|directory" if(@args); $filename = "" if(!$filename); @@ -58,30 +60,34 @@ CommandRestore($$) $src = "$src/$filename"; $dest = "$dest/$2" if($2); - return (-f $src ? restoreFile($src, $dest) : restoreDir($src, $dest)). + return (-f $src ? restoreFile($src,$dest,$all) : restoreDir($src,$dest,$all)). "\n\nrestore finished"; } sub -restoreFile($$) +restoreFile($$$) { - my ($src, $dest) = @_; + my ($src, $dest, $all) = @_; + if((index($dest,$attr{global}{configfile}) >= 0 || + index($dest,$attr{global}{statefile}) >= 0 ) && !$all) { + return "skipping $dest"; + } cp($src, $dest) || return "cp $src $dest failed: $!"; return "restore $dest"; } sub -restoreDir($$) +restoreDir($$$) { - my ($src, $dest, $dh, @ret) = @_; + my ($src, $dest, $all, $dh, @ret) = @_; opendir($dh, $src) || return "opendir $src: $!"; my @files = sort grep { $_ ne "." && $_ ne ".." } readdir($dh); closedir($dh); foreach my $f (@files){ if(-d "$src/$f") { - push @ret, restoreDir("$src/$f", "$dest/$f"); + push @ret, restoreDir("$src/$f", "$dest/$f", $all); } else { - push @ret, restoreFile("$src/$f", "$dest/$f"); + push @ret, restoreFile("$src/$f", "$dest/$f", $all); } } return join("\n", @ret); @@ -98,12 +104,14 @@ restoreDir($$)

restore

=end html @@ -119,7 +127,9 @@ restoreDir($$) man die Liste der verf&ügbaeren Sicherungen anzeigen, und mit der Angabe der direkten Datei/Verzeichnis kann man das zurücksichern anstossen. Siehe auch das update Befehl, bzw. das restoreDirs Attribut. - Nach restore ist meistens ein "shutdown restart" notwendig. + Nach restore ist meistens ein "shutdown restart" notwendig.
+ Falls die -a Option spezifiziert wurde, dann werden auch die + Konfigurationsdateien wiederhergestellt. diff --git a/fhem/FHEM/98_update.pm b/fhem/FHEM/98_update.pm index 303002652..d6f1cea2c 100644 --- a/fhem/FHEM/98_update.pm +++ b/fhem/FHEM/98_update.pm @@ -17,6 +17,7 @@ sub upd_writeFile($$$$); sub upd_mv($$); sub upd_metainit($); sub upd_metacmd($@); +sub upd_saveConfig($$$); my $updateInBackground; my $updRet; @@ -379,6 +380,12 @@ doUpdate($$$$) return if(!upd_writeFile($root, $restoreDir, $fName, $remFile)); } + if($nChanged) { + for my $f ($attr{global}{configfile}, $attr{global}{statefile}) { + upd_saveConfig($root, $restoreDir, $f) if($f !~ m,(^/|\.\.),); + } + } + uLog 1, "nothing to do..." if($nChanged == 0 && $nSkipped == 0); if(@rl && ($nChanged || $nSkipped)) { @@ -517,6 +524,21 @@ upd_getUrl($) return $data; } +sub +upd_saveConfig($$$) +{ + my($root, $restoreDir, $fName) = @_; + + return if(!$restoreDir || configDBUsed() || !-r "$root/$fName"); + upd_mkDir($root, "$restoreDir/$fName", 1); + Log 1, "saving $fName"; + if(!copy("$root/$fName", "$root/$restoreDir/$fName")) { + uLog 1, "copy $root/$fName $root/$restoreDir/$fName failed:$!, ". + "aborting the update"; + return 0; + } +} + sub upd_writeFile($$$$) {