@page
@model IndexModel
@{
ViewData["Title"] = "Dashboard";
ViewData["Page"] = "dashboard";
}
0 ? "warn" : Model.Stats.UpCount > 0 ? "up" : "neutral")">
Overall
@if (Model.Stats.DownCount > 0) { DEGRADED }
else if (Model.Stats.WarnCount > 0) { WARNING }
else if (Model.Stats.UpCount > 0) { OPERATIONAL }
else { UNKNOWN }
@Model.Stats.TotalMonitors monitor(s) active
Online
@Model.Stats.UpCount
monitors up
Offline
@Model.Stats.DownCount
monitors down
Warnings
@Model.Stats.WarnCount
monitors degraded
@if (Model.ShowUptime)
{
Uptime
@Model.Stats.OverallUptime.ToString("F1")%
overall availability
}
0 ? "warn" : "neutral")">
Certificates
@Model.Stats.CertCount
@if (Model.Stats.CertExpired > 0) { @Model.Stats.CertExpired expired }
else if (Model.Stats.CertExpiringSoon > 0) { @Model.Stats.CertExpiringSoon expiring soon }
else { all valid }
@if (Model.IsAdmin)
{
Log Errors
@Model.Stats.ErrorLogs
@Model.Stats.TotalLogs total entries
Incidents
@Model.Stats.ActiveIncidents
@Model.Stats.ResolvedIncidents resolved
}
@* Active Incidents Banner *@
@if (Model.ShowIncidents && Model.ActiveIncidents.Any())
{
foreach (var inc in Model.ActiveIncidents)
{
var incClass = inc.Severity switch {
IncidentSeverity.Critical => "alert-danger",
IncidentSeverity.Major => "alert-warning",
_ => "alert-info"
};
⚠ @inc.Title
@inc.Status • @inc.Severity
@if (!string.IsNullOrEmpty(inc.Body))
{
@inc.Body
}
@if (inc.Updates.Any())
{
var latest = inc.Updates.OrderByDescending(u => u.PostedAt).First();
Latest update (@latest.PostedAt.ToString("yyyy-MM-dd HH:mm")): @latest.Message
}
}
}
@if (Model.Monitors.Any())
{
var groups = Model.Monitors.GroupBy(m => m.GroupName ?? "General");
foreach (var group in groups)
{
@foreach (var m in group)
{
var badgeClass = m.LastStatus switch {
MonitorStatus.Up => "badge-up",
MonitorStatus.Down => "badge-down",
MonitorStatus.Warning or MonitorStatus.Degraded => "badge-warn",
_ => "badge-unknown"
};
var checks = Model.RecentChecks.ContainsKey(m.Id) ? Model.RecentChecks[m.Id] : new();
@m.Name
@if (!m.IsPublic && Model.IsAdmin) { PRIVATE }
@if (!m.IsActive) { PAUSED }
@(m.Url ?? (m.Host + (m.Port.HasValue ? ":" + m.Port : "")))
@m.Type.ToString().ToUpper()
@if (Model.ShowUptime && checks.Any())
{
@foreach (var c in checks)
{
var cls = c.Status switch { MonitorStatus.Up => "up", MonitorStatus.Down => "down", MonitorStatus.Warning or MonitorStatus.Degraded => "warn", _ => "unknown" };
}
}
@if (m.LastResponseMs.HasValue) { @((int)m.LastResponseMs.Value)ms }
@m.LastStatus
}
}
}
else
{
◎
No monitors have been configured
@if (Model.IsAdmin) {
}
}
@if (Model.Certificates.Any())
{
| Domain |
Name |
Expires |
Days Left |
Status |
@foreach (var c in Model.Certificates)
{
var now = DateTime.UtcNow;
var daysLeft = c.ExpiresAt.HasValue ? (int)(c.ExpiresAt.Value - now).TotalDays : (int?)null;
var expiryClass = daysLeft == null ? "" : daysLeft <= 0 ? "cert-expiry-expired" : daysLeft <= 7 ? "cert-expiry-critical" : daysLeft <= 30 ? "cert-expiry-warn" : "cert-expiry-ok";
| @c.Domain:@c.Port |
@c.Name |
@(c.ExpiresAt?.ToString("yyyy-MM-dd") ?? "unknown") |
@(daysLeft.HasValue ? daysLeft + "d" : "-") |
@if (daysLeft == null) { Unknown }
else if (daysLeft <= 0) { EXPIRED }
else if (daysLeft <= 7) { CRITICAL }
else if (daysLeft <= 30) { EXPIRING }
else { VALID }
|
}
}