98_restore.pm 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. ################################################################
  2. # $Id: 98_restore.pm 12451 2016-10-28 06:56:47Z rudolfkoenig $
  3. package main;
  4. use strict;
  5. use warnings;
  6. use File::Copy qw(cp);
  7. sub CommandUpdate($$);
  8. sub restoreFile($$$);
  9. sub restoreDir($$$);
  10. ########################################
  11. sub
  12. restore_Initialize($$)
  13. {
  14. my %hash = (
  15. Fn => "CommandRestore",
  16. Hlp => "[-a|list] [<filename|directory>],restore files saved by update",
  17. );
  18. $cmds{restore} = \%hash;
  19. }
  20. ########################################
  21. sub
  22. CommandRestore($$)
  23. {
  24. my ($cl,$param) = @_;
  25. my @args = split(/ +/,$param);
  26. my $list = (@args > 0 && $args[0] eq "list");
  27. shift @args if($list);
  28. my $all = (@args > 0 && $args[0] eq "-a");
  29. shift @args if($all);
  30. my $filename = shift @args;
  31. my $dest = $attr{global}{modpath};
  32. my $src = "$dest/restoreDir";
  33. $list = 1 if(!$list && !$filename);
  34. return "Usage: restore [-a|list] filename|directory"
  35. if(@args);
  36. $filename = "" if(!$filename);
  37. $filename =~ s/\.\.//g;
  38. return "restoreDir is not yet created" if(!-d $src);
  39. return "list argument must be a directory" if($list && !-d "$src/$filename");
  40. if($list) {
  41. my $dh;
  42. opendir($dh, "$src/$filename") || return "opendir $src/$filename: $!";
  43. my @files = readdir($dh);
  44. closedir($dh);
  45. return "Available for restore".($filename ? " in $filename":"").":\n ".
  46. join("\n ", sort grep { $_ ne "." && $_ ne ".." } @files);
  47. }
  48. return "$filename is not available for restore" if(!-e "$src/$filename");
  49. $filename .= "/" if($filename !~ m,/,); # needed for the regexp below
  50. $filename =~ m,^([^/]*)/(.*)$,;
  51. $src = "$src/$filename";
  52. $dest = "$dest/$2" if($2);
  53. return (-f $src ? restoreFile($src,$dest,$all) : restoreDir($src,$dest,$all)).
  54. "\n\nrestore finished";
  55. }
  56. sub
  57. restoreFile($$$)
  58. {
  59. my ($src, $dest, $all) = @_;
  60. if((index($dest,$attr{global}{configfile}) >= 0 ||
  61. index($dest,$attr{global}{statefile}) >= 0 ) && !$all) {
  62. return "skipping $dest";
  63. }
  64. cp($src, $dest) || return "cp $src $dest failed: $!";
  65. return "restore $dest";
  66. }
  67. sub
  68. restoreDir($$$)
  69. {
  70. my ($src, $dest, $all, $dh, @ret) = @_;
  71. opendir($dh, $src) || return "opendir $src: $!";
  72. my @files = sort grep { $_ ne "." && $_ ne ".." } readdir($dh);
  73. closedir($dh);
  74. foreach my $f (@files){
  75. if(-d "$src/$f") {
  76. push @ret, restoreDir("$src/$f", "$dest/$f", $all);
  77. } else {
  78. push @ret, restoreFile("$src/$f", "$dest/$f", $all);
  79. }
  80. }
  81. return join("\n", @ret);
  82. }
  83. 1;
  84. =pod
  85. =item command
  86. =item summary restore program files modified by the update command
  87. =item summary_DE durch das update Befehl ge&auml;nderte Programmdateien wiederherstellen
  88. =begin html
  89. <a name="restore"></a>
  90. <h3>restore</h3>
  91. <ul>
  92. <code>restore list [&lt;filename|directory&gt;]<br>
  93. restore [&lt;filename|directory&gt;]<br>
  94. restore -a [&lt;filename|directory&gt;]</code>
  95. <br><br>
  96. Restore the files saved previously by the update command. Check the available
  97. files with the list argument. See also the update command and its restoreDirs
  98. attribute. After a restore normally a "shutdown restart" is necessary.<br>
  99. If the -a option is specified, the configuration files are also restored.
  100. </ul>
  101. =end html
  102. =begin html_DE
  103. <a name="restore"></a>
  104. <h3>restore</h3>
  105. <ul>
  106. <code>restore list [&lt;filename|directory&gt;]<br>
  107. restore [&lt;filename|directory&gt;]<br>
  108. restore -a [&lt;filename|directory&gt;]</code>
  109. <br><br>
  110. Restauriert die beim update gesicherten Dateien. Mit dem Argument list kann
  111. man die Liste der verf&&uuml;gbaeren Sicherungen anzeigen, und mit der Angabe
  112. der direkten Datei/Verzeichnis kann man das zur&uuml;cksichern anstossen.
  113. Siehe auch das update Befehl, bzw. das restoreDirs Attribut.
  114. Nach restore ist meistens ein "shutdown restart" notwendig.<br>
  115. Falls die -a Option spezifiziert wurde, dann werden auch die
  116. Konfigurationsdateien wiederhergestellt.
  117. </ul>
  118. =end html_DE
  119. =cut