98_restore.pm 3.9 KB

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