mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-16 10:46:03 +00:00
update/restore: save & restore the configuration files too.
git-svn-id: https://svn.fhem.de/fhem/trunk@12450 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
1ab9d0ddec
commit
a525aee351
@ -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($$)
|
||||
<a name="restore"></a>
|
||||
<h3>restore</h3>
|
||||
<ul>
|
||||
<code>restore list [<filename|directory>]<br>
|
||||
<code>restore [-a|list] [<filename|directory>]<br>
|
||||
restore [<filename|directory>]</code>
|
||||
<br><br>
|
||||
Restore the files saved previously by the update command. Check the available
|
||||
files with the list argument. See also the update command and its restoreDirs
|
||||
attribute. After a restore normally a "shutdown restart" is necessary.
|
||||
attribute. After a restore normally a "shutdown restart" is necessary.<br>
|
||||
If the -a option is specified, the configuration files are also restored.
|
||||
|
||||
</ul>
|
||||
|
||||
=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.<br>
|
||||
Falls die -a Option spezifiziert wurde, dann werden auch die
|
||||
Konfigurationsdateien wiederhergestellt.
|
||||
</ul>
|
||||
|
||||
|
||||
|
@ -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($$$$)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user