added NXSL function AgentExecuteAction
[public/netxms.git] / src / server / core / nxslext.cpp
index 4a08edf..af116d0 100644 (file)
@@ -1212,6 +1212,51 @@ static int F_SNMPWalk(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_V
        return 0;
 }
 
+/**
+ * Execute agent action
+ * Syntax:
+ *    AgentExecuteAction(object, name, ...)
+ * where:
+ *     object - NetXMS node object
+ *     name   - name of the parameter
+ * Return value:
+ *     paramater's value on success and null on failure
+ */
+static int F_AgentExecuteAction(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_VM *vm)
+{
+   if (argc < 2)
+      return NXSL_ERR_INVALID_ARGUMENT_COUNT;
+
+   if (!argv[0]->isObject())
+      return NXSL_ERR_NOT_OBJECT;
+
+   for(int i = 1; i < argc; i++)
+      if (!argv[i]->isString())
+         return NXSL_ERR_NOT_STRING;
+
+   NXSL_Object *object = argv[0]->getValueAsObject();
+   if (_tcscmp(object->getClass()->getName(), g_nxslNodeClass.getName()))
+      return NXSL_ERR_BAD_CLASS;
+
+   Node *node = (Node *)object->getData();
+   AgentConnection *conn = node->createAgentConnection();
+   if (conn != NULL)
+   {
+      const TCHAR *args[128];
+      for(int i = 2; (i < argc) && (i < 128); i++)
+         args[i - 2] = argv[i]->getValueAsCString();
+      UINT32 rcc = conn->execAction(argv[1]->getValueAsCString(), argc - 2, args, false, NULL, NULL);
+      *ppResult = new NXSL_Value((rcc == ERR_SUCCESS) ? 1 : 0);
+      conn->decRefCount();
+      nxlog_debug(5, _T("NXSL: F_AgentExecuteAction: action %s on node %s [%d]: RCC=%d"), argv[1]->getValueAsCString(), node->getName(), node->getId(), rcc);
+   }
+   else
+   {
+      *ppResult = new NXSL_Value(0);
+   }
+   return 0;
+}
+
 /**
  * Read parameter's value from agent
  * Syntax:
@@ -1404,6 +1449,7 @@ static NXSL_ExtFunction m_nxslServerFunctions[] =
 {
        { _T("map"), F_map, -1 },
    { _T("mapList"), F_mapList, -1 },
+   { _T("AgentExecuteAction"), F_AgentExecuteAction, -1 },
        { _T("AgentReadList"), F_AgentReadList, 2 },
        { _T("AgentReadParameter"), F_AgentReadParameter, 2 },
        { _T("AgentReadTable"), F_AgentReadTable, 2 },