From ada6b6ca83383a87e8f5808a1167e1abb66587ca Mon Sep 17 00:00:00 2001 From: Mike Date: Fri, 24 Jul 2026 10:19:29 +0200 Subject: [PATCH] Fallback MfApi restart via MBean stop when IAgentProxy is unbounded. Remote JMS clients cannot call IAgentProxy.restart; use stop/restart invoke like SMC. --- .../Services/SonicManagementClient.cs | 2 + .../Tools/SonicMfContainerTool$Args.class | Bin 1460 -> 1460 bytes .../Tools/SonicMfContainerTool.class | Bin 7413 -> 13185 bytes .../Tools/SonicMfContainerTool.jar | Bin 5450 -> 8212 bytes .../Tools/SonicMfContainerTool.java | 325 +++++++++++++++++- 5 files changed, 310 insertions(+), 17 deletions(-) diff --git a/ZA.CoreService.ESBCertificateManager/Services/SonicManagementClient.cs b/ZA.CoreService.ESBCertificateManager/Services/SonicManagementClient.cs index 6408c34..e349c0c 100644 --- a/ZA.CoreService.ESBCertificateManager/Services/SonicManagementClient.cs +++ b/ZA.CoreService.ESBCertificateManager/Services/SonicManagementClient.cs @@ -359,6 +359,8 @@ public sealed class SonicManagementClient : IDisposable $"- JavaPath={_connection.JavaPath}\n" + "- Dieselben ConnectionUrl/User/Pass wie beim SMC-Login\n" + "SMC-ObjectName Beispiel: proalpha-test.ct-ZADBService:ID=AGENT → ContainerName=ct-ZADBService\n" + + "Hinweis: Bei 'unbounded client connector' nutzt das Tool MBean stop/restart (wie SMC),\n" + + "nicht nur IAgentProxy.restart.\n" + "Hinweis: stopcontainer.bat wird nicht verwendet (SMC-only)."); } diff --git a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool$Args.class b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool$Args.class index 8056dfdd3610fed691a7642775250762c7fad67c..fbb478caa2f85c14dd6e8ee381cff7b7579924e6 100644 GIT binary patch delta 110 zcmdnOy@h)N7YiFx5CaQS)Mfz|HpVcfI0g=;cm_eHLYK0)}3uLWcQFMGPyLN*J~Q)$d`dU^vE9#c+nHn&C22 NEyE3_hRHds9sqVv7!Uve delta 110 zcmdnOy@h)N7YiGsJ_8G*`DOtiD~!>afrHV8L6FgoL735zL6*^pL6y;kL6gyy!HUtH z!IsgJ!IjaAA)L{hA(PREp_+at^Bp0LbVRumAu6 diff --git a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.class b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.class index 955a408ee77d23f631576b746768f4cfa628b08f..52c19d87c32ea871b38b25c8583dc269af441bbb 100644 GIT binary patch literal 13185 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 delta 3162 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 delta 5157 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 F`X7u^+3)}W diff --git a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.java b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.java index 8e6376c..99d1ff5 100644 --- a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.java +++ b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.java @@ -3,6 +3,8 @@ import java.util.Hashtable; import java.util.Iterator; import java.util.Set; +import javax.management.MBeanOperationInfo; +import javax.management.MBeanInfo; import javax.management.ObjectName; /** @@ -12,13 +14,18 @@ import javax.management.ObjectName; * compile classpath. At runtime SonicHome\\lib must provide: * mgmt_client / mfcontext / sonic_Client (etc.) * - * Flow (CX Messenger Management Application API): + * Flow: * Hashtable ConnectionURLs/DefaultUser/DefaultPassword * -> JMSConnectorAddress / JMSConnectorClient.connect - * -> MFProxyFactory.createAgentProxy(connector, ObjectName) - * -> IAgentProxy.restart() + * -> ObjectName {domain}.{container}:ID=AGENT + * -> restart via (in order): + * 1) MBean invoke("restart") / invoke("stop") [remote / unbounded OK] + * 2) IAgentProxy.restart / stop via MFProxyFactory * - * ObjectName: {domain}.{container}:ID=AGENT + * 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. * * Compile: javac --release 8 SonicMfContainerTool.java */ @@ -138,7 +145,7 @@ public final class SonicMfContainerTool } connect.invoke(connector, new Object[] { address, timeoutArg }); - System.out.println("INFO:Connected url=" + url + " user=" + user); + info("Connected url=" + url + " user=" + user); return connector; } @@ -158,6 +165,7 @@ public final class SonicMfContainerTool } } System.out.println("OK:MfApiPing domain=" + domain + " agents=" + matched); + System.out.flush(); } private static void list(Object connector, String domain) throws Exception @@ -179,30 +187,284 @@ public final class SonicMfContainerTool } if (count == 0) { - System.out.println("WARN:KeineAgentContainer Domain=" + domain); + info("KeineAgentContainer Domain=" + domain); } System.out.println("OK:List count=" + count); + System.out.flush(); } private static void restart(Object connector, String domain, String container) throws Exception { String shortName = shortContainer(container); ObjectName on = resolveAgentObjectName(connector, domain, shortName); - System.out.println("INFO:ObjectName=" + on); + info("ObjectName=" + on); - Class factoryCl = Class.forName("com.sonicsw.mf.mgmtapi.runtime.MFProxyFactory"); - Method create = factoryCl.getMethod("createAgentProxy", new Class[] { - Class.forName("com.sonicsw.mf.jmx.client.JMSConnectorClient"), - ObjectName.class + dumpOps(connector, on); + + // 1) Remote-JMX invoke (funktioniert mit unbounded client) + if (tryMBeanLifecycle(connector, on, shortName, domain)) + { + return; + } + + // 2) Typisierte Proxies (kann unbounded-Fehler werfen) + if (tryAgentProxyLifecycle(connector, on, shortName, domain)) + { + return; + } + + // 3) DomainManager / Collector Fallback + if (tryDomainManagerRestart(connector, domain, shortName)) + { + return; + } + + fail("Kein Neustart-Weg funktioniert (MBean invoke / IAgentProxy / DomainManager). " + + "Siehe INFO:Ops und unbounded-Hinweise oben."); + } + + private static boolean tryMBeanLifecycle(Object connector, ObjectName on, String shortName, String domain) + { + // 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++) + { + String op = ops[i]; + try + { + 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(); + 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)) + { + // continue trying other ops + } + } + } + return false; + } + + private static boolean tryAgentProxyLifecycle(Object connector, ObjectName on, String shortName, String domain) + { + try + { + Class factoryCl = Class.forName("com.sonicsw.mf.mgmtapi.runtime.MFProxyFactory"); + Method create = factoryCl.getMethod("createAgentProxy", new Class[] { + Class.forName("com.sonicsw.mf.jmx.client.JMSConnectorClient"), + ObjectName.class + }); + Object agent = create.invoke(null, new Object[] { connector, on }); + info("StateBefore=" + safeState(agent)); + + String[] methods = new String[] { "stop", "restart", "shutdown" }; + for (int i = 0; i < methods.length; i++) + { + String mName = methods[i]; + try + { + 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(); + return true; + } + catch (Throwable t) + { + Throwable root = rootOf(t); + warn("IAgentProxy." + mName + " failed: " + root.getClass().getName() + ": " + root.getMessage()); + } + } + } + catch (Throwable t) + { + Throwable root = rootOf(t); + warn("IAgentProxy path failed: " + root.getClass().getName() + ": " + root.getMessage()); + } + return false; + } + + private static boolean tryDomainManagerRestart(Object connector, String domain, String shortName) + { + // 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" + }; + + 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 }); + if (found == null || found.isEmpty()) + { + continue; + } + ObjectName real = (ObjectName) found.iterator().next(); + info("DomainManager candidate=" + real); + dumpOps(connector, real); + + String[] ops = new String[] { + "restartContainer", "stopContainer", "startContainer", + "restart", "stop", "shutdown" + }; + 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(); + return true; + } + catch (Throwable t) + { + Throwable root = rootOf(t); + warn("DomainManager." + op + " failed: " + root.getClass().getName() + ": " + root.getMessage()); + } + } + } + catch (Throwable ignore) + { + /* try next */ + } + } + + // Alle AGENT-MBeans scannen nach *Container* Ops + try + { + Set agents = queryAgents(connector); + if (agents != null) + { + for (Iterator it = agents.iterator(); it.hasNext(); ) + { + 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)) + { + return true; + } + } + } + } + catch (Throwable t) + { + warn("Manager scan failed: " + rootOf(t).getMessage()); + } + + return false; + } + + private static boolean tryInvokeContainerOp(Object connector, ObjectName on, String shortName, String domain) + { + String[] ops = new String[] { "restartContainer", "stopContainer" }; + for (int i = 0; i < ops.length; i++) + { + 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; + } + + private static void invokeNoArgs(Object connector, ObjectName on, String op) throws Exception + { + Method invoke = connector.getClass().getMethod("invoke", new Class[] { + ObjectName.class, String.class, Object[].class, String[].class }); - Object agent = create.invoke(null, new Object[] { connector, on }); + invoke.invoke(connector, new Object[] { on, op, new Object[0], new String[0] }); + } - String stateBefore = safeState(agent); - System.out.println("INFO:StateBefore=" + stateBefore); + private static void invokeStringArg(Object connector, ObjectName on, String op, String arg) throws Exception + { + Method invoke = connector.getClass().getMethod("invoke", new Class[] { + ObjectName.class, String.class, Object[].class, String[].class + }); + invoke.invoke(connector, new Object[] { + on, op, new Object[] { arg }, new String[] { "java.lang.String" } + }); + } - agent.getClass().getMethod("restart").invoke(agent); - System.out.println("OK:RestartInvoked container=" + shortName + " domain=" + domain - + " stateBefore=" + stateBefore); + private static void dumpOps(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) + { + return; + } + StringBuffer sb = new StringBuffer(); + MBeanOperationInfo[] ops = info.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 (sb.length() > 0) sb.append(','); + sb.append(name); + } + } + info("Ops(" + on + ")=" + (sb.length() == 0 ? "(keine lifecycle)" : sb.toString())); + } + catch (Throwable t) + { + warn("getMBeanInfo failed: " + rootOf(t).getMessage()); + } } private static Set queryAgents(Object connector) throws Exception @@ -289,9 +551,38 @@ 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) + { + root = root.getCause(); + } + return root == null ? t : root; + } + + private static void info(String message) + { + System.out.println("INFO:" + message); + System.out.flush(); + } + + private static void warn(String message) + { + System.out.println("WARN:" + message); + System.out.flush(); + } + private static void fail(String message) { System.err.println("ERROR:" + message); + System.err.flush(); System.exit(2); }