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{| Schedule | Cron Entry |
\n};
+ print qq{| Schedule | Timing |
\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{| $esc_name | $esc_line |
\n};
+ my $human = GnizaWHM::UI::esc(GnizaWHM::Cron::cron_to_human($schedules->{$name}));
+ print qq{| $esc_name | $human |
\n};
}
print qq{\n
\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.