diff --git a/src/SQLInsight.Core/SyntheticChecks/SyntheticCheckDefinitions.cs b/src/SQLInsight.Core/SyntheticChecks/SyntheticCheckDefinitions.cs
index ec441f4..7b08d2d 100644
--- a/src/SQLInsight.Core/SyntheticChecks/SyntheticCheckDefinitions.cs
+++ b/src/SQLInsight.Core/SyntheticChecks/SyntheticCheckDefinitions.cs
@@ -162,6 +162,9 @@ public static class SyntheticCheckLimits
public static class SyntheticCheckValidation
{
+ /// The longest HTTP address a check may have.
+ public const int MaxUrlLength = 2000;
+
/// Why the check cannot be saved (Danish), or null. : the check is tied to a Windows server.
public static string? Validate(string? name, string? kind, SyntheticCheckSettings settings, int intervalSeconds, int timeoutSeconds, bool hasServer)
{
@@ -245,6 +248,11 @@ public static class SyntheticCheckValidation
return "Angiv en adresse, der starter med http:// eller https://.";
}
+ if (url.AbsoluteUri.Length > MaxUrlLength || url.OriginalString.Length > MaxUrlLength)
+ {
+ return $"Adressen må højst være {MaxUrlLength} tegn.";
+ }
+
if (!string.IsNullOrEmpty(url.UserInfo))
{
return "Adressen må ikke indeholde brugernavn eller adgangskode.";
diff --git a/src/SQLInsight.Web/Components/Pages/ServerFindingDetail.razor b/src/SQLInsight.Web/Components/Pages/ServerFindingDetail.razor
index a0e6e3e..060e29f 100644
--- a/src/SQLInsight.Web/Components/Pages/ServerFindingDetail.razor
+++ b/src/SQLInsight.Web/Components/Pages/ServerFindingDetail.razor
@@ -14,14 +14,30 @@
+@if (_finding.ResolvedAt is null && _finding.ScopeRemoved)
+{
+
@(_finding.Scope == FindingScope.Server ? "Serveren" : "Tjekket") er fjernet og overvåges ikke længere. Fundet er historik og løses inden for en time.
+}
+else if (_finding.ResolvedAt is null && _finding.ScopePaused)
+{
+
@(_finding.Scope == FindingScope.Server ? "Serveren" : "Tjekket") er sat på pause, så fundet er ikke med blandt de aktive fund og løses inden for en time.
Prognosen er en ret linje gennem SQLInsights egne målinger af ledig plads de seneste @(_forecastDays) dage, siden drevet sidst skiftede størrelse. Svinger pladsen meget, gives ingen prognose. Målt @Display.Time(_disks.CapturedAt.UtcDateTime).
+
Prognosen er en ret linje gennem SQLInsights egne målinger af ledig plads @ForecastPeriod, siden drevet sidst skiftede størrelse. Svinger pladsen meget, gives ingen prognose. Målt @Display.Time(_disks.CapturedAt.UtcDateTime).
}
@@ -334,7 +334,12 @@
}
Script, der giver rettighederne
-
Kør det som administrator på @_server.Host. Det giver agentens konto læseadgang (Performance Monitor Users, Event Log Readers, Distributed COM Users, Remote Management Users, WMI Remote Enable på root\cimv2 og TaskScheduler, læseret på Service Control Manager) og intet andet. SQLInsight kører det aldrig selv. -Remove fjerner rettighederne igen, og -EnableFirewall slår Windows' egne firewallregler til.
+
Kør det som administrator på @_server.Host – først med -WhatIf, der viser, hvad det vil gøre, uden at ændre noget, og gerne først på en server, der ikke er i produktion. Det giver agentens konto læseadgang (Performance Monitor Users, Event Log Readers, Distributed COM Users, WMI Enable Account og Remote Enable på root\cimv2 og TaskScheduler, læseret på Service Control Manager) og intet andet, og det gemmer de oprindelige indstillinger, før det ændrer noget. SQLInsight kører det aldrig selv.
+
+
-WinRM giver også kontoen læseadgang til WinRM, så WMI kan læses over WinRM; uden den bruger agenten DCOM.
+
-EnableFirewall -AgentAddress <ip> opretter scriptets egne firewallregler ("SQLInsight Agent: …") kun for agentens adresse. Windows' egne regler røres ikke.
+
-Remove fjerner præcis det, scriptet selv har tilføjet. Rettigheder, kontoen havde i forvejen, bevares.
@@ -423,7 +428,15 @@
private WindowsServerTestResult? _testResult;
private (string? Account, string? Script, string? Note) _grant;
private bool _mayChange;
- private int _forecastDays = 14;
+
+ ///
+ /// The history the forecasts are computed from, as the agent used it (SQLInsight:Servers:Disks:ForecastHistoryDays,
+ /// capped by what has been collected): the longest history among the volumes.
+ ///
+ private string ForecastPeriod =>
+ _disks?.Forecasts.Count > 0 && _disks.Forecasts.Max(f => f.HistoryDays) is var days and >= 1
+ ? "de seneste " + Display.Number(Math.Round(days), 0) + " dage"
+ : "de seneste dage";
protected override async Task OnInitializedAsync()
{
diff --git a/src/SQLInsight.Web/Components/Pages/WindowsServersPage.razor b/src/SQLInsight.Web/Components/Pages/WindowsServersPage.razor
index 909488a..50c26d1 100644
--- a/src/SQLInsight.Web/Components/Pages/WindowsServersPage.razor
+++ b/src/SQLInsight.Web/Components/Pages/WindowsServersPage.razor
@@ -20,7 +20,7 @@
}
@if (!_mayChange)
{
-
Du kan se serverne, men kun administratorer kan tilføje og ændre dem (SQLInsight:Web:AdminGroups).
+
Du kan se serverne, men kun administratorer kan tilføje og ændre dem. @InstanceSetup.WhoMayChangeText(Options.Value)
}
@@ -36,9 +36,9 @@
@foreach (var s in _servers)
{
- var disks = _disks.GetValueOrDefault(s.ServerId);
+ var overview = _overviews.GetValueOrDefault(s.ServerId);
var counts = _counts.GetValueOrDefault((FindingScope.Server, s.ServerId));
- var latest = _latest.GetValueOrDefault(s.ServerId);
+ var latest = overview?.Latest;