From ea6e760434608e2d3eff2b0d3dbff50288f4fdb9 Mon Sep 17 00:00:00 2001 From: Mike Date: Fri, 24 Jul 2026 09:00:45 +0200 Subject: [PATCH] Fix MfApi Java discovery via SonicHome JRE and ship prebuilt tool. MfApi restart/list no longer requires system JAVA_HOME or javac when Sonic ships a JRE and Tools/SonicMfContainerTool.jar is present. Co-authored-by: Cursor --- .../Models/SonicConnection.cs | 11 + .../Services/SonicManagementClient.cs | 4 +- .../Services/SonicMfApiExecutor.cs | 420 ++++++++++++++++-- .../Tools/SonicMfContainerTool$Args.class | Bin 0 -> 1476 bytes .../Tools/SonicMfContainerTool.class | Bin 0 -> 6684 bytes .../Tools/SonicMfContainerTool.jar | Bin 0 -> 4913 bytes .../appsettings.json | 5 +- 7 files changed, 400 insertions(+), 40 deletions(-) create mode 100644 ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool$Args.class create mode 100644 ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.class create mode 100644 ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.jar diff --git a/ZA.CoreService.ESBCertificateManager/Models/SonicConnection.cs b/ZA.CoreService.ESBCertificateManager/Models/SonicConnection.cs index 4265d2d..d9fad35 100644 --- a/ZA.CoreService.ESBCertificateManager/Models/SonicConnection.cs +++ b/ZA.CoreService.ESBCertificateManager/Models/SonicConnection.cs @@ -130,6 +130,17 @@ public sealed class SonicConnection /// Sonic-Installationsroot, z.B. "C:\Sonic\MQ10.0" (enthält lib\*.jar für MfApi). public string SonicHome { get; init; } = @"C:\Sonic\MQ10.0"; + /// + /// Optional: JRE/JDK-Home (z.B. C:\Sonic\MQ10.0\jre) oder Pfad zu java.exe. + /// Leer = automatische Suche (JAVA_HOME, PATH, SonicHome\jre, Program Files\…). + /// + public string JavaHome { get; init; } = string.Empty; + + /// + /// Optionaler direkter Pfad zu java.exe (überschreibt JavaHome wenn gesetzt). + /// + public string JavaPath { get; init; } = string.Empty; + /// /// Optionaler Pfad zu Sonic-Client-JARs für MfApi (mgmt_client.jar etc.). /// Leer = SonicHome\lib. diff --git a/ZA.CoreService.ESBCertificateManager/Services/SonicManagementClient.cs b/ZA.CoreService.ESBCertificateManager/Services/SonicManagementClient.cs index 3e0e2ec..0160e5a 100644 --- a/ZA.CoreService.ESBCertificateManager/Services/SonicManagementClient.cs +++ b/ZA.CoreService.ESBCertificateManager/Services/SonicManagementClient.cs @@ -267,7 +267,7 @@ public sealed class SonicManagementClient : IDisposable $"über {_connection.ConnectionUrl} fehlgeschlagen.\n" + $"Fehler: {error}\nAusgabe: {output}\n" + "Voraussetzungen: Domain Manager erreichbar, SMC-Logins korrekt, " + - "Java/JDK + Sonic-Client-JARs (SonicHome\\lib), Container online."); + "JRE (JavaHome/SonicHome\\jre/JAVA_HOME) + Sonic-Client-JARs (SonicHome\\lib), Container online."); } await Task.Delay( @@ -290,6 +290,8 @@ public sealed class SonicManagementClient : IDisposable WinRmPassword = source.WinRmPassword, ManagementMode = SonicManagementMode.LocalCmd, SonicHome = source.SonicHome, + JavaHome = source.JavaHome, + JavaPath = source.JavaPath, MfClientLibPath = source.MfClientLibPath, KnownContainers = source.KnownContainers, ManagementHttpPort = source.ManagementHttpPort, diff --git a/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs b/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs index b674ca2..0984f6d 100644 --- a/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs +++ b/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs @@ -162,25 +162,37 @@ public sealed class SonicMfApiExecutor string? javaExe = ResolveJavaExecutable(); if (javaExe is null) { + string sonicHint = string.IsNullOrWhiteSpace(_connection.SonicHome) + ? "" + : $" Erwartet z.B. '{Path.Combine(_connection.SonicHome, "jre", "bin", "java.exe")}'."; return (false, null, null, null, - "Java nicht gefunden (JAVA_HOME/bin/java.exe oder PATH). " + - "Für MfApi wird ein JRE/JDK benötigt."); + "Java nicht gefunden. Gesucht: SonicConnection.JavaHome/JavaPath, JAVA_HOME, PATH, " + + "SonicHome\\jre|jdk\\bin\\java.exe, Program Files\\Java|Eclipse Adoptium." + + sonicHint + + " Für MfApi JavaHome in appsettings setzen oder JRE unter SonicHome nutzen."); } - string? libDir = ResolveLibDirectory(); + (string? libDir, string? libError) = ResolveLibDirectoryDetailed(); if (libDir is null) { - return (false, null, null, null, - "Sonic-Client-JARs nicht gefunden. SonicHome\\lib oder MfClientLibPath setzen " + - $"(aktuell SonicHome='{_connection.SonicHome}', MfClientLibPath='{_connection.MfClientLibPath}'). " + - "Benötigt u.a. mgmt_client.jar / mfcontext.jar / sonic_Client.jar."); + return (false, null, null, null, libError); } + // Bevorzugt: vorcompilierte .jar/.class aus Tools\ (kein javac nötig). + if (TryResolvePrebuiltTool(out string? prebuiltDir, out string? prebuiltEntry, out string? prebuiltError) + && prebuiltDir is not null && prebuiltEntry is not null) + { + string classpath = BuildClasspath(libDir, prebuiltEntry); + return (true, javaExe, prebuiltDir, classpath, null); + } + + // Fallback: zur Laufzeit aus .java kompilieren (braucht javac + Sonic-Libs). string? sourcePath = ResolveToolSourcePath(); if (sourcePath is null) { return (false, null, null, null, - "Tools\\SonicMfContainerTool.java nicht gefunden (App-Ausgabeverzeichnis prüfen)."); + (prebuiltError ?? "Kein vorcompilierter SonicMfContainerTool gefunden.") + + " Tools\\SonicMfContainerTool.java/.class/.jar fehlen im Ausgabeverzeichnis."); } string workDir = Path.Combine(Path.GetTempPath(), "esb-sonic-mf"); @@ -191,7 +203,8 @@ public sealed class SonicMfApiExecutor File.Copy(sourcePath, javaTarget, overwrite: true); - string classpath = BuildClasspath(libDir, workDir); + string compileClasspath = BuildClasspath(libDir, null); + string runtimeClasspath = BuildClasspath(libDir, workDir); bool needsCompile = !File.Exists(classFile) || File.GetLastWriteTimeUtc(classFile) < File.GetLastWriteTimeUtc(sourcePath); @@ -201,14 +214,15 @@ public sealed class SonicMfApiExecutor if (javac is null) { return (false, null, null, null, - "javac nicht gefunden. JDK installieren (nicht nur JRE), " + - "damit SonicMfContainerTool.java kompiliert werden kann."); + "Vorcompilierter SonicMfContainerTool fehlt und javac wurde nicht gefunden. " + + "JDK installieren oder Tools\\SonicMfContainerTool.jar/.class mit ausliefern. " + + $"Gefundene java.exe: {javaExe}"); } ProcessStartInfo compilePsi = new() { FileName = javac, - Arguments = $"-encoding UTF-8 -cp {Quote(BuildClasspath(libDir, null))} -d {Quote(workDir)} {Quote(javaTarget)}", + Arguments = $"-encoding UTF-8 -cp {Quote(compileClasspath)} -d {Quote(workDir)} {Quote(javaTarget)}", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, @@ -236,42 +250,111 @@ public sealed class SonicMfApiExecutor } } - return (true, javaExe, workDir, classpath, null); + return (true, javaExe, workDir, runtimeClasspath, null); } - private string? ResolveLibDirectory() + private bool TryResolvePrebuiltTool(out string? workDir, out string? classpathEntry, out string? error) { - List candidates = []; + workDir = null; + classpathEntry = null; + error = null; + + string[] searchDirs = + [ + Path.Combine(AppContext.BaseDirectory, "Tools"), + Path.Combine(Directory.GetCurrentDirectory(), "Tools"), + AppContext.BaseDirectory + ]; + + foreach (string dir in searchDirs.Where(Directory.Exists)) + { + string jar = Path.Combine(dir, "SonicMfContainerTool.jar"); + if (File.Exists(jar)) + { + workDir = dir; + classpathEntry = jar; + return true; + } + + string classFile = Path.Combine(dir, "SonicMfContainerTool.class"); + if (File.Exists(classFile)) + { + workDir = dir; + classpathEntry = dir; + return true; + } + } + + error = "Tools\\SonicMfContainerTool.jar/.class nicht gefunden."; + return false; + } + + private (string? Dir, string? Error) ResolveLibDirectoryDetailed() + { + List<(string Path, string Label)> candidates = []; if (!string.IsNullOrWhiteSpace(_connection.MfClientLibPath)) { - candidates.Add(_connection.MfClientLibPath); + candidates.Add((_connection.MfClientLibPath, "MfClientLibPath")); } if (!string.IsNullOrWhiteSpace(_connection.SonicHome)) { - candidates.Add(Path.Combine(_connection.SonicHome, "lib")); - candidates.Add(_connection.SonicHome); + candidates.Add((Path.Combine(_connection.SonicHome, "lib"), "SonicHome\\lib")); + candidates.Add((_connection.SonicHome, "SonicHome")); } - foreach (string dir in candidates.Where(Directory.Exists)) + List checkedPaths = []; + foreach ((string path, string label) in candidates) { - if (Directory.EnumerateFiles(dir, "*.jar", SearchOption.TopDirectoryOnly).Any()) + checkedPaths.Add($"{label}='{path}'"); + if (!Directory.Exists(path)) { - return dir; + continue; + } + + if (Directory.EnumerateFiles(path, "*.jar", SearchOption.TopDirectoryOnly).Any()) + { + return (path, null); } } - return null; + string sonicHome = _connection.SonicHome ?? string.Empty; + bool sonicHomeExists = !string.IsNullOrWhiteSpace(sonicHome) && Directory.Exists(sonicHome); + string libPath = string.IsNullOrWhiteSpace(sonicHome) + ? "(SonicHome leer)" + : Path.Combine(sonicHome, "lib"); + + if (sonicHomeExists && Directory.Exists(libPath) + && !Directory.EnumerateFiles(libPath, "*.jar", SearchOption.TopDirectoryOnly).Any()) + { + return (null, + $"Sonic-Client-JARs fehlen unter '{libPath}' (Ordner existiert, aber keine *.jar). " + + "MfApi braucht u.a. mgmt_client.jar / mfcontext.jar / sonic_Client.jar. " + + "MfClientLibPath auf den korrekten Lib-Ordner setzen."); + } + + if (sonicHomeExists && !Directory.Exists(libPath)) + { + return (null, + $"SonicHome='{sonicHome}' gefunden, aber Lib-Ordner fehlt: '{libPath}'. " + + "Sonic-Client-Installation prüfen oder MfClientLibPath setzen " + + "(erwartet *.jar, u.a. mgmt_client.jar)."); + } + + return (null, + "Sonic-Client-JARs nicht gefunden. SonicHome\\lib oder MfClientLibPath setzen " + + $"(geprüft: {string.Join("; ", checkedPaths)}). " + + "Benötigt u.a. mgmt_client.jar / mfcontext.jar / sonic_Client.jar."); } - private static string BuildClasspath(string libDir, string? extraDir) + private static string BuildClasspath(string libDir, string? extraEntry) { // Java-Classpath-Wildcard für alle JARs im Lib-Ordner string jars = Path.Combine(libDir, "*"); - return string.IsNullOrWhiteSpace(extraDir) + return string.IsNullOrWhiteSpace(extraEntry) ? jars - : jars + Path.PathSeparator + extraDir; + : jars + Path.PathSeparator + extraEntry; } private static string? ResolveToolSourcePath() @@ -286,47 +369,308 @@ public sealed class SonicMfApiExecutor return candidates.FirstOrDefault(File.Exists); } - private static string? ResolveJavaExecutable() + private string? ResolveJavaExecutable() { - string? javaHome = Environment.GetEnvironmentVariable("JAVA_HOME"); - if (!string.IsNullOrWhiteSpace(javaHome)) + foreach (string? configured in new[] { _connection.JavaPath, _connection.JavaHome }) { - string candidate = Path.Combine(javaHome, "bin", "java.exe"); - if (File.Exists(candidate)) + string? fromConfig = ResolveJavaFromConfiguredPath(configured); + if (fromConfig is not null) { - return candidate; + return fromConfig; } } - return FindOnPath("java.exe") ?? FindOnPath("java"); + string? javaHome = Environment.GetEnvironmentVariable("JAVA_HOME"); + string? fromEnv = ResolveJavaFromHomeDir(javaHome); + if (fromEnv is not null) + { + return fromEnv; + } + + string? fromPath = FindOnPath(JavaExeName) ?? FindOnPath("java"); + if (fromPath is not null) + { + return fromPath; + } + + if (!string.IsNullOrWhiteSpace(_connection.SonicHome)) + { + string sonicHome = _connection.SonicHome; + string[] direct = + [ + Path.Combine(sonicHome, "jre", "bin", JavaExeName), + Path.Combine(sonicHome, "jdk", "bin", JavaExeName), + Path.Combine(sonicHome, "JRE", "bin", JavaExeName), + Path.Combine(sonicHome, "JDK", "bin", JavaExeName) + ]; + foreach (string candidate in direct) + { + if (File.Exists(candidate)) + { + return candidate; + } + } + + // Häufige Layouts: SonicHome\MQ*\jre, SonicHome\jre64, SonicHome\Java\jre, ... + string? nested = FindJavaUnderSonicHome(sonicHome); + if (nested is not null) + { + return nested; + } + } + + return FindJavaInCommonInstallLocations(); } - private static string? ResolveJavacExecutable(string javaExe) + private string? ResolveJavacExecutable(string javaExe) { + string javacName = OperatingSystem.IsWindows() ? "javac.exe" : "javac"; + string? dir = Path.GetDirectoryName(javaExe); if (!string.IsNullOrWhiteSpace(dir)) { - string sibling = Path.Combine(dir, OperatingSystem.IsWindows() ? "javac.exe" : "javac"); + string sibling = Path.Combine(dir, javacName); if (File.Exists(sibling)) { return sibling; } } + foreach (string? configured in new[] { _connection.JavaPath, _connection.JavaHome }) + { + string? fromConfig = ResolveToolFromConfiguredPath(configured, javacName); + if (fromConfig is not null) + { + return fromConfig; + } + } + string? javaHome = Environment.GetEnvironmentVariable("JAVA_HOME"); if (!string.IsNullOrWhiteSpace(javaHome)) { - string candidate = Path.Combine(javaHome, "bin", - OperatingSystem.IsWindows() ? "javac.exe" : "javac"); + string candidate = Path.Combine(javaHome, "bin", javacName); if (File.Exists(candidate)) { return candidate; } } - return FindOnPath("javac.exe") ?? FindOnPath("javac"); + if (!string.IsNullOrWhiteSpace(_connection.SonicHome)) + { + foreach (string root in EnumerateJdkRootsUnderSonicHome(_connection.SonicHome)) + { + string candidate = Path.Combine(root, "bin", javacName); + if (File.Exists(candidate)) + { + return candidate; + } + } + } + + return FindOnPath(javacName) ?? FindOnPath("javac"); } + private static string? ResolveJavaFromConfiguredPath(string? configured) + => ResolveToolFromConfiguredPath(configured, JavaExeName); + + private static string? ResolveToolFromConfiguredPath(string? configured, string exeName) + { + if (string.IsNullOrWhiteSpace(configured)) + { + return null; + } + + string path = configured.Trim().Trim('"'); + + if (File.Exists(path)) + { + if (path.EndsWith(exeName, StringComparison.OrdinalIgnoreCase)) + { + return path; + } + + // Konfiguriert: ...\bin\java.exe → sibling javac.exe (oder umgekehrt) + string? parent = Path.GetDirectoryName(path); + if (!string.IsNullOrWhiteSpace(parent)) + { + string sibling = Path.Combine(parent, exeName); + if (File.Exists(sibling)) + { + return sibling; + } + } + + // java ohne Endung (Unix) oder exakter Treffer + string fileName = Path.GetFileName(path); + if (fileName.Equals(Path.GetFileNameWithoutExtension(exeName), StringComparison.OrdinalIgnoreCase) + || fileName.Equals(exeName, StringComparison.OrdinalIgnoreCase)) + { + return path; + } + } + + string fromHome = Path.Combine(path, "bin", exeName); + return File.Exists(fromHome) ? fromHome : null; + } + + private static string? ResolveJavaFromHomeDir(string? home) + { + if (string.IsNullOrWhiteSpace(home)) + { + return null; + } + + string candidate = Path.Combine(home.Trim().Trim('"'), "bin", JavaExeName); + return File.Exists(candidate) ? candidate : null; + } + + private static string? FindJavaUnderSonicHome(string sonicHome) + { + if (!Directory.Exists(sonicHome)) + { + return null; + } + + // Direkte Unterordner mit jre/jdk + foreach (string root in EnumerateJdkRootsUnderSonicHome(sonicHome)) + { + string candidate = Path.Combine(root, "bin", JavaExeName); + if (File.Exists(candidate)) + { + return candidate; + } + } + + return null; + } + + private static IEnumerable EnumerateJdkRootsUnderSonicHome(string sonicHome) + { + if (!Directory.Exists(sonicHome)) + { + yield break; + } + + string[] preferredNames = + [ + "jre", "jdk", "JRE", "JDK", "jre64", "jdk64", "Java", "java" + ]; + + foreach (string name in preferredNames) + { + string path = Path.Combine(sonicHome, name); + if (Directory.Exists(path)) + { + yield return path; + string nestedJre = Path.Combine(path, "jre"); + if (Directory.Exists(nestedJre)) + { + yield return nestedJre; + } + } + } + + // {SonicHome}\*\jre und {SonicHome}\*\jdk + IEnumerable children; + try + { + children = Directory.EnumerateDirectories(sonicHome); + } + catch + { + yield break; + } + + foreach (string child in children) + { + foreach (string leaf in new[] { "jre", "jdk", "JRE", "JDK" }) + { + string nested = Path.Combine(child, leaf); + if (Directory.Exists(nested)) + { + yield return nested; + } + } + + // z.B. ...\jre1.8.0_xxx direkt als Kind + string leafName = Path.GetFileName(child); + if (leafName.StartsWith("jre", StringComparison.OrdinalIgnoreCase) + || leafName.StartsWith("jdk", StringComparison.OrdinalIgnoreCase)) + { + yield return child; + } + } + } + + private static string? FindJavaInCommonInstallLocations() + { + string[] roots = + [ + Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), + Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), + @"C:\Program Files", + @"C:\Program Files (x86)" + ]; + + string[] vendorFolders = + [ + "Java", + "Eclipse Adoptium", + "AdoptOpenJDK", + "Microsoft", + "Amazon Corretto", + "Zulu", + "BellSoft", + "Semeru" + ]; + + foreach (string root in roots.Where(r => !string.IsNullOrWhiteSpace(r)).Distinct(StringComparer.OrdinalIgnoreCase)) + { + foreach (string vendor in vendorFolders) + { + string vendorDir = Path.Combine(root, vendor); + if (!Directory.Exists(vendorDir)) + { + continue; + } + + // vendor\bin\java.exe + string direct = Path.Combine(vendorDir, "bin", JavaExeName); + if (File.Exists(direct)) + { + return direct; + } + + try + { + foreach (string sub in Directory.EnumerateDirectories(vendorDir) + .OrderByDescending(d => d, StringComparer.OrdinalIgnoreCase)) + { + string candidate = Path.Combine(sub, "bin", JavaExeName); + if (File.Exists(candidate)) + { + return candidate; + } + + string nestedJre = Path.Combine(sub, "jre", "bin", JavaExeName); + if (File.Exists(nestedJre)) + { + return nestedJre; + } + } + } + catch + { + // ignore inaccessible vendor dirs + } + } + } + + return null; + } + + private static string JavaExeName => OperatingSystem.IsWindows() ? "java.exe" : "java"; + private static string? FindOnPath(string fileName) { string? pathEnv = Environment.GetEnvironmentVariable("PATH"); @@ -339,7 +683,7 @@ public sealed class SonicMfApiExecutor { try { - string candidate = Path.Combine(dir.Trim('"'), fileName); + string candidate = Path.Combine(dir.Trim().Trim('"'), fileName); if (File.Exists(candidate)) { return candidate; diff --git a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool$Args.class b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool$Args.class new file mode 100644 index 0000000000000000000000000000000000000000..71aa15db7b8139b9dbf923be0750971bf7a19fe5 GIT binary patch literal 1476 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 MsjJm0wHl$n0U$`g4gdfE literal 0 HcmV?d00001 diff --git a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.jar b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.jar new file mode 100644 index 0000000000000000000000000000000000000000..3151f0741adbed96f1127bab44650f5068183181 GIT binary patch literal 4913 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 L001$~@2CF(S?SO` literal 0 HcmV?d00001 diff --git a/ZA.CoreService.ESBCertificateManager/appsettings.json b/ZA.CoreService.ESBCertificateManager/appsettings.json index 9628465..c108d53 100644 --- a/ZA.CoreService.ESBCertificateManager/appsettings.json +++ b/ZA.CoreService.ESBCertificateManager/appsettings.json @@ -14,10 +14,13 @@ "Username": "Administrator", "Password": "Administrator", // Standard: Sonic MF Management API (IAgentProxy.restart) – kein WinRM. - // Benötigt Java/JDK + Client-JARs unter SonicHome\\lib (oder MfClientLibPath). + // Benötigt JRE + Client-JARs unter SonicHome\\lib (oder MfClientLibPath). + // Java: oft unter SonicHome\\jre – sonst JavaHome/JavaPath setzen (kein systemweites JAVA_HOME nötig). // Optional-Fallback: "WinRm" / "LocalCmd" (stopcontainer/startcontainer). "ManagementMode": "MfApi", "SonicHome": "C:\\Sonic\\MQ10.0", + "JavaHome": "", + "JavaPath": "", "MfClientLibPath": "", "KnownContainers": [ "DE-Test"