Agent Actions parameters not working

Started by vlad.fratila, September 02, 2014, 01:06:48 PM

Previous topic - Next topic

vlad.fratila

I am trying to call an action from an agent with a parameter. I defined the action in the agent's config file like this:

ActionShellExec = Echo: /tmp/script.sh $1
The script only echo's it's first parameter to a file.

I am trying to call the action from an Action Object Tool.
If I define "Agent's Action" as: Echo, it works and I get in agent's log file with debug level 9 the following:

[02-Sep-2014 09:48:19.708] [DEBUG] [session:1] Message dump:
  ** 00430000000000380000000200000002
  ** 00000057010000000000000800450063
  ** 0068006F6E205B3200000058007FF229
  ** 0000000000000000
  ** code=0x0043 (CMD_ACTION) flags=0x0000 id=2 size=56 numFields=2
  ** [    87] STRING "Echo"
  ** [    88] INT32  0

[02-Sep-2014 09:48:19.708] [DEBUG] [session:1] Received message CMD_ACTION
[02-Sep-2014 09:48:19.708] [DEBUG] Executing action Echo of type 3
[02-Sep-2014 09:48:19.708] [DEBUG] SH_EXEC: Expanding command "/tmp/script.sh"
[02-Sep-2014 09:48:19.708] [DEBUG] SH_EXEC: Executing "/tmp/script.sh"
[02-Sep-2014 09:48:19.714] [DEBUG] [session:1] Sending message CMD_REQUEST_COMPLETED (size 32)
[02-Sep-2014 09:48:19.715] [DEBUG] [session:1] Session with 10.20.1.7 closed


But if I define "Agent's Action" as: Echo parameter1, it fails with a communication failure.
The log looks like this:

[02-Sep-2014 09:51:59.670] [DEBUG] [session:1] Message dump:
  ** 00430000000000500000000200000002
  ** 00000057010000000000001E00450063
  ** 0068006F00200070006100720061006D
  ** 0065007400650072003100004C000000
  ** 00000058007F00000000000041006700
  ** code=0x0043 (CMD_ACTION) flags=0x0000 id=2 size=80 numFields=2
  ** [    87] STRING "Echo parameter1"
  ** [    88] INT32  0

[02-Sep-2014 09:51:59.670] [DEBUG] [session:1] Received message CMD_ACTION
[02-Sep-2014 09:51:59.670] [DEBUG] [session:1] Sending message CMD_REQUEST_COMPLETED (size 32)
[02-Sep-2014 09:51:59.671] [DEBUG] [session:1] Session with 10.20.1.7 closed


This happens in version 1.2.14 and 1.2.16 also.

Thank you,
Vlad

Victor Kirhenshtein

Yes, actually actions in object tools does not support parameters. Entire string interpreted as action name. I'll register this as a bug.

Best regards,
Victor

Benjamin Dill

I've fixed this. After I fixed it I found out that the server doesn't pass the parameters to the agent, so I had to fix this to.
And while I were at it I also added a dialog for passing parameters when invoking the action when (*) is used in action name  :)

Victor, can I provide you the code in any way or do want to fix it yourself?

Best whishes,
Ben

Benjamin Dill

--- "a/C:\\Users\\VS2005\\AppData\\Local\\Temp\\TortoiseGit\\ses76AB.tmp\\session-b45e65c-left.cpp"
+++ "b/C:\\Code\\netxms-v1.2.16\\src\\server\\core\\session.cpp"
@@ -7269,7 +7269,15 @@ void ClientSession::executeAction(CSCPMessage *pRequest)
             if (pConn != NULL)
             {
                pRequest->GetVariableStr(VID_ACTION_NAME, szAction, MAX_PARAM_NAME);
-               dwResult = pConn->execAction(szAction, 0, NULL);
+    int argc = pRequest->getFieldAsInt32(VID_NUM_ARGS);
+    TCHAR **argv = new TCHAR*[argc];
+    for (int i = 0; i < argc; i++)
+    {
+    argv[i] = new TCHAR[256];
+    pRequest->GetVariableStr(VID_ACTION_ARG_BASE + i, argv[i], 256);
+    }
+               dwResult = pConn->execAction(szAction, argc, argv);
+    free(argv);

                switch(dwResult)
                {


--- "a/C:\\Users\\VS2005\\AppData\\Local\\Temp\\TortoiseGit\\NXC2518.tmp\\NXCSession-b45e65c-left.java"
+++ "b/C:\\Code\\netxms-v1.2.16\\src\\java\\netxms-client\\src\\main\\java\\org\\netxms\\client\\NXCSession.java"
@@ -4408,14 +4408,21 @@ public NetworkMapPage queryLayer2Topology(final long nodeId) throws IOException,
     *
     * @param nodeId Node object ID
     * @param action Action name
+    * @param args Action arguments
     * @throws IOException  if socket I/O error occurs
     * @throws NXCException if NetXMS server returns an error or operation was timed out
     */
-   public void executeAction(final long nodeId, final String action) throws IOException, NXCException
+   public void executeAction(final long nodeId, final String action, String[] args) throws IOException, NXCException
    {
       NXCPMessage msg = newMessage(NXCPCodes.CMD_EXECUTE_ACTION);
       msg.setVariableInt32(NXCPCodes.VID_OBJECT_ID, (int) nodeId);
       msg.setVariable(NXCPCodes.VID_ACTION_NAME, action);
+      if (args != null)
+      {
+       msg.setVariableInt32(NXCPCodes.VID_NUM_ARGS, args.length);
+       for (int i=0; i<args.length; i++)
+       msg.setVariable(NXCPCodes.VID_ACTION_ARG_BASE + i, args[i]);
+      }
       sendMessage(msg);
       waitForRCC(msg.getMessageId());
    }


--- "a/C:\\Users\\VS2005\\AppData\\Local\\Temp\\TortoiseGit\\Obj1C3B.tmp\\ObjectToolExecutor-b45e65c-left.java"
+++ "b/C:\\Code\\netxms-v1.2.16\\src\\java\\netxms-eclipse\\ObjectTools\\src\\org\\netxms\\ui\\eclipse\\objecttools\\api\\ObjectToolExecutor.java"
@@ -173,8 +173,30 @@ private static void executeTableTool(final NodeInfo node, final ObjectTool tool)
     */
    private static void executeAgentAction(final NodeInfo node, final ObjectTool tool)
    {
-      final NXCSession session = (NXCSession)ConsoleSharedData.getSession();
-      final String action = substituteMacros(tool.getData(), node);
+   final NXCSession session = (NXCSession)ConsoleSharedData.getSession();
+   String _action = substituteMacros(tool.getData(), node);
+  
+   if (_action.endsWith("(*)"))
+   {
+ InputDialog dlg = new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.get().ObjectToolsDynamicMenu_Information, "Parameter", "", null); //$NON-NLS-1$
+ if (dlg.open() != Window.OK)
+ return;
+
+ _action = _action.replace("(*)", "(" + dlg.getValue() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+   }
+      
+      String[] _args = null;
+      if (_action.indexOf('(') > 0)
+      {
+      String a = _action.substring(_action.indexOf('(') + 1, _action.length() - 1);
+      _args = a.split(",");
+      for (int i = 0; i < _args.length; i++) _args[i] = _args[i].trim();
+      _action = _action.substring(0, _action.indexOf('(') + 1) + "*)";
+      }
+      final String action = _action;
+      final String[] args = _args;
+     
       new ConsoleJob(String.format(Messages.get().ObjectToolsDynamicMenu_ExecuteOnNode, node.object.getObjectName()), null, Activator.PLUGIN_ID, null) {
          @Override
          protected String getErrorMessage()
@@ -185,7 +207,7 @@ protected String getErrorMessage()
          @Override
          protected void runInternal(IProgressMonitor monitor) throws Exception
          {
-            session.executeAction(node.object.getObjectId(), action);
+            session.executeAction(node.object.getObjectId(), action, args);
             runInUIThread(new Runnable() {
                @Override
                public void run()