Skip to content

Commit 6c900cc

Browse files
committed
new status rest api endpoint containing all system status data.
added cpu usage% changed server mode from ServerPrerendered to Server
1 parent 196d19c commit 6c900cc

12 files changed

+166
-45
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ That means that the remote web server does not allow rendering inside an iframe.
2626

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

29+
There is also a rest api endpoint (http://x.x.x.x:5000/api/status) that returns a JSON object, containing system status data.
30+
2931
![touch screen](https://i.imgur.com/Wzp5kqm.png)
3032

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

kiosk-server/Api/StatusController.cs

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using kiosk_server.Metrics;
2+
using kiosk_server.Model;
3+
using Microsoft.AspNetCore.Authorization;
4+
using Microsoft.AspNetCore.Mvc;
5+
using System.Xml.Linq;
6+
7+
namespace kiosk_server.Api
8+
{
9+
[Route("api/[controller]")]
10+
[ApiController]
11+
[AllowAnonymous]
12+
public class StatusController : ControllerBase
13+
{
14+
private class StatusData
15+
{
16+
public DiskMetrics Disk { get; set; } = default!;
17+
public TemperatureMetrics Temperature { get; set; } = default!;
18+
public MemoryMetrics Memory { get; set; } = default!;
19+
public CpuMetrics Cpu { get; set; } = default!;
20+
}
21+
22+
[HttpGet]
23+
public IActionResult Get()
24+
{
25+
var statusData = new StatusData
26+
{
27+
Memory = new MemoryMetricsClient().GetMetrics(),
28+
Temperature = new TemperatureMetricsClient().GetMetrics(),
29+
Disk = new DiskMetricsClient().GetMetrics(),
30+
Cpu = new CpuMetricsClient().GetMetrics()
31+
};
32+
return Ok(statusData);
33+
}
34+
}
35+
}

kiosk-server/Metrics/CPUMetrics.cs

+42-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
namespace kiosk_server.Metrics
77
{
8+
89
public class CpuMetrics
910
{
1011
public string OsDescription { get; set; } = default!;
@@ -13,6 +14,9 @@ public class CpuMetrics
1314
public string CpuModel { get; set; } = default!;
1415
public string CpuModelName { get; set; } = default!;
1516
public string CpuHardware { get; set; } = default!;
17+
18+
public double CpuUsage { get; set; } = default!;
19+
1620
}
1721

1822
public class CpuMetricsClient
@@ -90,6 +94,42 @@ private string GetLinuxOsName()
9094
return prettyName;
9195
}
9296

97+
// https://github.com/MhyrAskri/Linux-CPU-Usage/blob/master/CpuUsage.cs
98+
private double GetLinuxCpuUsage()
99+
{
100+
var output = "";
101+
102+
var info = new ProcessStartInfo("top -b -n 1")
103+
{
104+
FileName = "/bin/bash",
105+
Arguments = "-c \"top -b -n 1\"",
106+
RedirectStandardOutput = true
107+
};
108+
109+
using (var process = Process.Start(info))
110+
{
111+
output = process?.StandardOutput.ReadToEnd();
112+
}
113+
114+
var lines = output?.Split("\n");
115+
if (lines != null)
116+
{
117+
var cpuLine2 = lines[2].Split(",", StringSplitOptions.RemoveEmptyEntries);
118+
var firstPart = cpuLine2[0].Split(":", StringSplitOptions.RemoveEmptyEntries);
119+
var secondPart = cpuLine2[1].Split("s", StringSplitOptions.RemoveEmptyEntries);
120+
var thirdPart = cpuLine2[2].Split("n", StringSplitOptions.RemoveEmptyEntries);
121+
122+
var cpuUsage = double.Parse(firstPart[1].Split("u", StringSplitOptions.RemoveEmptyEntries)[0]) +
123+
double.Parse(secondPart[0]) +
124+
double.Parse(thirdPart[0]);
125+
126+
return cpuUsage;
127+
128+
}
129+
130+
return 0;
131+
}
132+
93133
private CpuMetrics GetLinuxMetrics()
94134
{
95135
var metrics = new CpuMetrics();
@@ -109,7 +149,8 @@ private CpuMetrics GetLinuxMetrics()
109149

110150
HandleRegExMatches(ref cpuInfoLines, ref cpuInfoMatches);
111151

112-
152+
metrics.CpuUsage = GetLinuxCpuUsage();
153+
113154
return metrics;
114155
}
115156
}

kiosk-server/Model/SetupModel.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ namespace kiosk_server.Model
55
{
66
public class SetupModel
77
{
8-
public DiskMetrics DiskMetrics { get; set; } = default!;
9-
public TemperatureMetrics TemperatureMetrics { get; set; } = default!;
10-
public MemoryMetrics MemoryMetrics { get; set; } = default!;
11-
public CpuMetrics CpuMetrics { get; set; } = default!;
8+
public DiskMetrics Disk { get; set; } = default!;
9+
public TemperatureMetrics Temperature { get; set; } = default!;
10+
public MemoryMetrics Memory { get; set; } = default!;
11+
public CpuMetrics Cpu { get; set; } = default!;
1212

1313
}
1414
}

kiosk-server/Pages/Setup.razor

+41-17
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,13 @@
6262
<tbody>
6363
<tr>
6464
<td>
65-
@SetupModel.MemoryMetrics.TotalMemory.ToString("N0") MB
65+
@SetupModel.Memory.TotalMemory.ToString("N0") MB
6666
</td>
6767
<td>
68-
@SetupModel.MemoryMetrics.UsedMemory.ToString("N0") MB
68+
@SetupModel.Memory.UsedMemory.ToString("N0") MB
6969
</td>
7070
<td>
71-
@SetupModel.MemoryMetrics.FreeMemory.ToString("N0") MB
71+
@SetupModel.Memory.FreeMemory.ToString("N0") MB
7272
</td>
7373
</tr>
7474
</tbody>
@@ -95,49 +95,73 @@
9595
<tbody>
9696
<tr>
9797
<td>
98-
@SetupModel.DiskMetrics.TotalDiskSpace.ToString("N1") GB
98+
@SetupModel.Disk.TotalDiskSpace.ToString("N1") GB
9999
</td>
100100
<td>
101-
@((SetupModel.DiskMetrics.TotalDiskSpace -SetupModel.DiskMetrics.AvailableDiskSpace).ToString("N1")) GB
101+
@((SetupModel.Disk.TotalDiskSpace -SetupModel.Disk.AvailableDiskSpace).ToString("N1")) GB
102102
</td>
103103
<td>
104-
@SetupModel.DiskMetrics.AvailableDiskSpace.ToString("N1") GB
104+
@SetupModel.Disk.AvailableDiskSpace.ToString("N1") GB
105105
</td>
106106
</tr>
107107
</tbody>
108108
</MudSimpleTable>
109109
</MudCardContent>
110110
</MudCard>
111111

112-
@if (SetupModel.TemperatureMetrics.CpuTemperature > 0)
112+
@if (SetupModel.Temperature.CpuTemperature > 0)
113113
{
114114
<MudCard Elevation="4">
115-
<MudCardHeader Class="mt-4">
115+
<MudCardHeader Class="pb-0 mt-4">
116116
<CardHeaderContent >
117-
<MudText Typo="Typo.h6">CPU Temperature : @SetupModel.TemperatureMetrics.CpuTemperature.ToString("N1") &deg;C @SetupModel.TemperatureMetrics.ThrottledState</MudText>
117+
<MudText Typo="Typo.h6">CPU</MudText>
118118
</CardHeaderContent>
119-
119+
120120
</MudCardHeader>
121+
<MudCardContent Class ="pa-0">
122+
<MudSimpleTable Elevation="0" Class="pa-0">
123+
<thead>
124+
<tr>
125+
<th style ="width:30%">Usage</th>
126+
<th style ="width:30%">Temperature</th>
127+
<th>Throttled</th>
128+
</tr>
129+
</thead>
130+
<tbody>
131+
<tr>
132+
<td>
133+
@SetupModel.Cpu.CpuUsage.ToString("N1") %
134+
</td>
135+
<td>
136+
@SetupModel.Temperature.CpuTemperature.ToString("N1") &deg;C
137+
</td>
138+
<td>
139+
@SetupModel.Temperature.ThrottledState
140+
</td>
141+
</tr>
142+
</tbody>
143+
</MudSimpleTable>
144+
</MudCardContent>
121145
</MudCard>
122146
}
123147

124148
<MudCard Elevation="4">
125149
<MudCardHeader Class="mt-4">
126150
<CardHeaderContent >
127-
<MudText Typo="Typo.h6">@SetupModel.CpuMetrics.OsDescription</MudText>
128-
@if (!string.IsNullOrEmpty(SetupModel.CpuMetrics.OsName))
151+
<MudText Typo="Typo.h6">@SetupModel.Cpu.OsDescription</MudText>
152+
@if (!string.IsNullOrEmpty(SetupModel.Cpu.OsName))
129153
{
130154
<br/>
131-
<MudText Typo="Typo.h6">@SetupModel.CpuMetrics.OsName</MudText>
155+
<MudText Typo="Typo.h6">@SetupModel.Cpu.OsName</MudText>
132156
}
133-
@if (!string.IsNullOrEmpty(SetupModel.CpuMetrics.CpuModel))
157+
@if (!string.IsNullOrEmpty(SetupModel.Cpu.CpuModel))
134158
{
135159
<br />
136-
<MudText Typo="Typo.h6">@SetupModel.CpuMetrics.CpuHardware</MudText>
160+
<MudText Typo="Typo.h6">@SetupModel.Cpu.CpuHardware</MudText>
137161
<br />
138-
<MudText Typo="Typo.h6">@SetupModel.CpuMetrics.CpuModel</MudText>
162+
<MudText Typo="Typo.h6">@SetupModel.Cpu.CpuModel</MudText>
139163
<br />
140-
<MudText Typo="Typo.h6">@SetupModel.CpuMetrics.CpuModelName</MudText>
164+
<MudText Typo="Typo.h6">@SetupModel.Cpu.CpuModelName</MudText>
141165
}
142166
</CardHeaderContent>
143167

kiosk-server/Pages/Setup.razor.cs

+6-4
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,19 @@ protected override async Task OnInitializedAsync()
5555
{
5656
Layout.Title = "Kiosk Server Setup";
5757

58+
// called twice in case server mode = serverprerendered
59+
5860
var memoryMetricsClient = new MemoryMetricsClient();
59-
SetupModel.MemoryMetrics = memoryMetricsClient.GetMetrics();
61+
SetupModel.Memory = memoryMetricsClient.GetMetrics();
6062

6163
var temperatureMetricsClient = new TemperatureMetricsClient();
62-
SetupModel.TemperatureMetrics = temperatureMetricsClient.GetMetrics();
64+
SetupModel.Temperature = temperatureMetricsClient.GetMetrics();
6365

6466
var diskMetricsClient = new DiskMetricsClient();
65-
SetupModel.DiskMetrics = diskMetricsClient.GetMetrics();
67+
SetupModel.Disk = diskMetricsClient.GetMetrics();
6668

6769
var cpuMetricsClient = new CpuMetricsClient();
68-
SetupModel.CpuMetrics = cpuMetricsClient.GetMetrics();
70+
SetupModel.Cpu = cpuMetricsClient.GetMetrics();
6971

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

kiosk-server/Pages/_Host.cshtml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
Layout = "_Layout";
66
}
77

8-
<component type="typeof(App)" render-mode="ServerPrerendered" />
8+
<component type="typeof(App)" render-mode="Server" />

kiosk-server/Pages/_Layout.cshtml

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636

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

39-
<component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
39+
<component type="typeof(HeadOutlet)" render-mode="Server" />
4040
</head>
4141
<body>
4242
@RenderBody()

kiosk-server/Program.cs

+30-10
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public static void Main(string[] args)
2727

2828
builder.Host.UseSystemd();
2929

30+
builder.WebHost.UseUrls();
31+
3032
builder.WebHost.ConfigureKestrel(serverOptions =>
3133
{
3234
var port = ConfigurationRoot.GetValue<int>("Port");
@@ -51,14 +53,17 @@ public static void Main(string[] args)
5153

5254
});
5355

54-
//builder.WebHost.UseStaticWebAssets(); // needs absolute path ??????????
56+
//builder.WebHost.UseStaticWebAssets(); // needs absolute path ??????????
5557

5658

57-
// Add services to the container.
59+
// Add services to the container.
5860
builder.Services.AddRazorPages();
5961
builder.Services.AddServerSideBlazor();
6062
builder.Services.AddMudServices();
6163

64+
// Add services to manage API controller
65+
builder.Services.AddControllers();
66+
6267
builder.Services.AddCors();
6368

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

7479
var app = builder.Build();
7580

76-
app.UseResponseCompression();
81+
if (!app.Environment.IsDevelopment()) // response compression currently conflicts with dotnet watch browser reload
82+
{
83+
app.UseResponseCompression();
84+
}
7785

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

116+
app.MapControllers();
117+
108118
app.MapBlazorHub();
109119
app.MapFallbackToPage("/_Host");
110120

111-
/*
112-
app.UseEndpoints(endpoints =>
113-
{
114-
endpoints.MapBlazorHub();
115-
//endpoints.MapHub<MyHub>("/myhub");
116-
endpoints.MapFallbackToPage("/_Host");
117-
});*/
121+
/*
122+
app.UseEndpoints(endpoints =>
123+
{
124+
endpoints.MapBlazorHub();
125+
//endpoints.MapHub<MyHub>("/myhub");
126+
endpoints.MapFallbackToPage("/_Host");
127+
});*/
128+
/*
129+
app.MapGet("/aaa/bbb", () =>
130+
{
131+
string[] data = new string[] {
132+
"Hello World!",
133+
"Hello Galaxy!",
134+
"Hello Universe!"
135+
};
136+
return Results.Ok(data);
137+
});*/
118138

119139
app.Run();
120140
}

kiosk-server/Properties/launchSettings.json

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"commandName": "Project",
1313
"dotnetRunMessages": true,
1414
"launchBrowser": true,
15+
"externalUrlConfiguration": true,
1516
"applicationUrl": "http://localhost:5000",
1617
"environmentVariables": {
1718
"ASPNETCORE_ENVIRONMENT": "Development"

kiosk-server/appsettings.json

-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@
1212
{
1313
"Name": "Home",
1414
"Url": "https://www.msn.com"
15-
},
16-
{
17-
"Name": "DEV5",
18-
"Url": "http://192.168.2.34:8123/lovelace/charts?kiosk"
1915
}
2016
]
2117
}

kiosk-server/kiosk-server.csproj

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
<PreBuildEvent>
1313
</PreBuildEvent>
1414
<ApplicationIcon>wwwroot\favicon.ico</ApplicationIcon>
15-
<Version>0.0.0.7</Version>
15+
<Version>0.0.0.8</Version>
1616
<Copyright>Copyright © 2022</Copyright>
1717
<Company />
1818
<Authors />
19-
<AssemblyVersion>0.0.0.7</AssemblyVersion>
20-
<FileVersion>0.0.0.7</FileVersion>
19+
<AssemblyVersion>0.0.0.8</AssemblyVersion>
20+
<FileVersion>0.0.0.8</FileVersion>
2121
</PropertyGroup>
2222

2323
<Target Name="PiCopy" AfterTargets="AfterPublish">

0 commit comments

Comments
 (0)