#!/usr/local/bin/perl
# Actually restore some servers, after asking for confirmation
require './virtual-server-lib.pl';
&can_backup_domains() || &error($text{'restore_ecannot'});
&ReadParse();
# Validate inputs
&error_setup($text{'restore_err'});
if ($in{'src'}) {
$src = $in{'src'};
}
else {
$src = &parse_backup_destination("src", \%in);
}
($mode) = &parse_backup_url($src);
$mode > 0 || -r $src || -d $src || &error($text{'restore_esrc'});
if ($in{'feature_all'}) {
@do_features = ( &get_available_backup_features(), @backup_plugins );
}
else {
@do_features = split(/\0/, $in{'feature'});
}
@do_features || &error($text{'restore_efeatures'});
%do_features = map { $_, 1 } @do_features;
$d = defined($in{'onedom'}) ? &get_domain($in{'onedom'}) : undef;
@vbs = split(/\0/, $in{'virtualmin'});
%vbs = map { $_, 1 } @vbs;
# Parse option inputs
foreach $f (@do_features) {
local $ofunc = "parse_restore_$f";
if (defined(&$ofunc)) {
$options{$f} = &$ofunc(\%in, $d);
}
}
$options{'reuid'} = $in{'reuid'};
$options{'fix'} = $in{'fix'};
$cont = &backup_contents($src);
if (!$in{'confirm'}) {
# See what is in the tar file or directory
ref($cont) || &error(&text('restore_efile', $cont));
(keys %$cont) || &error($text{'restore_enone'});
}
else {
# Find the selected domains
$gotvbs = 0;
foreach $d (split(/\0/, $in{'dom'})) {
if ($d eq "virtualmin") {
$gotvbs = 1;
next;
}
local $dinfo = &get_domain_by("dom", $d);
if ($dinfo) {
push(@doms, $dinfo);
}
else {
push(@doms, { 'dom' => $d,
'missing' => 1 });
}
}
@vbs = ( ) if (!$gotvbs);
@doms || @vbs || &error($text{'restore_edoms'});
}
if ($in{'confirm'}) {
&ui_print_unbuffered_header(undef, $text{'restore_title'}, "");
}
else {
&ui_print_header(undef, $text{'restore_title'}, "");
}
$nice = &nice_backup_url($src);
if (!$in{'confirm'}) {
# Tell the user what will be done
print &ui_form_start("restore.cgi", "post");
print &text('restore_from', $nice),"<p>\n";
@links = ( &select_all_link("dom", 0), &select_invert_link("dom", 0) );
print &ui_links_row(\@links);
# Show domains
%plugins = map { $_, 1 } @backup_plugins;
print "<dl>\n";
foreach $d (sort { $a cmp $b } keys %$cont) {
next if ($d eq "virtualmin");
print "<dt>",&ui_checkbox("dom", $d, "<b>$d</b>", 1),"\n";
if (!&get_domain_by("dom", $d)) {
print "($text{'restore_create'})\n";
}
@dfeats = grep { $do_features{$_} } @{$cont->{$d}};
@dfeats_f = grep { !$plugins{$_} } @dfeats;
@dfeats_p = grep { $plugins{$_} } @dfeats;
if (!@dfeats && !$in{'fix'}) {
print "<dd><i>$text{'restore_nofeat'}</i>\n";
}
else {
print "<dd>",join("<br>",
map { $text{'backup_feature_'.$_} ||
$text{'feature_'.$_} } @dfeats_f),"\n";
print "<dd>",join("<br>",
map { &plugin_call($_, "feature_backup_name") ||
&plugin_call($_, "feature_name") }
@dfeats_p),"\n";
$any++;
}
}
# Show virtualmin settings
if ($cont->{'virtualmin'}) {
print "<dt>",&ui_checkbox("dom", "virtualmin",
"<b>$text{'restore_dovirtualmin'}</b>", 1),"\n";
@dvbs = grep { $vbs{$_} } @{$cont->{'virtualmin'}};
if (!@dvbs) {
print "<dd><i>$text{'restore_novirt'}</i>\n";
}
else {
print "<dd>",join("<br>",
map { $text{'backup_v'.$_} } @dvbs),"\n";
$any++;
}
}
print "</dl>\n";
print &ui_links_row(\@links);
if ($any) {
# Pass all HTML inputs to program again, and show OK button
print &ui_hidden("src", $src),"\n";
foreach $i (keys %in) {
next if ($i =~ /^src_/);
foreach $v (split(/\0/, $in{$i})) {
print &ui_hidden($i, $v),"\n";
}
}
print "<center>",&ui_submit($text{'restore_now2'}, "confirm"),
"</center>\n";
}
else {
print "$text{'restore_notany'}<p>\n";
}
print &ui_form_end();
}
else {
# Actually execute the restore
if (@doms) {
print &text('restore_doing', scalar(@doms), $nice),"<p>\n";
}
else {
print &text('restore_doing2', scalar(@vbs), $nice),"<p>\n";
}
$ok = &restore_domains($src, \@doms, \@do_features, \%options, \@vbs,
$in{'only'});
&run_post_actions();
if ($ok) {
print &text('restore_done'),"<p>\n";
}
else {
print &text('restore_failed'),"<p>\n";
}
&webmin_log("restore", $src, undef,
{ 'doms' => [ map { $_->{'dom'} } @doms ] });
# Call any theme post command
foreach my $d (@doms) {
if (defined(&theme_post_save_domain)) {
&theme_post_save_domain($d,
$d->{'missing'} ? 'create' : 'modify');
}
}
}
if (defined($in{'onedom'})) {
# Link is back to view/edit form
&ui_print_footer(&domain_footer_link(&get_domain($in{'onedom'})));
}
else {
&ui_print_footer("", $text{'index_return'});
}
syntax highlighted by Code2HTML, v. 0.9.1