\n};
@@ -767,68 +995,112 @@ sub handle_step4 {
exit;
}
- my $type = $form->{'type'} // 'account';
- my $remote = $form->{'remote'} // '';
- my $timestamp = $form->{'timestamp'} // '';
- my $path = $form->{'path'} // '';
- my $items = $form->{'items'} // '';
+ my $remote = $form->{'remote'} // '';
+ my $timestamp = $form->{'timestamp'} // '';
+ my $path = $form->{'path'} // '';
+ my $dbnames = $form->{'dbnames'} // '';
+ my $dbuser_names = $form->{'dbuser_names'} // '';
+ my $emails = $form->{'emails'} // '';
+ my $domain_names = $form->{'domain_names'} // '';
+ my $ssl_names = $form->{'ssl_names'} // '';
+ my $exclude_paths = $form->{'exclude_paths'} // '';
- $type = 'account' unless exists $TYPE_LABELS{$type};
+ # Collect selected types
+ my @all_type_keys = qw(account files database mailbox cron dbusers domains ssl);
+ my @selected_types;
+ for my $t (@all_type_keys) {
+ push @selected_types, $t if ($form->{"type_$t"} // '') eq '1';
+ }
+
+ unless (@selected_types) {
+ GnizaCPanel::UI::set_flash('error', 'No restore types selected.');
+ print "Status: 302 Found\r\n";
+ print "Location: index.live.cgi\r\n\r\n";
+ exit;
+ }
print "Content-Type: text/html\r\n\r\n";
print $cpanel->header('GNIZA Backups');
- print GnizaCPanel::UI::page_header('Restore: Results');
-
- my $type_label = GnizaCPanel::UI::esc($TYPE_LABELS{$type});
+ print GnizaCPanel::UI::page_header('Restore Results');
print qq{
\n
\n};
- print qq{
Restore Results: $type_label
\n};
+ print qq{Restore Results
\n};
my @results;
- my %action_map = (
- account => 'RESTORE_ACCOUNT',
- files => 'RESTORE_FILES',
- database => 'RESTORE_DATABASE',
- mailbox => 'RESTORE_MAILBOX',
- cron => 'RESTORE_CRON',
- dbusers => 'RESTORE_DBUSERS',
- domains => 'RESTORE_DOMAINS',
- ssl => 'RESTORE_SSL',
- );
+ for my $type (@selected_types) {
+ my $type_label = $TYPE_LABELS{$type} // $type;
- my $action = $action_map{$type};
- unless ($action) {
- push @results, { ok => 0, label => $type, msg => 'Unknown restore type' };
- _render_results(\@results);
- print qq{\n
\n};
- print qq{
Back to Categories\n};
- print GnizaCPanel::UI::page_footer();
- print $cpanel->footer();
- return;
- }
-
- if ($type eq 'account') {
- my ($ok, $stdout, $err) = _adminbin_call($action, $remote, $timestamp, '');
- push @results, { ok => $ok, label => 'Full Account', msg => $ok ? $stdout : $err };
- }
- elsif ($type eq 'cron') {
- my ($ok, $stdout, $err) = _adminbin_call($action, $remote, $timestamp);
- push @results, { ok => $ok, label => 'Cron Jobs', msg => $ok ? $stdout : $err };
- }
- elsif ($type eq 'files') {
- my ($ok, $stdout, $err) = _adminbin_call($action, $remote, $timestamp, $path, '');
- push @results, { ok => $ok, label => 'Files', msg => $ok ? $stdout : $err };
- }
- elsif ($type eq 'database' || $type eq 'dbusers' || $type eq 'mailbox' || $type eq 'domains' || $type eq 'ssl') {
- if ($items eq '' || $items eq '__ALL__') {
- my ($ok, $stdout, $err) = _adminbin_call($action, $remote, $timestamp, '');
+ if ($type eq 'account') {
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_ACCOUNT', $remote, $timestamp, $exclude_paths);
push @results, { ok => $ok, label => $type_label, msg => $ok ? $stdout : $err };
- } else {
- for my $item (split /,/, $items) {
- next if $item eq '';
- my ($ok, $stdout, $err) = _adminbin_call($action, $remote, $timestamp, $item);
- push @results, { ok => $ok, label => $item, msg => $ok ? $stdout : $err };
+ }
+ elsif ($type eq 'files') {
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_FILES', $remote, $timestamp, $path, $exclude_paths);
+ push @results, { ok => $ok, label => $type_label, msg => $ok ? $stdout : $err };
+ }
+ elsif ($type eq 'cron') {
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_CRON', $remote, $timestamp);
+ push @results, { ok => $ok, label => $type_label, msg => $ok ? $stdout : $err };
+ }
+ elsif ($type eq 'database') {
+ if ($dbnames eq '' || $dbnames eq '__ALL__') {
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_DATABASE', $remote, $timestamp, '');
+ push @results, { ok => $ok, label => $type_label, msg => $ok ? $stdout : $err };
+ } else {
+ for my $item (split /,/, $dbnames) {
+ next if $item eq '';
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_DATABASE', $remote, $timestamp, $item);
+ push @results, { ok => $ok, label => $item, msg => $ok ? $stdout : $err };
+ }
+ }
+ }
+ elsif ($type eq 'dbusers') {
+ if ($dbuser_names eq '' || $dbuser_names eq '__ALL__') {
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_DBUSERS', $remote, $timestamp, '');
+ push @results, { ok => $ok, label => $type_label, msg => $ok ? $stdout : $err };
+ } else {
+ for my $item (split /,/, $dbuser_names) {
+ next if $item eq '';
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_DBUSERS', $remote, $timestamp, $item);
+ push @results, { ok => $ok, label => $item, msg => $ok ? $stdout : $err };
+ }
+ }
+ }
+ elsif ($type eq 'mailbox') {
+ if ($emails eq '' || $emails eq '__ALL__') {
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_MAILBOX', $remote, $timestamp, '');
+ push @results, { ok => $ok, label => $type_label, msg => $ok ? $stdout : $err };
+ } else {
+ for my $item (split /,/, $emails) {
+ next if $item eq '';
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_MAILBOX', $remote, $timestamp, $item);
+ push @results, { ok => $ok, label => $item, msg => $ok ? $stdout : $err };
+ }
+ }
+ }
+ elsif ($type eq 'domains') {
+ if ($domain_names eq '' || $domain_names eq '__ALL__') {
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_DOMAINS', $remote, $timestamp, '');
+ push @results, { ok => $ok, label => $type_label, msg => $ok ? $stdout : $err };
+ } else {
+ for my $item (split /,/, $domain_names) {
+ next if $item eq '';
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_DOMAINS', $remote, $timestamp, $item);
+ push @results, { ok => $ok, label => $item, msg => $ok ? $stdout : $err };
+ }
+ }
+ }
+ elsif ($type eq 'ssl') {
+ if ($ssl_names eq '' || $ssl_names eq '__ALL__') {
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_SSL', $remote, $timestamp, '');
+ push @results, { ok => $ok, label => $type_label, msg => $ok ? $stdout : $err };
+ } else {
+ for my $item (split /,/, $ssl_names) {
+ next if $item eq '';
+ my ($ok, $stdout, $err) = _adminbin_call('RESTORE_SSL', $remote, $timestamp, $item);
+ push @results, { ok => $ok, label => $item, msg => $ok ? $stdout : $err };
+ }
}
}
}
@@ -837,7 +1109,7 @@ sub handle_step4 {
print qq{
\n