Skip to content

Commit

Permalink
new status rest api endpoint containing all system status data.
Browse files Browse the repository at this point in the history
added cpu usage%
changed server mode from ServerPrerendered to Server
  • Loading branch information
mhwlng committed Dec 24, 2022
1 parent 196d19c commit 6c900cc
Show file tree
Hide file tree
Showing 12 changed files with 166 additions and 45 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ That means that the remote web server does not allow rendering inside an iframe.

You won't have this problem, if you define just one Kiosk URL.

There is also a rest api endpoint (http://x.x.x.x:5000/api/status) that returns a JSON object, containing system status data.

![touch screen](https://i.imgur.com/Wzp5kqm.png)

![touch screen](https://i.imgur.com/cXrHx23.png)
Expand Down
35 changes: 35 additions & 0 deletions kiosk-server/Api/StatusController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using kiosk_server.Metrics;
using kiosk_server.Model;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Xml.Linq;

namespace kiosk_server.Api
{
[Route("api/[controller]")]
[ApiController]
[AllowAnonymous]
public class StatusController : ControllerBase
{
private class StatusData
{
public DiskMetrics Disk { get; set; } = default!;
public TemperatureMetrics Temperature { get; set; } = default!;
public MemoryMetrics Memory { get; set; } = default!;
public CpuMetrics Cpu { get; set; } = default!;
}

[HttpGet]
public IActionResult Get()
{
var statusData = new StatusData
{
Memory = new MemoryMetricsClient().GetMetrics(),
Temperature = new TemperatureMetricsClient().GetMetrics(),
Disk = new DiskMetricsClient().GetMetrics(),
Cpu = new CpuMetricsClient().GetMetrics()
};
return Ok(statusData);
}
}
}
43 changes: 42 additions & 1 deletion kiosk-server/Metrics/CPUMetrics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

namespace kiosk_server.Metrics
{

public class CpuMetrics
{
public string OsDescription { get; set; } = default!;
Expand All @@ -13,6 +14,9 @@ public class CpuMetrics
public string CpuModel { get; set; } = default!;
public string CpuModelName { get; set; } = default!;
public string CpuHardware { get; set; } = default!;

public double CpuUsage { get; set; } = default!;

}

public class CpuMetricsClient
Expand Down Expand Up @@ -90,6 +94,42 @@ private string GetLinuxOsName()
return prettyName;
}

// https://github.com/MhyrAskri/Linux-CPU-Usage/blob/master/CpuUsage.cs
private double GetLinuxCpuUsage()
{
var output = "";

var info = new ProcessStartInfo("top -b -n 1")
{
FileName = "/bin/bash",
Arguments = "-c \"top -b -n 1\"",
RedirectStandardOutput = true
};

using (var process = Process.Start(info))
{
output = process?.StandardOutput.ReadToEnd();
}

var lines = output?.Split("\n");
if (lines != null)
{
var cpuLine2 = lines[2].Split(",", StringSplitOptions.RemoveEmptyEntries);
var firstPart = cpuLine2[0].Split(":", StringSplitOptions.RemoveEmptyEntries);
var secondPart = cpuLine2[1].Split("s", StringSplitOptions.RemoveEmptyEntries);
var thirdPart = cpuLine2[2].Split("n", StringSplitOptions.RemoveEmptyEntries);

var cpuUsage = double.Parse(firstPart[1].Split("u", StringSplitOptions.RemoveEmptyEntries)[0]) +
double.Parse(secondPart[0]) +
double.Parse(thirdPart[0]);

return cpuUsage;

}

return 0;
}

private CpuMetrics GetLinuxMetrics()
{
var metrics = new CpuMetrics();
Expand All @@ -109,7 +149,8 @@ private CpuMetrics GetLinuxMetrics()

HandleRegExMatches(ref cpuInfoLines, ref cpuInfoMatches);


metrics.CpuUsage = GetLinuxCpuUsage();

return metrics;
}
}
Expand Down
8 changes: 4 additions & 4 deletions kiosk-server/Model/SetupModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ namespace kiosk_server.Model
{
public class SetupModel
{
public DiskMetrics DiskMetrics { get; set; } = default!;
public TemperatureMetrics TemperatureMetrics { get; set; } = default!;
public MemoryMetrics MemoryMetrics { get; set; } = default!;
public CpuMetrics CpuMetrics { get; set; } = default!;
public DiskMetrics Disk { get; set; } = default!;
public TemperatureMetrics Temperature { get; set; } = default!;
public MemoryMetrics Memory { get; set; } = default!;
public CpuMetrics Cpu { get; set; } = default!;

}
}
Expand Down
58 changes: 41 additions & 17 deletions kiosk-server/Pages/Setup.razor
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,13 @@
<tbody>
<tr>
<td>
@SetupModel.MemoryMetrics.TotalMemory.ToString("N0") MB
@SetupModel.Memory.TotalMemory.ToString("N0") MB
</td>
<td>
@SetupModel.MemoryMetrics.UsedMemory.ToString("N0") MB
@SetupModel.Memory.UsedMemory.ToString("N0") MB
</td>
<td>
@SetupModel.MemoryMetrics.FreeMemory.ToString("N0") MB
@SetupModel.Memory.FreeMemory.ToString("N0") MB
</td>
</tr>
</tbody>
Expand All @@ -95,49 +95,73 @@
<tbody>
<tr>
<td>
@SetupModel.DiskMetrics.TotalDiskSpace.ToString("N1") GB
@SetupModel.Disk.TotalDiskSpace.ToString("N1") GB
</td>
<td>
@((SetupModel.DiskMetrics.TotalDiskSpace -SetupModel.DiskMetrics.AvailableDiskSpace).ToString("N1")) GB
@((SetupModel.Disk.TotalDiskSpace -SetupModel.Disk.AvailableDiskSpace).ToString("N1")) GB
</td>
<td>
@SetupModel.DiskMetrics.AvailableDiskSpace.ToString("N1") GB
@SetupModel.Disk.AvailableDiskSpace.ToString("N1") GB
</td>
</tr>
</tbody>
</MudSimpleTable>
</MudCardContent>
</MudCard>

@if (SetupModel.TemperatureMetrics.CpuTemperature > 0)
@if (SetupModel.Temperature.CpuTemperature > 0)
{
<MudCard Elevation="4">
<MudCardHeader Class="mt-4">
<MudCardHeader Class="pb-0 mt-4">
<CardHeaderContent >
<MudText Typo="Typo.h6">CPU Temperature : @SetupModel.TemperatureMetrics.CpuTemperature.ToString("N1") &deg;C @SetupModel.TemperatureMetrics.ThrottledState</MudText>
<MudText Typo="Typo.h6">CPU</MudText>
</CardHeaderContent>

</MudCardHeader>
<MudCardContent Class ="pa-0">
<MudSimpleTable Elevation="0" Class="pa-0">
<thead>
<tr>
<th style ="width:30%">Usage</th>
<th style ="width:30%">Temperature</th>
<th>Throttled</th>
</tr>
</thead>
<tbody>
<tr>
<td>
@SetupModel.Cpu.CpuUsage.ToString("N1") %
</td>
<td>
@SetupModel.Temperature.CpuTemperature.ToString("N1") &deg;C
</td>
<td>
@SetupModel.Temperature.ThrottledState
</td>
</tr>
</tbody>
</MudSimpleTable>
</MudCardContent>
</MudCard>
}

<MudCard Elevation="4">
<MudCardHeader Class="mt-4">
<CardHeaderContent >
<MudText Typo="Typo.h6">@SetupModel.CpuMetrics.OsDescription</MudText>
@if (!string.IsNullOrEmpty(SetupModel.CpuMetrics.OsName))
<MudText Typo="Typo.h6">@SetupModel.Cpu.OsDescription</MudText>
@if (!string.IsNullOrEmpty(SetupModel.Cpu.OsName))
{
<br/>
<MudText Typo="Typo.h6">@SetupModel.CpuMetrics.OsName</MudText>
<MudText Typo="Typo.h6">@SetupModel.Cpu.OsName</MudText>
}
@if (!string.IsNullOrEmpty(SetupModel.CpuMetrics.CpuModel))
@if (!string.IsNullOrEmpty(SetupModel.Cpu.CpuModel))
{
<br />
<MudText Typo="Typo.h6">@SetupModel.CpuMetrics.CpuHardware</MudText>
<MudText Typo="Typo.h6">@SetupModel.Cpu.CpuHardware</MudText>
<br />
<MudText Typo="Typo.h6">@SetupModel.CpuMetrics.CpuModel</MudText>
<MudText Typo="Typo.h6">@SetupModel.Cpu.CpuModel</MudText>
<br />
<MudText Typo="Typo.h6">@SetupModel.CpuMetrics.CpuModelName</MudText>
<MudText Typo="Typo.h6">@SetupModel.Cpu.CpuModelName</MudText>
}
</CardHeaderContent>

Expand Down
10 changes: 6 additions & 4 deletions kiosk-server/Pages/Setup.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,17 +55,19 @@ protected override async Task OnInitializedAsync()
{
Layout.Title = "Kiosk Server Setup";

// called twice in case server mode = serverprerendered

var memoryMetricsClient = new MemoryMetricsClient();
SetupModel.MemoryMetrics = memoryMetricsClient.GetMetrics();
SetupModel.Memory = memoryMetricsClient.GetMetrics();

var temperatureMetricsClient = new TemperatureMetricsClient();
SetupModel.TemperatureMetrics = temperatureMetricsClient.GetMetrics();
SetupModel.Temperature = temperatureMetricsClient.GetMetrics();

var diskMetricsClient = new DiskMetricsClient();
SetupModel.DiskMetrics = diskMetricsClient.GetMetrics();
SetupModel.Disk = diskMetricsClient.GetMetrics();

var cpuMetricsClient = new CpuMetricsClient();
SetupModel.CpuMetrics = cpuMetricsClient.GetMetrics();
SetupModel.Cpu = cpuMetricsClient.GetMetrics();

RedirectUrlList = Program.ConfigurationRoot.GetSection("RedirectUrl").Get<List<RedirectItem>>() ?? new List<RedirectItem>();

Expand Down
2 changes: 1 addition & 1 deletion kiosk-server/Pages/_Host.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
Layout = "_Layout";
}

<component type="typeof(App)" render-mode="ServerPrerendered" />
<component type="typeof(App)" render-mode="Server" />
2 changes: 1 addition & 1 deletion kiosk-server/Pages/_Layout.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@

@*<script src="appscript://dynamic.js"></script>*@

<component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
<component type="typeof(HeadOutlet)" render-mode="Server" />
</head>
<body>
@RenderBody()
Expand Down
40 changes: 30 additions & 10 deletions kiosk-server/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public static void Main(string[] args)

builder.Host.UseSystemd();

builder.WebHost.UseUrls();

builder.WebHost.ConfigureKestrel(serverOptions =>
{
var port = ConfigurationRoot.GetValue<int>("Port");
Expand All @@ -51,14 +53,17 @@ public static void Main(string[] args)

});

//builder.WebHost.UseStaticWebAssets(); // needs absolute path ??????????
//builder.WebHost.UseStaticWebAssets(); // needs absolute path ??????????


// Add services to the container.
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddMudServices();

// Add services to manage API controller
builder.Services.AddControllers();

builder.Services.AddCors();

//builder.Services.AddSingleton<WeatherForecastService>();
Expand All @@ -73,7 +78,10 @@ public static void Main(string[] args)

var app = builder.Build();

app.UseResponseCompression();
if (!app.Environment.IsDevelopment()) // response compression currently conflicts with dotnet watch browser reload
{
app.UseResponseCompression();
}

if (app.Environment.IsDevelopment())
{
Expand Down Expand Up @@ -105,16 +113,28 @@ public static void Main(string[] args)
.SetIsOriginAllowed(origin => true) // allow any origin
.AllowCredentials()); // allow credentials

app.MapControllers();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

/*
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
//endpoints.MapHub<MyHub>("/myhub");
endpoints.MapFallbackToPage("/_Host");
});*/
/*
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
//endpoints.MapHub<MyHub>("/myhub");
endpoints.MapFallbackToPage("/_Host");
});*/
/*
app.MapGet("/aaa/bbb", () =>
{
string[] data = new string[] {
"Hello World!",
"Hello Galaxy!",
"Hello Universe!"
};
return Results.Ok(data);
});*/

app.Run();
}
Expand Down
1 change: 1 addition & 0 deletions kiosk-server/Properties/launchSettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"externalUrlConfiguration": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
Expand Down
4 changes: 0 additions & 4 deletions kiosk-server/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,6 @@
{
"Name": "Home",
"Url": "https://www.msn.com"
},
{
"Name": "DEV5",
"Url": "http://192.168.2.34:8123/lovelace/charts?kiosk"
}
]
}
6 changes: 3 additions & 3 deletions kiosk-server/kiosk-server.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@
<PreBuildEvent>
</PreBuildEvent>
<ApplicationIcon>wwwroot\favicon.ico</ApplicationIcon>
<Version>0.0.0.7</Version>
<Version>0.0.0.8</Version>
<Copyright>Copyright © 2022</Copyright>
<Company />
<Authors />
<AssemblyVersion>0.0.0.7</AssemblyVersion>
<FileVersion>0.0.0.7</FileVersion>
<AssemblyVersion>0.0.0.8</AssemblyVersion>
<FileVersion>0.0.0.8</FileVersion>
</PropertyGroup>

<Target Name="PiCopy" AfterTargets="AfterPublish">
Expand Down

0 comments on commit 6c900cc

Please sign in to comment.