diff --git a/whm/gniza-whm/schedules.cgi b/whm/gniza-whm/schedules.cgi index 0447e4b..19805fd 100644 --- a/whm/gniza-whm/schedules.cgi +++ b/whm/gniza-whm/schedules.cgi @@ -22,8 +22,9 @@ my $action = $form->{'action'} // 'list'; if ($action eq 'add') { handle_add() } elsif ($action eq 'edit') { handle_edit() } elsif ($action eq 'delete') { handle_delete() } -elsif ($action eq 'toggle_cron') { handle_toggle_cron() } -elsif ($action eq 'run_now') { handle_run_now() } +elsif ($action eq 'toggle_cron') { handle_toggle_cron() } +elsif ($action eq 'toggle_sysbackup') { handle_toggle_sysbackup() } +elsif ($action eq 'run_now') { handle_run_now() } else { handle_list() } exit; @@ -47,7 +48,7 @@ sub handle_list { if (@schedules) { print qq{
| Name | Type | Time | Day | Remotes | Active | Actions | |
|---|---|---|---|---|---|---|---|
| Name | Type | Time | Day | Remotes | Sys Backup | Active | Actions |
| $esc_name | }; print qq{$esc_sched | $esc_time | $esc_day | $esc_remotes | }; print qq{}; + print qq{}; + print qq{ | }; + print qq{}; print qq{}; print qq{ | }; print qq{}; @@ -115,6 +122,25 @@ function gnizaToggleCron(el) { el.disabled = false; }); } +function gnizaToggleSysbackup(el) { + var name = el.getAttribute('data-schedule'); + el.disabled = true; + var fd = new FormData(); + fd.append('action', 'toggle_sysbackup'); + fd.append('name', name); + fd.append('gniza_csrf', gnizaCsrf); + fetch('schedules.cgi', { method: 'POST', body: fd }) + .then(function(r) { return r.json(); }) + .then(function(d) { + gnizaCsrf = d.csrf; + el.checked = d.active; + el.disabled = false; + }) + .catch(function() { + el.checked = !el.checked; + el.disabled = false; + }); +} \n}; # Action buttons @@ -453,6 +479,51 @@ sub handle_toggle_cron { } } +# ── Toggle Sysbackup ──────────────────────────────────────────── + +sub handle_toggle_sysbackup { + if ($method ne 'POST') { + print "Status: 302 Found\r\n"; + print "Location: schedules.cgi\r\n\r\n"; + exit; + } + + unless (GnizaWHM::UI::verify_csrf_token($form->{'gniza_csrf'})) { + my $new_csrf = GnizaWHM::UI::generate_csrf_token(); + _json_response(0, 0, 'Invalid or expired form token.', $new_csrf); + } + + my $new_csrf = GnizaWHM::UI::generate_csrf_token(); + + my $name = $form->{'name'} // ''; + my $name_err = GnizaWHM::Validator::validate_schedule_name($name); + if ($name_err) { + _json_response(0, 0, 'Invalid schedule name.', $new_csrf); + } + + my $conf_path = GnizaWHM::UI::schedule_conf_path($name); + unless (-f $conf_path) { + _json_response(0, 0, "Schedule '$name' not found.", $new_csrf); + } + + my $conf = GnizaWHM::Config::parse($conf_path, 'schedule'); + my $is_on = (($conf->{SYSBACKUP} // '') eq 'yes'); + + # Toggle the value + $conf->{SYSBACKUP} = $is_on ? '' : 'yes'; + my ($ok, $err) = GnizaWHM::Config::write($conf_path, $conf, \@GnizaWHM::Config::SCHEDULE_KEYS); + + if ($ok) { + # Reinstall cron so --sysbackup flag is updated + GnizaWHM::Cron::install_schedule($name); + my $new_state = $is_on ? 0 : 1; + my $label = $new_state ? 'enabled' : 'disabled'; + _json_response(1, $new_state, "System backup $label for '$name'.", $new_csrf); + } else { + _json_response(0, $is_on ? 1 : 0, "Failed to update config: $err", $new_csrf); + } +} + sub _json_response { my ($ok, $active, $message, $csrf) = @_; # Escape for JSON |