Implemented agent configuration reading from server
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 4 Jul 2005 14:59:41 +0000 (14:59 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 4 Jul 2005 14:59:41 +0000 (14:59 +0000)
include/nms_cscp.h
include/nxcscpapi.h
src/agent/core/nxagentd.h
src/agent/core/session.cpp
src/install/windows/files.txt
src/install/windows/netxms.iss
src/server/include/nxsrvapi.h
src/server/libnxsrv/agent.cpp
src/server/tools/nxget/nxget.cpp

index 99de1a1..7220902 100644 (file)
@@ -522,6 +522,7 @@ typedef struct
 #define VID_CIPHER                  ((DWORD)156)
 #define VID_KEY_LENGTH              ((DWORD)157)
 #define VID_SESSION_IV              ((DWORD)158)
+#define VID_CONFIG_FILE             ((DWORD)159)
 
 // Variable ranges for object's ACL
 #define VID_ACL_USER_BASE           ((DWORD)0x00001000)
index d3d190d..69d53f1 100644 (file)
@@ -94,9 +94,10 @@ public:
    void SetVariable(DWORD dwVarId, DWORD dwValue) { Set(dwVarId, CSCP_DT_INTEGER, &dwValue); }
    void SetVariable(DWORD dwVarId, QWORD qwValue) { Set(dwVarId, CSCP_DT_INT64, &qwValue); }
    void SetVariable(DWORD dwVarId, double dValue) { Set(dwVarId, CSCP_DT_FLOAT, &dValue); }
-   void SetVariable(DWORD dwVarId, TCHAR *szValue) { Set(dwVarId, CSCP_DT_STRING, szValue); }
+   void SetVariable(DWORD dwVarId, TCHAR *pszValue) { Set(dwVarId, CSCP_DT_STRING, pszValue); }
    void SetVariable(DWORD dwVarId, BYTE *pValue, DWORD dwSize) { Set(dwVarId, CSCP_DT_BINARY, pValue, dwSize); }
    void SetVariableToInt32Array(DWORD dwVarId, DWORD dwNumElements, DWORD *pdwData);
+   BOOL SetVariableFromFile(DWORD dwVarId, TCHAR *pszFileName);
 
    DWORD GetVariableLong(DWORD dwVarId);
    QWORD GetVariableInt64(DWORD dwVarId);
index 15cce67..1756edb 100644 (file)
@@ -228,6 +228,7 @@ private:
    CSCP_ENCRYPTION_CONTEXT *m_pCtx;
 
    void Authenticate(CSCPMessage *pRequest, CSCPMessage *pMsg);
+   void GetConfig(CSCPMessage *pMsg);
    void GetParameter(CSCPMessage *pRequest, CSCPMessage *pMsg);
    void GetList(CSCPMessage *pRequest, CSCPMessage *pMsg);
    void Action(CSCPMessage *pRequest, CSCPMessage *pMsg);
index 6e1c708..f2f328e 100644 (file)
@@ -363,6 +363,12 @@ void CommSession::ProcessingThread(void)
                msg.SetVariable(VID_RCC, ERR_SUCCESS);
                GetParameterList(&msg);
                break;
+            case CMD_GET_AGENT_CONFIG:
+               GetConfig(&msg);
+               break;
+            case CMD_UPDATE_AGENT_CONFIG:
+               msg.SetVariable(VID_RCC, ERR_NOT_IMPLEMENTED);
+               break;
             default:
                // Attempt to process unknown command by subagents
                if (!ProcessCmdBySubAgent(dwCommand, pMsg, &msg))
@@ -585,3 +591,21 @@ DWORD CommSession::Upgrade(CSCPMessage *pRequest)
       return ERR_ACCESS_DENIED;
    }
 }
+
+
+//
+// Get agent's configuration file
+//
+
+void CommSession::GetConfig(CSCPMessage *pMsg)
+{
+   if (m_bInstallationServer)
+   {
+      pMsg->SetVariable(VID_RCC, 
+         pMsg->SetVariableFromFile(VID_CONFIG_FILE, g_szConfigFile) ? ERR_SUCCESS : ERR_IO_FAILURE);
+   }
+   else
+   {
+      pMsg->SetVariable(VID_RCC, ERR_ACCESS_DENIED);
+   }
+}
index 20da541..e1436d5 100644 (file)
@@ -5,3 +5,4 @@ LIBSNMP.DLL
 LIBMYSQL.DLL
 NTWDBLIB.DLL
 LIBPQ.DLL
+LIBEAY32.DLL
index 0def7c5..cfab31a 100644 (file)
@@ -71,6 +71,7 @@ Source: "Files\libsnmp.dll"; DestDir: "{app}\bin"; Flags: ignoreversion; Compone
 Source: "Files\libmysql.dll"; DestDir: "{app}\bin"; Flags: ignoreversion; Components: server\mysql
 Source: "Files\ntwdblib.dll"; DestDir: "{app}\bin"; Flags: ignoreversion; Components: server\mssql
 Source: "Files\libpq.dll"; DestDir: "{app}\bin"; Flags: ignoreversion; Components: server\pgsql
+Source: "Files\libeay.dll"; DestDir: "{app}\bin"; Flags: ignoreversion; Components: base
 
 [Icons]
 Name: "{group}\Alarm Viewer"; Filename: "{app}\bin\nxav.exe"; Components: console
index 4402a5e..5a8a44f 100644 (file)
@@ -227,6 +227,7 @@ public:
    DWORD CheckNetworkService(DWORD *pdwStatus, DWORD dwIpAddr, int iServiceType, WORD wPort = 0, 
                              WORD wProto = 0, TCHAR *pszRequest = NULL, TCHAR *pszResponce = NULL);
    DWORD GetSupportedParameters(DWORD *pdwNumParams, NXC_AGENT_PARAM **ppParamList);
+   DWORD GetConfigFile(TCHAR **ppszConfig, DWORD *pdwSize);
 
    DWORD GetNumDataLines(void) { return m_dwNumDataLines; }
    const TCHAR *GetDataLine(DWORD dwIndex) { return dwIndex < m_dwNumDataLines ? m_ppDataLines[dwIndex] : _T("(error)"); }
index 96109c2..902e1fb 100644 (file)
@@ -949,12 +949,12 @@ DWORD AgentConnection::GetSupportedParameters(DWORD *pdwNumParams, NXC_AGENT_PAR
    DWORD i, dwId, dwRqId, dwResult;
    CSCPMessage msg, *pResponce;
 
-   if (!m_bIsConnected)
-      return ERR_NOT_CONNECTED;
-
    *pdwNumParams = 0;
    *ppParamList = NULL;
 
+   if (!m_bIsConnected)
+      return ERR_NOT_CONNECTED;
+
    dwRqId = m_dwRequestId++;
 
    msg.SetCode(CMD_GET_PARAMETER_LIST);
@@ -962,7 +962,6 @@ DWORD AgentConnection::GetSupportedParameters(DWORD *pdwNumParams, NXC_AGENT_PAR
 
    if (SendMessage(&msg))
    {
-      // Wait up to 90 seconds for results
       pResponce = WaitForMessage(CMD_REQUEST_COMPLETED, dwRqId, m_dwCommandTimeout);
       if (pResponce != NULL)
       {
@@ -1048,3 +1047,70 @@ DWORD AgentConnection::SetupEncryption(RSA *pServerKey)
    return ERR_NOT_IMPLEMENTED;
 #endif
 }
+
+
+//
+// Get configuration file from agent
+//
+
+DWORD AgentConnection::GetConfigFile(TCHAR **ppszConfig, DWORD *pdwSize)
+{
+   DWORD i, dwRqId, dwResult;
+   CSCPMessage msg, *pResponce;
+#ifdef UNICODE
+   BYTE *pBuffer;
+#endif
+
+   *ppszConfig = NULL;
+   *pdwSize = 0;
+
+   if (!m_bIsConnected)
+      return ERR_NOT_CONNECTED;
+
+   dwRqId = m_dwRequestId++;
+
+   msg.SetCode(CMD_GET_AGENT_CONFIG);
+   msg.SetId(dwRqId);
+
+   if (SendMessage(&msg))
+   {
+      pResponce = WaitForMessage(CMD_REQUEST_COMPLETED, dwRqId, m_dwCommandTimeout);
+      if (pResponce != NULL)
+      {
+         dwResult = pResponce->GetVariableLong(VID_RCC);
+         if (dwResult == ERR_SUCCESS)
+         {
+            *pdwSize = pResponce->GetVariableBinary(VID_CONFIG_FILE, NULL, 0);
+            *ppszConfig = (TCHAR *)malloc((*pdwSize + 1) * sizeof(TCHAR));
+#ifdef UNICODE
+            pBuffer = (BYTE *)malloc(*pdwSize + 1);
+            pResponce->GetVariableBinary(VID_CONFIG_FILE, pBuffer, *pdwSize);
+            MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pBuffer, *pdwSize, *ppszConfig, *pdwSize);
+            free(pBuffer);
+#else
+            pResponce->GetVariableBinary(VID_CONFIG_FILE, (BYTE *)(*ppszConfig), *pdwSize);
+#endif
+            (*ppszConfig)[*pdwSize] = 0;
+
+            // We expect text file, so replace all non-printable characters with spaces
+            for(i = 0; i < *pdwSize; i++)
+               if (((*ppszConfig)[i] < _T(' ')) && 
+                   ((*ppszConfig)[i] != _T('\t')) &&
+                   ((*ppszConfig)[i] != _T('\r')) &&
+                   ((*ppszConfig)[i] != _T('\n')))
+                  (*ppszConfig)[i] = _T(' ');
+         }
+         delete pResponce;
+      }
+      else
+      {
+         dwResult = ERR_REQUEST_TIMEOUT;
+      }
+   }
+   else
+   {
+      dwResult = ERR_CONNECTION_BROKEN;
+   }
+
+   return dwResult;
+}
index 2296b1a..2b1d4f4 100644 (file)
@@ -41,6 +41,7 @@
 #define CMD_LIST           1
 #define CMD_CHECK_SERVICE  2
 #define CMD_GET_PARAMS     3
+#define CMD_GET_CONFIG     4
 
 
 //
@@ -153,6 +154,38 @@ static int ListParameters(AgentConnection *pConn)
 
 
 //
+// Get configuration file
+//
+
+static int GetConfig(AgentConnection *pConn)
+{
+   DWORD dwError, dwSize;
+   TCHAR *pszFile;
+
+   dwError = pConn->GetConfigFile(&pszFile, &dwSize);
+   if (dwError == ERR_SUCCESS)
+   {
+      TranslateStr(pszFile, "\r\n", "\n");
+      fputs(pszFile, stdout);
+      if (dwSize > 0)
+      {
+         if (pszFile[dwSize - 1] != '\n')
+            fputc('\n', stdout);
+      }
+      else
+      {
+         fputc('\n', stdout);
+      }
+   }
+   else
+   {
+      printf("%d: %s\n", dwError, AgentErrorCodeToText(dwError));
+   }
+   return (dwError == ERR_SUCCESS) ? 0 : 1;
+}
+
+
+//
 // Startup
 //
 
@@ -175,7 +208,7 @@ int main(int argc, char *argv[])
 
    // Parse command line
    opterr = 1;
-   while((ch = getopt(argc, argv, "a:be:hi:IK:lnp:P:qr:R:s:S:t:vw:")) != -1)
+   while((ch = getopt(argc, argv, "a:bCe:hi:IK:lnp:P:qr:R:s:S:t:vw:")) != -1)
    {
       switch(ch)
       {
@@ -185,6 +218,7 @@ int main(int argc, char *argv[])
                    "   -a <auth>    : Authentication method. Valid methods are \"none\",\n"
                    "                  \"plain\", \"md5\" and \"sha1\". Default is \"none\".\n"
                    "   -b           : Batch mode - get all parameters listed on command line.\n"
+                   "   -C           : Get agent's configuration file\n"
 #ifdef _WITH_ENCRYPTION
                    "   -e <policy>  : Set encryption policy. Possible values are:\n"
                    "                    0 = Encryption disabled;\n"
@@ -249,6 +283,9 @@ int main(int argc, char *argv[])
          case 'I':
             iCommand = CMD_GET_PARAMS;
             break;
+         case 'C':
+            iCommand = CMD_GET_CONFIG;
+            break;
          case 'l':
             iCommand = CMD_LIST;
             break;
@@ -359,7 +396,7 @@ int main(int argc, char *argv[])
    // Check parameter correctness
    if (bStart)
    {
-      if (argc - optind < (((iCommand == CMD_CHECK_SERVICE) || (iCommand == CMD_GET_PARAMS)) ? 1 : 2))
+      if (argc - optind < (((iCommand == CMD_CHECK_SERVICE) || (iCommand == CMD_GET_PARAMS) || (iCommand == CMD_GET_CONFIG)) ? 1 : 2))
       {
          printf("Required argument(s) missing.\nUse nxget -h to get complete command line syntax.\n");
          bStart = FALSE;
@@ -435,6 +472,9 @@ int main(int argc, char *argv[])
                      case CMD_GET_PARAMS:
                         iExitCode = ListParameters(&conn);
                         break;
+                     case CMD_GET_CONFIG:
+                        iExitCode = GetConfig(&conn);
+                        break;
                      default:
                         break;
                   }