Add overview page

This commit is contained in:
Martijn Scheepers
2021-01-07 11:59:25 +01:00
parent 773b38cfb7
commit 43aefd44ec
14 changed files with 1551 additions and 115 deletions

View File

@@ -25,8 +25,114 @@ namespace UCS_Status_Monitor.Controllers
[HttpGet]
public IActionResult Settings()
{
//IEnumerable<Models.UCSSystem> systems = dbContext.UCSSystems.Include(d => d.Devices).OrderBy(o => o.ComputerName);
return View();
}
[HttpGet]
public IActionResult Overview(string sortOrder)
{
IEnumerable<Models.UCSSystem> systems = dbContext.UCSSystems.Include(d => d.Devices).OrderBy(o => o.ComputerName);
if (sortOrder != null)
{
switch (sortOrder)
{
case "system_asc":
systems = systems.OrderBy(s => s.ComputerName);
break;
case "system_desc":
systems = systems.OrderByDescending(s => s.ComputerName);
break;
case "configfile_asc":
systems = systems.OrderBy(s => s.ConfigFileName);
break;
case "configfile_desc":
systems = systems.OrderByDescending(s => s.ConfigFileName);
break;
case "uptime_asc":
systems = systems.OrderBy(s => s.Uptime);
break;
case "uptime_desc":
systems = systems.OrderByDescending(s => s.Uptime);
break;
case "systemuptime_asc":
systems = systems.OrderBy(s => s.SystemUptime);
break;
case "systemuptime_desc":
systems = systems.OrderByDescending(s => s.SystemUptime);
break;
case "ucsversion_asc":
systems = systems.OrderBy(s => s.UCSVersion);
break;
case "ucsversion_desc":
systems = systems.OrderByDescending(s => s.UCSVersion);
break;
case "osversion_asc":
systems = systems.OrderBy(s => s.OSVersion);
break;
case "osversion_desc":
systems = systems.OrderByDescending(s => s.OSVersion);
break;
case "dotnetversion_asc":
systems = systems.OrderBy(s => s.DotNetVersion);
break;
case "dotnetversion_desc":
systems = systems.OrderByDescending(s => s.DotNetVersion);
break;
case "axisversion_asc":
systems = systems.OrderBy(s => s.AxisVersion);
break;
case "axisversion_desc":
systems = systems.OrderByDescending(s => s.AxisVersion);
break;
case "boschversion_asc":
systems = systems.OrderBy(s => s.BoschVersion);
break;
case "boschversion_desc":
systems = systems.OrderByDescending(s => s.BoschVersion);
break;
case "vlcversion_asc":
systems = systems.OrderBy(s => s.VLCVersion);
break;
case "vlcversion_desc":
systems = systems.OrderByDescending(s => s.VLCVersion);
break;
default:
systems = systems.OrderBy(s => s.UCSSystemId);
break;
}
}
return View(systems);
}
[HttpGet]
public IActionResult Delete(int? id)
{
if (id == null)
{
return BadRequest("No id to delete");
}
var system = dbContext.UCSSystems.Where(i => i.UCSSystemId == id).Include(d => d.Devices).SingleOrDefault();
if (system == null)
{
return BadRequest("Not found in the database");
}
dbContext.UCSDevices.RemoveRange(system.Devices);
dbContext.UCSSystems.Remove(system);
dbContext.SaveChanges();
return RedirectToAction("Overview", "Home");
}
}
}

View File

@@ -62,6 +62,7 @@ namespace UCS_Status_Monitor.Controllers
StartTime = telemetry.StartTime != null ? DateTime.Parse(telemetry.StartTime) : DateTime.MinValue,
LastMessageClient = telemetry.Date != null ? DateTime.Parse(telemetry.StartTime) : DateTime.MinValue,
Uptime = telemetry.Uptime ?? "??",
SystemUptime = telemetry.SystemUptime ?? "??",
OSVersion = telemetry.OSVersion ?? "??",
DotNetVersion = telemetry.DotNetVersion ?? "??"
};
@@ -91,6 +92,7 @@ namespace UCS_Status_Monitor.Controllers
system.LastMessageClient = telemetry.Date != null ? DateTime.Parse(telemetry.StartTime) : DateTime.MinValue;
system.ConfigFileName = telemetry.ConfigFileName ?? "??";
system.Uptime = telemetry.Uptime ?? "??";
system.SystemUptime = telemetry.SystemUptime ?? "??";
system.OSVersion = telemetry.OSVersion ?? "??";
system.DotNetVersion = telemetry.DotNetVersion ?? "??";
if (telemetry.SoftwareVersion == null)

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;
@@ -7,20 +8,47 @@ using System.Threading.Tasks;
namespace UCS_Status_Monitor.Models
{
public class UCSSystem
{
{
public int UCSSystemId { get; set; }
public Boolean ConnectionState { get; set; }
[Display(Name = "System")]
public string ComputerName { get; set; }
[Display(Name = "UCS start date")]
public DateTime StartTime { get; set; }
[Display(Name = "Last status date")]
public DateTime LastMessageTime { get; set; }
[Display(Name = "OS Version")]
public DateTime LastMessageClient { get; set; }
[Display(Name = "UCS uptime")]
public string Uptime { get; set; }
[Display(Name = "System uptime")]
public string SystemUptime { get; set; }
[Display(Name = "Configfile")]
public string ConfigFileName { get; set; }
[Display(Name = "UCS Version")]
public string UCSVersion { get; set; }
[Display(Name = "Axis Version")]
public string AxisVersion { get; set; }
[Display(Name = "Bosch Version")]
public string BoschVersion { get; set; }
[Display(Name = "VLC Version")]
public string VLCVersion { get; set; }
[Display(Name = "OS Version")]
public string OSVersion { get; set; }
[Display(Name = ".Net Version")]
public string DotNetVersion { get; set; }
public virtual List<UCSDevice> Devices { get; set; }

View File

@@ -10,6 +10,7 @@ namespace UCS_Status_Monitor.Models
public String Date { get; set; }
public String StartTime { get; set; }
public String Uptime { get; set; }
public String SystemUptime { get; set; }
public String ComputerName { get; set; }
public String ConfigFileName { get; set; }
public UCSVersion SoftwareVersion { get; set; }

View File

@@ -1,4 +1,5 @@
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
@@ -13,24 +14,14 @@ namespace UCS_Status_Monitor
public class MonitorWorker : BackgroundService
{
private readonly ILogger<MonitorWorker> _logger;
private readonly IConfiguration _configuration;
public MonitorWorker(ILogger<MonitorWorker> logger)
public MonitorWorker(ILogger<MonitorWorker> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
//public override async Task StartAsync(CancellationToken stoppingToken)
//{
// Debug.WriteLine("StartAsync");
// using var dbContext = new MonitorDbContext();
// dbContext.Database.EnsureCreated();
//}
//public override async Task StopAsync(CancellationToken stoppingToken)
//{
// Debug.WriteLine("StopAsync");
//}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
using var dbContext = new MonitorDbContext();
@@ -40,6 +31,7 @@ namespace UCS_Status_Monitor
{
//_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
Debug.WriteLine($"Worker running at: {DateTimeOffset.Now}");
//Debug.WriteLine($"Time out (min): {_configuration["TimeOutMinutes"]}");
foreach (var system in dbContext.UCSSystems)
{
@@ -48,7 +40,7 @@ namespace UCS_Status_Monitor
continue;
}
var minutes = (DateTime.Now - system.LastMessageTime).Minutes;
if (minutes > 35)
if (minutes > _configuration.GetValue<int>("TimeOutMinutes", 35))
{
system.ConnectionState = false;
dbContext.Update(system);
@@ -56,7 +48,7 @@ namespace UCS_Status_Monitor
}
dbContext.SaveChanges();
await Task.Delay(60000, stoppingToken);
await Task.Delay(10000, stoppingToken);
}
}

View File

@@ -1,30 +1,14 @@
@model IEnumerable<UCS_Status_Monitor.Models.UCSSystem>
<!DOCTYPE html>
<html lang="en">
<head>
<title>UCS Status Monitor</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
@*<link rel="stylesheet" href="~/css/bootstrap.min.css">*@
<link rel="stylesheet" href="~/css/darkly/bootstrap.min.css">
@*<link rel="stylesheet" href="~/css/Custom.css">*@
<script src="~/js/jquery.min.js"></script>
<script src="~/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1>UCS Status Monitor</h1>
@Html.ActionLink("Settings", "Settings", "Home")
</div>
@{
Layout = "_Layout";
}
@*<div class="container">*@
<div class="container-fluid">
<div class="row">
@foreach (var system in Model)
{
<div class="col">
<div class="card @(system.ConnectionState == true ? "bg-success" : "bg-danger")" style="width: 18rem;">
<div class="col mb-4">
<div class="card @(system.ConnectionState == true ? "bg-success" : "bg-danger") rounded" style="width: 18rem;">
<div class="card-body">
<h5 class="card-title">@system.ComputerName</h5>
<p class="card-text">@system.UCSVersion</p>
@@ -37,53 +21,6 @@
</div>
</div>
</div>
<!--<div class="col">
<div class="alert alert-danger" role="alert">
@system.ComputerName
</div>
</div>
<div class="col">
<div class="alert alert-danger" role="alert">
@system.ComputerName
</div>
</div>
<div class="col">
<div class="alert alert-danger" role="alert">
@system.ComputerName
</div>
</div>
<div class="col">
<div class="alert alert-danger" role="alert">
@system.ComputerName
</div>
</div>-->
@*<div class="w-100"></div>*@
<!--<div class="col">
<div class="alert alert-danger" role="alert">
@system.ComputerName
</div>
</div>
<div class="col">
<div class="alert alert-danger" role="alert">
@system.ComputerName
</div>
</div>
<div class="col">
<div class="alert alert-danger" role="alert">
@system.ComputerName
</div>
</div>
<div class="col">
<div class="alert alert-danger" role="alert">
@system.ComputerName
</div>
</div>
<div class="col">
<div class="alert alert-danger" role="alert">
@system.ComputerName
</div>
</div>-->
<!-- Device Modal -->
<div class="modal fade" id="@("DeviceModal" + system.UCSSystemId)" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
@@ -146,6 +83,10 @@
<td>Up Time</td>
<td>@system.Uptime</td>
</tr>
<tr>
<td>System Up Time</td>
<td>@system.SystemUptime</td>
</tr>
<tr>
<td>Last Message Time</td>
<td>@system.LastMessageTime</td>
@@ -188,9 +129,5 @@
</div>
</div>
}
</div>
@*</div>*@
</body>
</html>
</div>

View File

@@ -0,0 +1,127 @@
@model IEnumerable<UCS_Status_Monitor.Models.UCSSystem>
@{
Layout = "_Layout";
}
<table class="table table-hover">
<thead>
<tr>
<th></th>
<th>
@Html.DisplayNameFor(model => model.ComputerName)
<a href="@Url.Action(null,"Home", new { sortOrder = "system_desc" })">
<i class="bi-caret-up"></i>
</a>
<a href="@Url.Action(null,"Home", new { sortOrder = "system_asc" })">
<i class="bi-caret-down"></i>
</a>
</th>
<th>
@Html.DisplayNameFor(model => model.ConfigFileName)
<a href="@Url.Action(null,"Home", new { sortOrder = "configfile_desc" })">
<i class="bi-caret-up"></i>
</a>
<a href="@Url.Action(null,"Home", new { sortOrder = "configfile_asc" })">
<i class="bi-caret-down"></i>
</a>
</th>
<th>
@Html.DisplayNameFor(model => model.Uptime)
<a href="@Url.Action(null,"Home", new { sortOrder = "uptime_desc" })">
<i class="bi-caret-up"></i>
</a>
<a href="@Url.Action(null,"Home", new { sortOrder = "uptime_asc" })">
<i class="bi-caret-down"></i>
</a>
</th>
<th>
@Html.DisplayNameFor(model => model.SystemUptime)
<a href="@Url.Action(null,"Home", new { sortOrder = "systemuptime_desc" })">
<i class="bi-caret-up"></i>
</a>
<a href="@Url.Action(null,"Home", new { sortOrder = "systemuptime_asc" })">
<i class="bi-caret-down"></i>
</a>
</th>
<th>
@Html.DisplayNameFor(model => model.UCSVersion)
<a href="@Url.Action(null,"Home", new { sortOrder = "ucsversion_desc" })">
<i class="bi-caret-up"></i>
</a>
<a href="@Url.Action(null,"Home", new { sortOrder = "ucsversion_asc" })">
<i class="bi-caret-down"></i>
</a>
</th>
<th>
@Html.DisplayNameFor(model => model.OSVersion)
<a href="@Url.Action(null,"Home", new { sortOrder = "osversion_desc" })">
<i class="bi-caret-up"></i>
</a>
<a href="@Url.Action(null,"Home", new { sortOrder = "osversion_asc" })">
<i class="bi-caret-down"></i>
</a>
</th>
<th>
@Html.DisplayNameFor(model => model.DotNetVersion)
<a href="@Url.Action(null,"Home", new { sortOrder = "dotnetversion_desc" })">
<i class="bi-caret-up"></i>
</a>
<a href="@Url.Action(null,"Home", new { sortOrder = "dotnetversion_asc" })">
<i class="bi-caret-down"></i>
</a>
</th>
<th>
@Html.DisplayNameFor(model => model.AxisVersion)
<a href="@Url.Action(null,"Home", new { sortOrder = "axisversion_desc" })">
<i class="bi-caret-up"></i>
</a>
<a href="@Url.Action(null,"Home", new { sortOrder = "axisversion_asc" })">
<i class="bi-caret-down"></i>
</a>
</th>
<th>
@Html.DisplayNameFor(model => model.BoschVersion)
<a href="@Url.Action(null,"Home", new { sortOrder = "boschversion_desc" })">
<i class="bi-caret-up"></i>
</a>
<a href="@Url.Action(null,"Home", new { sortOrder = "boschversion_asc" })">
<i class="bi-caret-down"></i>
</a>
</th>
<th>
@Html.DisplayNameFor(model => model.VLCVersion)
<a href="@Url.Action(null,"Home", new { sortOrder = "vlcversion_desc" })">
<i class="bi-caret-up"></i>
</a>
<a href="@Url.Action(null,"Home", new { sortOrder = "vlcversion_asc" })">
<i class="bi-caret-down"></i>
</a>
</th>
</tr>
</thead>
<tbody>
@foreach (var system in Model)
{
<tr class="@(system.ConnectionState == true ? "table-success" : "table-danger") ">
<td>
<a href="@Url.Action("Delete","Home", new { id = system.UCSSystemId })">
<i class="bi-trash" style="color: black;"></i>
</a>
</td>
<td>@system.ComputerName</td>
<td>@system.ConfigFileName</td>
<td>@system.Uptime</td>
<td>@system.SystemUptime</td>
<td>@system.UCSVersion</td>
<td>@system.OSVersion</td>
<td>@system.DotNetVersion</td>
<td>@system.AxisVersion</td>
<td>@system.BoschVersion</td>
<td>@system.VLCVersion</td>
</tr>
}
</tbody>
</table>
@*</body>
</html>*@

View File

@@ -1,22 +1,9 @@
@*@model IEnumerable<UCS_Status_Monitor.Models.UCSSystem>*@
<!DOCTYPE html>
<html lang="en">
<head>
<title>UCS Status Monitor</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
@*<link rel="stylesheet" href="~/css/bootstrap.min.css">*@
<link rel="stylesheet" href="~/css/darkly/bootstrap.min.css">
@*<link rel="stylesheet" href="~/css/Custom.css">*@
<script src="~/js/jquery.min.js"></script>
<script src="~/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1>UCS Status Monitor settings</h1>
</div>
@{
Layout = "_Layout";
}
<div class="container-fluid">
</body>
</html>
</div>

View File

@@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>UCS Status Monitor</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="~/css/darkly/bootstrap.min.css">
<link rel="stylesheet" href="~/css/bootstrap-icons.css">
<script src="~/js/jquery.min.js"></script>
<script src="~/js/bootstrap.min.js"></script>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark mb-4">
<div class="container-fluid">
<a class="navbar-brand" href="#">UCS Status Monitor</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
@Html.ActionLink("Home", "Index", "Home", null, new { @class = "nav-link" })
</li>
<li class="nav-item">
@Html.ActionLink("Overview", "Overview", "Home", null, new { @class = "nav-link" })
</li>
<li class="nav-item">
@Html.ActionLink("Settings", "Settings", "Home", null, new { @class = "nav-link" })
</li>
</ul>
</div>
</div>
</nav>
@RenderBody()
</body>
</html>

View File

@@ -6,5 +6,6 @@
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
"AllowedHosts": "*",
"TimeOutMinutes": 35
}

View File

@@ -1,3 +0,0 @@
html body {
background-color: rgba(0,0,0,1.00);
}

File diff suppressed because it is too large Load Diff