added NXSL function AgentExecuteAction
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 19 Sep 2016 08:23:13 +0000 (11:23 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 19 Sep 2016 08:23:13 +0000 (11:23 +0300)
ChangeLog
src/server/core/nxslext.cpp
src/server/include/nxsrvapi.h
src/server/libnxsrv/agent.cpp
src/server/libnxsrv/isc.cpp
src/smsdrv/nxagent/.cproject
src/smsdrv/nxagent/main.cpp

index f7f4482..293e673 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -20,6 +20,7 @@
 - Built-in superuser account renamed to "system"
 - Default "admin" account now is ordinary member of "Admins" group without built-in privileges
 - New method "enableDiscoveryPolling" in NXSL class "Node"
+- New NXSL function AgentExecuteAction
 - Agent effective user and group can be set in configuration file
 - Agent environment variables can be set in configuration file
 - Added method "getResourceOwner" and attribute "nodes" to NXSL "Cluster" class
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 },
index df2c317..2e72a94 100644 (file)
@@ -554,7 +554,7 @@ public:
    UINT32 nop();
    UINT32 setServerCapabilities();
    UINT32 setServerId(UINT64 serverId);
-   UINT32 execAction(const TCHAR *pszAction, int argc, TCHAR **argv, bool withOutput = false, void (* outputCallback)(ActionCallbackEvent, const TCHAR *, void *) = NULL, void *cbData = NULL);
+   UINT32 execAction(const TCHAR *action, int argc, const TCHAR * const *argv, bool withOutput = false, void (* outputCallback)(ActionCallbackEvent, const TCHAR *, void *) = NULL, void *cbData = NULL);
    UINT32 uploadFile(const TCHAR *localFile, const TCHAR *destinationFile = NULL, void (* progressCallback)(INT64, void *) = NULL, void *cbArg = NULL, NXCPCompressionMethod compMethod = NXCP_COMPRESSION_NONE);
    UINT32 startUpgrade(const TCHAR *pszPkgName);
    UINT32 checkNetworkService(UINT32 *pdwStatus, const InetAddress& addr, int iServiceType, WORD wPort = 0,
index 1272372..54a7a3f 100644 (file)
@@ -1242,7 +1242,7 @@ UINT32 AgentConnection::authenticate(BOOL bProxyData)
 /**
  * Execute action on agent
  */
-UINT32 AgentConnection::execAction(const TCHAR *pszAction, int argc, TCHAR **argv,
+UINT32 AgentConnection::execAction(const TCHAR *action, int argc, const TCHAR * const *argv,
                                    bool withOutput, void (* outputCallback)(ActionCallbackEvent, const TCHAR *, void *), void *cbData)
 {
    NXCPMessage msg(m_nProtocolVersion);
@@ -1255,7 +1255,7 @@ UINT32 AgentConnection::execAction(const TCHAR *pszAction, int argc, TCHAR **arg
    dwRqId = generateRequestId();
    msg.setCode(CMD_ACTION);
    msg.setId(dwRqId);
-   msg.setField(VID_ACTION_NAME, pszAction);
+   msg.setField(VID_ACTION_NAME, action);
    msg.setField(VID_RECEIVE_OUTPUT, (UINT16)(withOutput ? 1 : 0));
    msg.setField(VID_NUM_ARGS, (UINT32)argc);
    for(i = 0; i < argc; i++)
index 8d5ce42..8bf2e25 100644 (file)
@@ -86,6 +86,7 @@ ISC::ISC()
        m_commandTimeout = 10000;       // 10 seconds
    m_mutexDataLock = MutexCreate();
        m_socketLock = MutexCreate();
+       m_protocolVersion = NXCP_VERSION;
 }
 
 /**
@@ -105,6 +106,7 @@ ISC::ISC(const InetAddress& addr, WORD port)
        m_commandTimeout = 10000;       // 10 seconds
    m_mutexDataLock = MutexCreate();
        m_socketLock = MutexCreate();
+   m_protocolVersion = NXCP_VERSION;
 }
 
 /**
index 1782541..19ed561 100644 (file)
@@ -5,12 +5,12 @@
                        <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.base.1704123163" moduleId="org.eclipse.cdt.core.settings" name="Default">
                                <externalSettings/>
                                <extensions>
+                                       <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
                                        <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
                                        <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
                                        <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
                                        <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
                                        <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-                                       <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
                                </extensions>
                        </storageModule>
                        <storageModule moduleId="cdtBuildSystem" version="4.0.0">
index 7abd915..7cce917 100644 (file)
@@ -87,10 +87,7 @@ extern "C" bool EXPORT SMSDriverSend(const TCHAR *pszPhoneNumber, const TCHAR *p
                conn->setCommandTimeout(m_timeout);
       if (conn->connect())
       {
-                       TCHAR *argv[2];
-
-                       argv[0] = (TCHAR *)pszPhoneNumber;
-                       argv[1] = (TCHAR *)pszText;
+                       const TCHAR *argv[2] = { pszPhoneNumber, pszText };
                        UINT32 rcc = conn->execAction(_T("SMS.Send"), 2, argv);
                        nxlog_debug(4, _T("nxagent.sms: agent action execution result: %d (%s)"), rcc, AgentErrorCodeToText(rcc));
          if (rcc == ERR_SUCCESS)