Switch default restart to Sonic MF Management API via Domain Manager.

Use ConnectionUrl and SMC credentials with IAgentProxy.restart; keep WinRM only as optional fallback.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-24 08:54:53 +02:00
co-authored by Cursor
parent d71d6990ad
commit 11941a45f5
8 changed files with 962 additions and 31 deletions
@@ -38,15 +38,104 @@ public sealed class SonicConnection
public string WinRmPassword { get; init; } = string.Empty;
/// <summary>
/// WinRm = remote via PowerShell Remoting;
/// LocalCmd = lokal auf dem Sonic-Server (kein WinRM, App muss dort laufen);
/// HttpApi = REST.
/// MfApi = Sonic MF Management Runtime API über ConnectionUrl + SMC-Logins (Standard);
/// WinRm / LocalCmd = optionaler Fallback über stopcontainer/startcontainer;
/// HttpApi = REST (falls vorhanden).
/// </summary>
public SonicManagementMode ManagementMode { get; init; } = SonicManagementMode.WinRm;
public SonicManagementMode ManagementMode { get; init; } = SonicManagementMode.MfApi;
/// <summary>Sonic-Installationsroot, z.B. "C:\Sonic\MQ10.0".</summary>
/// <summary>
/// Effektiver Modus: bei WinRm und lokalem ConnectionUrl-Host wird LocalCmd erzwungen.
/// MfApi bleibt unverändert (nutzt Domain-Manager-Verbindung).
/// </summary>
public SonicManagementMode EffectiveManagementMode
=> ManagementMode == SonicManagementMode.WinRm && IsConnectionHostLocal(ConnectionUrl)
? SonicManagementMode.LocalCmd
: ManagementMode;
/// <summary>True wenn WinRm konfiguriert war, aber wegen lokalem Host auf LocalCmd umgestellt wurde.</summary>
public bool IsLocalCmdAutoForced
=> ManagementMode == SonicManagementMode.WinRm
&& EffectiveManagementMode == SonicManagementMode.LocalCmd;
/// <summary>Anzeigetext für UI (inkl. Auto-Erkennung).</summary>
public string ManagementModeDisplay
=> IsLocalCmdAutoForced
? "LocalCmd (Host lokal erkannt)"
: EffectiveManagementMode switch
{
SonicManagementMode.MfApi => "MfApi (Sonic Domain Manager)",
_ => EffectiveManagementMode.ToString()
};
/// <summary>
/// True wenn der Host aus ConnectionUrl dieser Maschine entspricht
/// (localhost / 127.0.0.1 / ::1 / Computername).
/// </summary>
public static bool IsConnectionHostLocal(string? connectionUrl)
{
if (string.IsNullOrWhiteSpace(connectionUrl))
{
return false;
}
string host;
try
{
host = new Uri(connectionUrl).Host;
}
catch
{
host = connectionUrl.Trim();
}
if (string.IsNullOrWhiteSpace(host))
{
return false;
}
if (host.Equals("localhost", StringComparison.OrdinalIgnoreCase)
|| host.Equals("127.0.0.1", StringComparison.OrdinalIgnoreCase)
|| host.Equals("::1", StringComparison.OrdinalIgnoreCase)
|| host.Equals("[::1]", StringComparison.OrdinalIgnoreCase))
{
return true;
}
string machine = Environment.MachineName;
if (host.Equals(machine, StringComparison.OrdinalIgnoreCase)
|| host.StartsWith(machine + ".", StringComparison.OrdinalIgnoreCase))
{
return true;
}
try
{
string dnsName = System.Net.Dns.GetHostName();
if (!string.IsNullOrWhiteSpace(dnsName)
&& (host.Equals(dnsName, StringComparison.OrdinalIgnoreCase)
|| host.StartsWith(dnsName + ".", StringComparison.OrdinalIgnoreCase)))
{
return true;
}
}
catch
{
// DNS optional
}
return false;
}
/// <summary>Sonic-Installationsroot, z.B. "C:\Sonic\MQ10.0" (enthält lib\*.jar für MfApi).</summary>
public string SonicHome { get; init; } = @"C:\Sonic\MQ10.0";
/// <summary>
/// Optionaler Pfad zu Sonic-Client-JARs für MfApi (mgmt_client.jar etc.).
/// Leer = SonicHome\lib.
/// </summary>
public string MfClientLibPath { get; init; } = string.Empty;
/// <summary>
/// Container-Namen (kurz), z.B. ["DE-Test"]. Nicht die Domain.
/// </summary>
@@ -281,5 +370,7 @@ public enum SonicManagementMode
{
HttpApi = 0,
WinRm = 1,
LocalCmd = 2
LocalCmd = 2,
/// <summary>Sonic MF Management API über Domain-Manager (ConnectionUrl + SMC-Credentials).</summary>
MfApi = 3
}