diff --git a/whm/gniza-whm/index.cgi b/whm/gniza-whm/index.cgi index c2e1d5c..d948977 100644 --- a/whm/gniza-whm/index.cgi +++ b/whm/gniza-whm/index.cgi @@ -69,12 +69,12 @@ print qq{
\n< print qq{

Active Cron Schedules

\n}; if (keys %$schedules) { print qq{
\n}; - print qq{\n}; + print qq{\n}; print qq{\n}; for my $name (sort keys %$schedules) { my $esc_name = GnizaWHM::UI::esc($name); - my $esc_line = GnizaWHM::UI::esc($schedules->{$name}); - print qq{\n}; + my $human = GnizaWHM::UI::esc(GnizaWHM::Cron::cron_to_human($schedules->{$name})); + print qq{\n}; } print qq{\n
ScheduleCron Entry
ScheduleTiming
$esc_name$esc_line
$esc_name$human
\n}; } else { diff --git a/whm/gniza-whm/lib/GnizaWHM/Cron.pm b/whm/gniza-whm/lib/GnizaWHM/Cron.pm index 465e5f5..55ae8f7 100644 --- a/whm/gniza-whm/lib/GnizaWHM/Cron.pm +++ b/whm/gniza-whm/lib/GnizaWHM/Cron.pm @@ -110,6 +110,58 @@ sub remove_schedule { return _write_crontab($new_crontab); } +# cron_to_human($cron_line) +# Converts a gniza cron line to a human-readable description. +# e.g. "0 * * * * /usr/local/bin/gniza backup --remote=rasp ..." => "Every hour, to rasp" +sub cron_to_human { + my ($cron_line) = @_; + + # Extract the 5 cron fields + my @parts = split /\s+/, $cron_line, 6; + return $cron_line if @parts < 6; + my ($min, $hour, $dom, $mon, $dow) = @parts[0..4]; + + # Build timing description + my $timing; + my @dow_names = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday); + + if ($hour eq '*' && $dom eq '*' && $mon eq '*' && $dow eq '*') { + # Hourly + $timing = 'Every hour'; + } + elsif ($dom eq '*' && $mon eq '*' && $dow eq '*') { + # Daily + $timing = sprintf('Daily at %02d:%02d', $hour, $min); + } + elsif ($dom eq '*' && $mon eq '*' && $dow =~ /^[0-6]$/) { + # Weekly + my $day_name = $dow_names[$dow] // "day $dow"; + $timing = sprintf('Every %s at %02d:%02d', $day_name, $hour, $min); + } + elsif ($mon eq '*' && $dow eq '*' && $dom =~ /^\d+$/) { + # Monthly + my $suffix = ($dom == 1 || $dom == 21 || $dom == 31) ? 'st' + : ($dom == 2 || $dom == 22) ? 'nd' + : ($dom == 3 || $dom == 23) ? 'rd' + : 'th'; + $timing = sprintf('%d%s of each month at %02d:%02d', $dom, $suffix, $hour, $min); + } + else { + $timing = "$min $hour $dom $mon $dow"; + } + + # Extract target remotes from --remote= flag + my $remotes = ''; + if ($cron_line =~ /--remote=(\S+)/) { + $remotes = $1; + } + + if ($remotes ne '') { + return "$timing, to $remotes"; + } + return "$timing, all remotes"; +} + # -- Private -- # Only these exact commands are allowed.