From 7a9cdb6ecfbfeaad06a50412ec9173e7893ad614 Mon Sep 17 00:00:00 2001 From: Mike Date: Fri, 24 Jul 2026 10:22:39 +0200 Subject: [PATCH] Force new MfApi tool build and MBean stop restart path. Reject stale SonicMfContainerTool.class, print ToolVersion, prefer tool on classpath. Co-authored-by: Cursor --- .../Services/SonicMfApiExecutor.cs | 49 ++- .../Tools/SonicMfContainerTool$Args.class | Bin 1460 -> 1460 bytes .../Tools/SonicMfContainerTool.class | Bin 13185 -> 14718 bytes .../Tools/SonicMfContainerTool.jar | Bin 8212 -> 8988 bytes .../Tools/SonicMfContainerTool.java | 389 +++++++++++------- ...A.CoreService.ESBCertificateManager.csproj | 2 +- 6 files changed, 276 insertions(+), 164 deletions(-) diff --git a/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs b/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs index 86bea99..034f21c 100644 --- a/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs +++ b/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs @@ -186,7 +186,32 @@ public sealed class SonicMfApiExecutor "Hinweis: Container-Kurzname laut SMC ist 'ct-ZADBService' (nicht der Verbindungs-Alias DE-Test)."; } - return (false, combined.Length > 0 ? combined : null, err); + if (!combined.Contains("ToolVersion=", StringComparison.OrdinalIgnoreCase)) + { + err += + "\n\nWARN: Ausgabe enthält kein INFO:ToolVersion=… – vermutlich alte SonicMfContainerTool.class.\n" + + "App neu bauen (Debug+Release), Tools-Ordner im Output prüfen, Temp esb-sonic-mf* löschen."; + } + + // Volle Ausgabe mitliefern (INFO/WARN), nicht nur die ERROR-Zeile + string detail = string.IsNullOrWhiteSpace(combined) ? err : err + "\n\n--- Tool-Output ---\n" + combined; + return (false, combined.Length > 0 ? combined : null, detail); + } + + private static void TryDeleteTempToolCache() + { + try + { + string dir = Path.Combine(Path.GetTempPath(), "esb-sonic-mf-j8"); + if (Directory.Exists(dir)) + { + Directory.Delete(dir, recursive: true); + } + } + catch + { + /* ignore */ + } } private async Task<(bool Ok, string? JavaExe, string? ClassDir, string? Classpath, string? Error)> @@ -246,11 +271,14 @@ public sealed class SonicMfApiExecutor return (false, null, null, null, libError); } - // Vorcompilierte .class/.jar nur nutzen, wenn Class-Version zur Runtime passt. + // Vorcompilierte .class nur nutzen, wenn Class-Version passt. + // Tool-Verzeichnis ZUERST im Classpath, damit keine alte Klasse aus Temp/JAR gewinnt. if (TryResolvePrebuiltTool(runtimeMajor, out string? prebuiltDir, out string? prebuiltEntry, out string? prebuiltError) && prebuiltDir is not null && prebuiltEntry is not null) { - string classpath = libClasspath + Path.PathSeparator + prebuiltEntry; + // Veraltete Temp-Kopien entfernen (früheres Compile-Cache). + TryDeleteTempToolCache(); + string classpath = prebuiltEntry + Path.PathSeparator + libClasspath; return (true, javaExe, prebuiltDir, classpath, null); } @@ -264,6 +292,7 @@ public sealed class SonicMfApiExecutor $"Runtime-Java: {javaExe} (class major max={runtimeMajor})."); } + TryDeleteTempToolCache(); string workDir = Path.Combine(Path.GetTempPath(), "esb-sonic-mf-j8"); Directory.CreateDirectory(workDir); @@ -273,7 +302,8 @@ public sealed class SonicMfApiExecutor File.Copy(sourcePath, javaTarget, overwrite: true); string compileClasspath = libClasspath; - string runtimeClasspath = libClasspath + Path.PathSeparator + workDir; + // workDir zuerst + string runtimeClasspath = workDir + Path.PathSeparator + libClasspath; bool classOk = File.Exists(classFile) && ReadClassFileMajorVersion(classFile) is int existingMajor @@ -375,13 +405,22 @@ public sealed class SonicMfApiExecutor if (File.Exists(classFile)) { int? major = ReadClassFileMajorVersion(classFile); - if (major is not null && major <= runtimeMajor) + // Alte Builds waren ~7KB; MBean-Stop-Tool ist >10KB. + long len = new FileInfo(classFile).Length; + if (major is not null && major <= runtimeMajor && len >= 10_000) { workDir = dir; classpathEntry = dir; return true; } + if (major is not null && major <= runtimeMajor && len < 10_000) + { + error = + $"Tools\\SonicMfContainerTool.class ist veraltet ({len} Bytes). Bitte neu bauen/pullen (erwartet >=10000)."; + continue; + } + error = $"Tools\\SonicMfContainerTool.class ist zu neu (major={major}, braucht <={runtimeMajor} / Java 8)."; continue; diff --git a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool$Args.class b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool$Args.class index fbb478caa2f85c14dd6e8ee381cff7b7579924e6..d1c1955f5969aac3f2a5c068a1feffe589d27ecf 100644 GIT binary patch delta 108 zcmV-y0F(c;3$zQc3j_t500aV~vk(La0ad2}2m+`85dx|J69TOO9RjWZB?7PjDFU$o zIs&r*Jp#1=MFO?}R|2;HX#%(adjh!tjRLv=p8~r8r~}Y- delta 108 zcmdnOy@h)NHw$YJ0}E5sW&sv<#?Uwh4yJepL8e3oVWt!YS*BD5Ri<YNi5)UZz5Z`AkI&E0{_cwgJ`eVX9y_##F^{hN+t2GE*(X L4W@?4IjkN4Zg&_A diff --git a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.class b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.class index 52c19d87c32ea871b38b25c8583dc269af441bbb..105c868e39d30327400601d29536e45c44d8413f 100644 GIT binary patch literal 14718 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 z zts_$M51Pj)(ebGQO7Ke+CnlQ$K8XC5*_8YW%Skk*qp;>0r%IsXuP6D}EkUSKaDab% zoMvWW?)O?UT;=0G+LAz4b0m{zxMXyGq}`<>?E(Ii_&Pya0B;!vK^5!#CPH1^oFmQu z(M`WJH|pjXY5oPxyATN@g?jHED)GC<)ku)+L^s=XBz(sR#Qg)r=}CtPaQ%KCnevp) zX2$l>(&p^66WKGJLaRo@V}2lK_c(qXfO$k)S~F6d1M-Ih`rD44bTv-7Xo7OnT;;*N zg-Ok-m|9c`ilP=>qDrYtjisa-NBh-yx>c3Y1IkAasd9Q$O`<21AEkv-dQMHlozzS& zQZv}40=!hs(iVlt=cI(+y$1h!`Y9TZe8^BCfKdx<4FAUdlMG-?yFojoIAX&PB6b;X zkCoEh4vZW^u7svUMmktJA4LrOkkQfD`IwAQ3l)9|TzrZUwjg4W>RI01fSOmJX1LII zre6d#6YH+iYNiz2psi+zQdE)H7?cg2j*YSC@{{y#Zh8D11b|abQ&eri7Whe-v&H+M z5SmQ4jhK^?4TdI((T`#6}Op1g$;5tk`DO%)3Tm6|p;utL(9!4O4&JQD`W+Uo+ z3|YNdGoaiE;QU5^-_VOeIftze3#D2O$<0&eQcx|VC2A2hsl~KOErC8Pqg`q_?NKY} zO0|-1Qmg4^wU%yC7iw8gmgK9+b}}b*p$6z*ds>}FeuC*h>g^83T_7F+Hw=7;+}vM< zaHqKj&VVzKppC0iw*Zc|)VPX*MZp1O4yfWoWYyTs(tgezLPNf4rV_QDO4UXxQ=4d_ z+DwzxRvc;@4z-=us2!T@sRa^;Q-HcNW2tUAx>&u6{4@QFZ5T9s~u3| zmrT8j%BNO=23PyNR8lq7b=iO_?XSvFAh1R1GIFV%WT!{Z^KREQWrX0hi z7rv_RqZ0XU>Kl3olo(ZTvw78Nd*6>ijSf(`x{{`=tMtBO$aO;O_P`Va5yJs&hCiuu zHd}!Mi_y-^^QmeE8)TF&E4*kERr+zlw~MuMF@ltYzEsio*sYMJ^FzP;FR0-l!B Gl>Z0Dp}=tf literal 13185 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 diff --git a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.jar b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.jar index 2894ff6eacdb65a9cb303fa949975faefc441fdd..593d2b02cb2ff1babaf9b22f15b65999fc9d403b 100644 GIT binary patch delta 8568 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 delta 7794 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 E04Q}m`~Uy| diff --git a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.java b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.java index 99d1ff5..2f1caaa 100644 --- a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.java +++ b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.java @@ -8,31 +8,24 @@ import javax.management.MBeanInfo; import javax.management.ObjectName; /** - * Sonic Management Application API helper (same restart as SMC). + * Sonic Management Application API helper (same restart intent as SMC). * - * Uses reflection so this file compiles with Java 8 without Sonic jars on the - * compile classpath. At runtime SonicHome\\lib must provide: - * mgmt_client / mfcontext / sonic_Client (etc.) + * TOOL_VERSION is printed first so we can verify the deployed build. * - * Flow: - * Hashtable ConnectionURLs/DefaultUser/DefaultPassword - * -> JMSConnectorAddress / JMSConnectorClient.connect - * -> ObjectName {domain}.{container}:ID=AGENT - * -> restart via (in order): - * 1) MBean invoke("restart") / invoke("stop") [remote / unbounded OK] - * 2) IAgentProxy.restart / stop via MFProxyFactory - * - * Note: IAgentProxy.restart() often throws - * "Operation unsupported for unbounded client connector" - * on remote JMSConnectorClient. SMC Restart typically stops the agent; the - * Launch Daemon / container host brings it back up. + * Remote JMSConnectorClient is "unbounded". IAgentProxy.restart() often throws + * "Operation unsupported for unbounded client connector". SMC Restart typically + * stops the agent via JMX; Launch Daemon brings it back. * * Compile: javac --release 8 SonicMfContainerTool.java */ public final class SonicMfContainerTool { + /** Bump when restart logic changes – must appear in app output. */ + public static final String TOOL_VERSION = "2026-07-24c-mbean-stop"; + public static void main(String[] args) { + info("ToolVersion=" + TOOL_VERSION); try { Args a = Args.parse(args); @@ -89,12 +82,7 @@ public final class SonicMfContainerTool } catch (Throwable t) { - Throwable root = t; - while (root.getCause() != null && root.getCause() != root) - { - root = root.getCause(); - } - fail(root.getClass().getName() + ": " + root.getMessage()); + fail(rootOf(t).getClass().getName() + ": " + rootOf(t).getMessage()); } } @@ -112,43 +100,105 @@ public final class SonicMfContainerTool Class clientCl = Class.forName("com.sonicsw.mf.jmx.client.JMSConnectorClient"); Object connector = clientCl.getConstructor(new Class[] {}).newInstance(new Object[] {}); - Method connect = null; - Method[] methods = clientCl.getMethods(); - for (int i = 0; i < methods.length; i++) - { - Method m = methods[i]; - if ("connect".equals(m.getName()) && m.getParameterTypes().length == 2) - { - connect = m; - break; - } - } + // Optional: Request-Timeout setzen (falls vorhanden) + trySetTimeout(connector, timeoutMs); + + Method connect = findConnect(clientCl); if (connect == null) { - fail("JMSConnectorClient.connect(address, timeout) nicht gefunden."); + fail("JMSConnectorClient.connect(...) nicht gefunden."); return null; } Class[] pts = connect.getParameterTypes(); - Object timeoutArg; - if (pts[1] == Long.TYPE || pts[1] == Long.class) + Object[] callArgs; + if (pts.length == 2) { - timeoutArg = Long.valueOf(timeoutMs); + callArgs = new Object[] { address, boxTimeout(pts[1], timeoutMs) }; } - else if (pts[1] == Integer.TYPE || pts[1] == Integer.class) + else if (pts.length == 1) { - timeoutArg = Integer.valueOf((int) Math.min(Integer.MAX_VALUE, timeoutMs)); + callArgs = new Object[] { address }; } else { - timeoutArg = Long.valueOf(timeoutMs); + callArgs = new Object[] { address, boxTimeout(pts[1], timeoutMs) }; } - connect.invoke(connector, new Object[] { address, timeoutArg }); + connect.invoke(connector, callArgs); info("Connected url=" + url + " user=" + user); return connector; } + private static Method findConnect(Class clientCl) + { + Method best = null; + Method[] methods = clientCl.getMethods(); + for (int i = 0; i < methods.length; i++) + { + Method m = methods[i]; + if (!"connect".equals(m.getName())) + { + continue; + } + if (m.getParameterTypes().length == 2) + { + return m; + } + if (m.getParameterTypes().length == 1) + { + best = m; + } + } + return best; + } + + private static void trySetTimeout(Object connector, long timeoutMs) + { + String[] names = new String[] { "setTimeout", "setRequestTimeout", "setDefaultTimeout" }; + for (int i = 0; i < names.length; i++) + { + try + { + Method m = connector.getClass().getMethod(names[i], new Class[] { Long.TYPE }); + m.invoke(connector, new Object[] { Long.valueOf(timeoutMs) }); + info("Set " + names[i] + "=" + timeoutMs); + return; + } + catch (NoSuchMethodException ignore) + { + try + { + Method m = connector.getClass().getMethod(names[i], new Class[] { Integer.TYPE }); + m.invoke(connector, new Object[] { Integer.valueOf((int) Math.min(Integer.MAX_VALUE, timeoutMs)) }); + info("Set " + names[i] + "=" + timeoutMs); + return; + } + catch (Exception ignore2) + { + /* next */ + } + } + catch (Exception ignore) + { + /* next */ + } + } + } + + private static Object boxTimeout(Class type, long timeoutMs) + { + if (type == Long.TYPE || type == Long.class) + { + return Long.valueOf(timeoutMs); + } + if (type == Integer.TYPE || type == Integer.class) + { + return Integer.valueOf((int) Math.min(Integer.MAX_VALUE, timeoutMs)); + } + return Long.valueOf(timeoutMs); + } + private static void ping(Object connector, String domain) throws Exception { Set names = queryAgents(connector); @@ -196,36 +246,54 @@ public final class SonicMfContainerTool private static void restart(Object connector, String domain, String container) throws Exception { String shortName = shortContainer(container); - ObjectName on = resolveAgentObjectName(connector, domain, shortName); + // Zuerst Preferred-ObjectName OHNE queryNames – query kann schon scheitern/irreführen + ObjectName preferred = new ObjectName(domain + "." + shortName + ":ID=AGENT"); + info("PreferredObjectName=" + preferred); + + ObjectName on = preferred; + try + { + ObjectName resolved = resolveAgentObjectName(connector, domain, shortName); + if (resolved != null) + { + on = resolved; + } + } + catch (Throwable t) + { + warn("resolveAgentObjectName: " + rootOf(t).getClass().getName() + ": " + rootOf(t).getMessage() + + " – nutze PreferredObjectName"); + } info("ObjectName=" + on); - dumpOps(connector, on); + dumpOpsSafe(connector, on); - // 1) Remote-JMX invoke (funktioniert mit unbounded client) - if (tryMBeanLifecycle(connector, on, shortName, domain)) + StringBuffer attempts = new StringBuffer(); + + // 1) JMX invoke stop/restart/shutdown (remote / wie SMC) + if (tryMBeanLifecycle(connector, on, shortName, domain, attempts)) { return; } - // 2) Typisierte Proxies (kann unbounded-Fehler werfen) - if (tryAgentProxyLifecycle(connector, on, shortName, domain)) + // 2) IAgentProxy stop/restart + if (tryAgentProxyLifecycle(connector, on, shortName, domain, attempts)) { return; } - // 3) DomainManager / Collector Fallback - if (tryDomainManagerRestart(connector, domain, shortName)) + // 3) Manager-MBeans mit Container-Namen + if (tryManagerContainerOps(connector, domain, shortName, attempts)) { return; } - fail("Kein Neustart-Weg funktioniert (MBean invoke / IAgentProxy / DomainManager). " - + "Siehe INFO:Ops und unbounded-Hinweise oben."); + fail("Kein Neustart-Weg erfolgreich. ToolVersion=" + TOOL_VERSION + "\nAttempts:\n" + attempts.toString()); } - private static boolean tryMBeanLifecycle(Object connector, ObjectName on, String shortName, String domain) + private static boolean tryMBeanLifecycle( + Object connector, ObjectName on, String shortName, String domain, StringBuffer attempts) { - // Reihenfolge: stop zuerst (SMC-Restart = Stop + Auto-Relaunch), dann restart String[] ops = new String[] { "stop", "restart", "shutdown" }; for (int i = 0; i < ops.length; i++) { @@ -234,25 +302,30 @@ public final class SonicMfContainerTool { info("Trying MBean.invoke(" + op + ") on " + on); invokeNoArgs(connector, on, op); - System.out.println("OK:RestartInvoked method=MBean." + op - + " container=" + shortName + " domain=" + domain); - System.out.flush(); + okRestart("MBean." + op, shortName, domain); return true; } catch (Throwable t) { Throwable root = rootOf(t); - warn("MBean." + op + " failed: " + root.getClass().getName() + ": " + root.getMessage()); - if (!isUnbounded(root) && !"stop".equals(op) && !"restart".equals(op) && !"shutdown".equals(op)) + String line = "MBean." + op + " => " + root.getClass().getName() + ": " + root.getMessage(); + warn(line); + attempts.append(line).append('\n'); + + // stop kann die Verbindung reissen – wenn Message darauf hindeutet, als Erfolg werten + if ("stop".equals(op) && looksLikeStopSideEffect(root)) { - // continue trying other ops + warn("Treat stop side-effect as success (agent going down)"); + okRestart("MBean.stop(side-effect)", shortName, domain); + return true; } } } return false; } - private static boolean tryAgentProxyLifecycle(Object connector, ObjectName on, String shortName, String domain) + private static boolean tryAgentProxyLifecycle( + Object connector, ObjectName on, String shortName, String domain, StringBuffer attempts) { try { @@ -272,150 +345,150 @@ public final class SonicMfContainerTool { info("Trying IAgentProxy." + mName); agent.getClass().getMethod(mName).invoke(agent); - System.out.println("OK:RestartInvoked method=IAgentProxy." + mName - + " container=" + shortName + " domain=" + domain); - System.out.flush(); + okRestart("IAgentProxy." + mName, shortName, domain); return true; } catch (Throwable t) { Throwable root = rootOf(t); - warn("IAgentProxy." + mName + " failed: " + root.getClass().getName() + ": " + root.getMessage()); + String line = "IAgentProxy." + mName + " => " + root.getClass().getName() + ": " + root.getMessage(); + warn(line); + attempts.append(line).append('\n'); + if ("stop".equals(mName) && looksLikeStopSideEffect(root)) + { + okRestart("IAgentProxy.stop(side-effect)", shortName, domain); + return true; + } } } } catch (Throwable t) { Throwable root = rootOf(t); - warn("IAgentProxy path failed: " + root.getClass().getName() + ": " + root.getMessage()); + String line = "IAgentProxy path => " + root.getClass().getName() + ": " + root.getMessage(); + warn(line); + attempts.append(line).append('\n'); } return false; } - private static boolean tryDomainManagerRestart(Object connector, String domain, String shortName) + private static boolean tryManagerContainerOps( + Object connector, String domain, String shortName, StringBuffer attempts) { - // Häufige ObjectNames für Domain Manager / Collector String[] candidates = new String[] { domain + ".DomainManager:ID=DomainManager", domain + ".DomainManager:ID=AGENT", - domain + ".dm:ID=AGENT", - domain + ".DOMAIN_MANAGER:ID=AGENT", - domain + ".ManagementFramework:ID=AGENT" + domain + ".dm:ID=AGENT" }; for (int i = 0; i < candidates.length; i++) { try { - ObjectName dm = new ObjectName(candidates[i]); - Set found = (Set) connector.getClass() - .getMethod("queryNames", new Class[] { ObjectName.class, javax.management.QueryExp.class }) - .invoke(connector, new Object[] { dm, null }); + ObjectName pattern = new ObjectName(candidates[i]); + Set found = queryNames(connector, pattern); if (found == null || found.isEmpty()) { continue; } ObjectName real = (ObjectName) found.iterator().next(); - info("DomainManager candidate=" + real); - dumpOps(connector, real); + info("Manager=" + real); + dumpOpsSafe(connector, real); - String[] ops = new String[] { - "restartContainer", "stopContainer", "startContainer", - "restart", "stop", "shutdown" - }; + String[] ops = new String[] { "restartContainer", "stopContainer", "startContainer" }; for (int o = 0; o < ops.length; o++) { - String op = ops[o]; try { - if (op.endsWith("Container")) - { - info("Trying DomainManager." + op + "(\"" + shortName + "\")"); - invokeStringArg(connector, real, op, shortName); - } - else - { - // nur wenn es der Ziel-Container selbst ist - continue; - } - System.out.println("OK:RestartInvoked method=DomainManager." + op - + " container=" + shortName + " domain=" + domain); - System.out.flush(); + info("Trying " + ops[o] + "(\"" + shortName + "\") on " + real); + invokeStringArg(connector, real, ops[o], shortName); + okRestart("Manager." + ops[o], shortName, domain); return true; } catch (Throwable t) { Throwable root = rootOf(t); - warn("DomainManager." + op + " failed: " + root.getClass().getName() + ": " + root.getMessage()); + String line = ops[o] + " => " + root.getClass().getName() + ": " + root.getMessage(); + warn(line); + attempts.append(line).append('\n'); } } } - catch (Throwable ignore) + catch (Throwable t) { - /* try next */ + warn("Manager candidate " + candidates[i] + ": " + rootOf(t).getMessage()); } } - // Alle AGENT-MBeans scannen nach *Container* Ops + // Scan AGENT-MBeans nach Container-Ops try { Set agents = queryAgents(connector); - if (agents != null) + if (agents == null) { - for (Iterator it = agents.iterator(); it.hasNext(); ) + return false; + } + for (Iterator it = agents.iterator(); it.hasNext(); ) + { + ObjectName on = (ObjectName) it.next(); + String jmxDomain = on.getDomain(); + if (jmxDomain == null) { - ObjectName on = (ObjectName) it.next(); - String jmxDomain = on.getDomain(); - if (jmxDomain == null) - { - continue; - } - String lower = jmxDomain.toLowerCase(); - boolean interesting = lower.contains("domainmanager") - || lower.contains(".dm") - || lower.contains("collector") - || lower.contains("host") - || lower.contains("launch"); - if (!interesting) - { - continue; - } - info("Scanning manager agent " + on); - if (tryInvokeContainerOp(connector, on, shortName, domain)) + continue; + } + String lower = jmxDomain.toLowerCase(); + if (!(lower.contains("domainmanager") || lower.contains(".dm") + || lower.contains("collector") || lower.contains("host") + || lower.contains("launch"))) + { + continue; + } + info("Scan manager agent " + on); + dumpOpsSafe(connector, on); + String[] ops = new String[] { "restartContainer", "stopContainer" }; + for (int i = 0; i < ops.length; i++) + { + try { + invokeStringArg(connector, on, ops[i], shortName); + okRestart(ops[i] + "@" + on, shortName, domain); return true; } + catch (Throwable t) + { + attempts.append(ops[i]).append('@').append(on).append(" => ") + .append(rootOf(t).getMessage()).append('\n'); + } } } } catch (Throwable t) { - warn("Manager scan failed: " + rootOf(t).getMessage()); + warn("Manager scan: " + rootOf(t).getMessage()); } - return false; } - private static boolean tryInvokeContainerOp(Object connector, ObjectName on, String shortName, String domain) + private static boolean looksLikeStopSideEffect(Throwable root) { - String[] ops = new String[] { "restartContainer", "stopContainer" }; - for (int i = 0; i < ops.length; i++) + if (root == null || root.getMessage() == null) { - try - { - info("Trying " + on + "." + ops[i] + "(\"" + shortName + "\")"); - invokeStringArg(connector, on, ops[i], shortName); - System.out.println("OK:RestartInvoked method=" + ops[i] - + " on=" + on + " container=" + shortName + " domain=" + domain); - System.out.flush(); - return true; - } - catch (Throwable t) - { - warn(ops[i] + " on " + on + " failed: " + rootOf(t).getMessage()); - } + return false; } - return false; + String m = root.getMessage().toLowerCase(); + return m.indexOf("disconnect") >= 0 + || m.indexOf("closed") >= 0 + || m.indexOf("not connected") >= 0 + || m.indexOf("connection lost") >= 0 + || m.indexOf("broker") >= 0 && m.indexOf("down") >= 0; + } + + private static void okRestart(String method, String shortName, String domain) + { + System.out.println("OK:RestartInvoked method=" + method + + " container=" + shortName + " domain=" + domain + + " tool=" + TOOL_VERSION); + System.out.flush(); } private static void invokeNoArgs(Object connector, ObjectName on, String op) throws Exception @@ -436,26 +509,31 @@ public final class SonicMfContainerTool }); } - private static void dumpOps(Object connector, ObjectName on) + private static void dumpOpsSafe(Object connector, ObjectName on) { try { Method getInfo = connector.getClass().getMethod("getMBeanInfo", new Class[] { ObjectName.class }); - MBeanInfo info = (MBeanInfo) getInfo.invoke(connector, new Object[] { on }); - if (info == null || info.getOperations() == null) + MBeanInfo infoBean = (MBeanInfo) getInfo.invoke(connector, new Object[] { on }); + if (infoBean == null || infoBean.getOperations() == null) { + info("Ops(" + on + ")=(null)"); return; } StringBuffer sb = new StringBuffer(); - MBeanOperationInfo[] ops = info.getOperations(); + MBeanOperationInfo[] ops = infoBean.getOperations(); for (int i = 0; i < ops.length; i++) { String name = ops[i].getName(); String lower = name.toLowerCase(); - if (lower.contains("restart") || lower.contains("stop") || lower.contains("start") - || lower.contains("shutdown") || lower.contains("container")) + if (lower.indexOf("restart") >= 0 || lower.indexOf("stop") >= 0 + || lower.indexOf("start") >= 0 || lower.indexOf("shutdown") >= 0 + || lower.indexOf("container") >= 0) { - if (sb.length() > 0) sb.append(','); + if (sb.length() > 0) + { + sb.append(','); + } sb.append(name); } } @@ -463,26 +541,28 @@ public final class SonicMfContainerTool } catch (Throwable t) { - warn("getMBeanInfo failed: " + rootOf(t).getMessage()); + warn("getMBeanInfo(" + on + "): " + rootOf(t).getClass().getName() + ": " + rootOf(t).getMessage()); } } private static Set queryAgents(Object connector) throws Exception + { + return queryNames(connector, new ObjectName("*:ID=AGENT")); + } + + private static Set queryNames(Object connector, ObjectName pattern) throws Exception { Method query = connector.getClass().getMethod("queryNames", new Class[] { ObjectName.class, javax.management.QueryExp.class }); - return (Set) query.invoke(connector, new Object[] { new ObjectName("*:ID=AGENT"), null }); + return (Set) query.invoke(connector, new Object[] { pattern, null }); } private static ObjectName resolveAgentObjectName(Object connector, String domain, String container) throws Exception { ObjectName preferred = new ObjectName(domain + "." + container + ":ID=AGENT"); - Method query = connector.getClass().getMethod("queryNames", new Class[] { - ObjectName.class, javax.management.QueryExp.class - }); - Set exact = (Set) query.invoke(connector, new Object[] { preferred, null }); + Set exact = queryNames(connector, preferred); if (exact != null && !exact.isEmpty()) { return (ObjectName) exact.iterator().next(); @@ -501,7 +581,6 @@ public final class SonicMfContainerTool } } } - return preferred; } @@ -551,16 +630,10 @@ public final class SonicMfContainerTool } } - private static boolean isUnbounded(Throwable t) - { - String msg = t == null || t.getMessage() == null ? "" : t.getMessage(); - return msg.toLowerCase().indexOf("unbounded") >= 0; - } - private static Throwable rootOf(Throwable t) { Throwable root = t; - while (root.getCause() != null && root.getCause() != root) + while (root != null && root.getCause() != null && root.getCause() != root) { root = root.getCause(); } diff --git a/ZA.CoreService.ESBCertificateManager/ZA.CoreService.ESBCertificateManager.csproj b/ZA.CoreService.ESBCertificateManager/ZA.CoreService.ESBCertificateManager.csproj index cb95dc6..c4ae89c 100644 --- a/ZA.CoreService.ESBCertificateManager/ZA.CoreService.ESBCertificateManager.csproj +++ b/ZA.CoreService.ESBCertificateManager/ZA.CoreService.ESBCertificateManager.csproj @@ -31,7 +31,7 @@ PreserveNewest - PreserveNewest + Always