Keep original UI; drop unused deploy/XApi/WinRM/TLS/SQL paths.

Form1 design unchanged; only MfApi restart and certificate recognition remain active.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-24 11:09:46 +02:00
co-authored by Cursor
parent 7a9cdb6ecf
commit d1b95bcb9d
17 changed files with 70 additions and 2628 deletions
@@ -4,136 +4,37 @@ namespace ZA.CoreService.ESBCertificateManager.Services;
public sealed class PreflightValidator
{
public PreflightValidationResult Validate(
string? certificatePath,
CertificateInfo? certificateInfo,
IReadOnlyList<DeploymentTarget> selectedTargets)
{
PreflightValidationResult result = new();
if (string.IsNullOrWhiteSpace(certificatePath) || !File.Exists(certificatePath))
{
AddIssue(result, "Es ist keine gültige Zertifikatsdatei ausgewählt.");
}
if (certificateInfo is null)
{
AddIssue(result, "Zertifikatsmetadaten sind nicht geladen.");
}
else if (!certificateInfo.IsCurrentlyValid)
{
AddIssue(result, "Das geladene Zertifikat ist abgelaufen oder ungültig.");
}
if (selectedTargets.Count == 0)
{
AddIssue(result, "Bitte mindestens ein Ziel anhaken.");
}
foreach (DeploymentTarget target in selectedTargets)
{
ValidateTarget(result, target, requireDeployPaths: true);
}
return result;
}
/// <summary>
/// Vorabprüfung nur für ESB-Neustart (ohne Zertifikat / Kopierpfade).
/// </summary>
public PreflightValidationResult ValidateRestartOnly(IReadOnlyList<DeploymentTarget> selectedTargets)
{
PreflightValidationResult result = new();
if (selectedTargets.Count == 0)
{
AddIssue(result, "Bitte mindestens ein Ziel anhaken.");
result.Issues.Add(new ValidationIssue { Message = "Bitte mindestens ein Ziel anhaken." });
return result;
}
foreach (DeploymentTarget target in selectedTargets)
{
if (target.RestartType is RestartType.None)
{
AddIssue(result, $"Ziel '{target.Name}': RestartType=None kein Neustart konfiguriert.", target.Id);
continue;
}
ValidateTarget(result, target, requireDeployPaths: false);
}
return result;
}
private static void ValidateTarget(
PreflightValidationResult result,
DeploymentTarget target,
bool requireDeployPaths)
{
if (requireDeployPaths)
{
if (string.IsNullOrWhiteSpace(target.TargetDirectory))
{
AddIssue(result, $"Ziel '{target.Name}': TargetDirectory fehlt.", target.Id);
}
if (string.IsNullOrWhiteSpace(target.CertificateFileName))
{
AddIssue(result, $"Ziel '{target.Name}': CertificateFileName fehlt.", target.Id);
}
}
if (target.RestartType == RestartType.Command
&& string.IsNullOrWhiteSpace(target.RestartCommand))
{
AddIssue(result, $"Ziel '{target.Name}': RestartCommand fehlt bei RestartType=Command.", target.Id);
}
if (target.RestartType is RestartType.SonicContainer or RestartType.SonicContainerWithXapi)
{
if (string.IsNullOrWhiteSpace(target.ContainerName))
{
AddIssue(result, $"Ziel '{target.Name}': ContainerName fehlt bei RestartType={target.RestartType}.", target.Id);
result.Issues.Add(new ValidationIssue
{
Message = $"Ziel '{target.Name}': ContainerName fehlt.",
TargetId = target.Id
});
}
if (string.IsNullOrWhiteSpace(target.SonicConnectionName))
{
AddIssue(result, $"Ziel '{target.Name}': SonicConnectionName fehlt bei RestartType={target.RestartType}.", target.Id);
result.Issues.Add(new ValidationIssue
{
Message = $"Ziel '{target.Name}': SonicConnectionName fehlt.",
TargetId = target.Id
});
}
}
if (target.RestartType == RestartType.SonicContainerWithXapi
&& string.IsNullOrWhiteSpace(target.XapiSourcePath))
{
AddIssue(result, $"Ziel '{target.Name}': XapiSourcePath fehlt bei RestartType=SonicContainerWithXapi.", target.Id);
}
if (!requireDeployPaths || string.IsNullOrWhiteSpace(target.TargetDirectory))
{
return;
}
try
{
string directory = PathResolver.ResolvePath(target.TargetDirectory);
Directory.CreateDirectory(directory);
string probeFile = Path.Combine(directory, $".write-probe-{Guid.NewGuid():N}");
File.WriteAllText(probeFile, "ok");
File.Delete(probeFile);
}
catch (Exception ex)
{
AddIssue(result, $"Ziel '{target.Name}': Verzeichnis nicht beschreibbar ({ex.Message}).", target.Id);
}
}
private static void AddIssue(PreflightValidationResult result, string message, int? targetId = null)
{
result.Issues.Add(new ValidationIssue
{
TargetId = targetId,
Message = message
});
return result;
}
}