Add Status column (Success/Warning/Error) to WHM logs list

Scans each log file for [ERROR] and [WARN] markers and displays
a color-coded badge in the logs table.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
shuki
2026-03-05 03:40:45 +02:00
parent 05db1f2340
commit d069c490ae

View File

@@ -56,11 +56,13 @@ sub show_list {
my $path = "$log_dir/$entry"; my $path = "$log_dir/$entry";
next unless -f $path; next unless -f $path;
my @stat = stat($path); my @stat = stat($path);
my $status = _detect_log_status($path);
push @files, { push @files, {
name => $entry, name => $entry,
size => $stat[7] // 0, size => $stat[7] // 0,
mtime => $stat[9] // 0, mtime => $stat[9] // 0,
type => ($entry =~ /^cron-/) ? 'Cron' : 'Backup', type => ($entry =~ /^cron-/) ? 'Cron' : 'Backup',
status => $status,
}; };
} }
closedir $dh; closedir $dh;
@@ -89,7 +91,7 @@ sub show_list {
print qq{<div class="overflow-x-auto rounded-box border border-base-content/5 bg-base-100">\n}; print qq{<div class="overflow-x-auto rounded-box border border-base-content/5 bg-base-100">\n};
print qq{<table class="table">\n}; print qq{<table class="table">\n};
print qq{<thead><tr><th>Filename</th><th>Type</th><th>Date</th><th>Size</th><th></th></tr></thead>\n}; print qq{<thead><tr><th>Filename</th><th>Type</th><th>Status</th><th>Date</th><th>Size</th><th></th></tr></thead>\n};
print qq{<tbody>\n}; print qq{<tbody>\n};
for my $f (@page_files) { for my $f (@page_files) {
@@ -102,6 +104,10 @@ sub show_list {
print qq{<tr>\n}; print qq{<tr>\n};
print qq{ <td><code>$esc_name</code></td>\n}; print qq{ <td><code>$esc_name</code></td>\n};
print qq{ <td><span class="badge $badge badge-sm">$f->{type}</span></td>\n}; print qq{ <td><span class="badge $badge badge-sm">$f->{type}</span></td>\n};
my $status_badge = $f->{status} eq 'Error' ? 'badge-error'
: $f->{status} eq 'Warning' ? 'badge-warning'
: 'badge-success';
print qq{ <td><span class="badge $status_badge badge-sm">$f->{status}</span></td>\n};
print qq{ <td>$date</td>\n}; print qq{ <td>$date</td>\n};
print qq{ <td>$size</td>\n}; print qq{ <td>$size</td>\n};
print qq{ <td><button type="button" class="btn btn-secondary btn-sm" onclick="location.href='$href'">View</button></td>\n}; print qq{ <td><button type="button" class="btn btn-secondary btn-sm" onclick="location.href='$href'">View</button></td>\n};
@@ -315,6 +321,23 @@ sub _valid_log_filename {
return 0; return 0;
} }
sub _detect_log_status {
my ($path) = @_;
return 'Success' unless -f $path;
my $has_warn = 0;
if (open my $fh, '<', $path) {
while (my $line = <$fh>) {
if ($line =~ /\[ERROR\]/) {
close $fh;
return 'Error';
}
$has_warn = 1 if !$has_warn && $line =~ /\[WARN\]/;
}
close $fh;
}
return $has_warn ? 'Warning' : 'Success';
}
sub _uri_escape { sub _uri_escape {
my $str = shift // ''; my $str = shift // '';
$str =~ s/([^A-Za-z0-9\-._~])/sprintf("%%%02X", ord($1))/ge; $str =~ s/([^A-Za-z0-9\-._~])/sprintf("%%%02X", ord($1))/ge;