Initial version of administrator command-line tool [Victor]
authorVictor Kirhenshtein <victor@netxms.org>
Tue, 20 Jan 2004 08:43:07 +0000 (08:43 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Tue, 20 Jan 2004 08:43:07 +0000 (08:43 +0000)
.gitattributes
src/server/tools/nxadm/comm.cpp [new file with mode: 0644]
src/server/tools/nxadm/nxadm.cpp [new file with mode: 0644]
src/server/tools/nxadm/nxadm.dsp [new file with mode: 0644]
src/server/tools/nxadm/nxadm.dsw [new file with mode: 0644]
src/server/tools/nxadm/nxadm.h [new file with mode: 0644]

index 019b4c8..3a6894b 100644 (file)
@@ -59,4 +59,9 @@ src/server/dbdrv/pgsql/pgsql.dsw -text
 src/server/dbdrv/pgsql/pgsqldrv.h -text
 src/server/include/dbdrv.h -text
 src/server/include/nms_threads.h -text
+src/server/tools/nxadm/comm.cpp -text
+src/server/tools/nxadm/nxadm.cpp -text
+src/server/tools/nxadm/nxadm.dsp -text
+src/server/tools/nxadm/nxadm.dsw -text
+src/server/tools/nxadm/nxadm.h -text
 tools/mc.pl -text
diff --git a/src/server/tools/nxadm/comm.cpp b/src/server/tools/nxadm/comm.cpp
new file mode 100644 (file)
index 0000000..b225a28
--- /dev/null
@@ -0,0 +1,165 @@
+/* 
+** NetXMS - Network Management System
+** Local administration tool
+** Copyright (C) 2003, 2004 Victor Kirhenshtein
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: comm.cpp
+**
+**/
+
+#include "nxadm.h"
+
+
+//
+// Global data
+//
+
+SOCKET g_hSocket = -1;
+
+
+//
+// Connect to server
+//
+
+BOOL Connect(void)
+{
+   struct sockaddr_in sa;
+
+   // Create socket
+   g_hSocket = socket(AF_INET, SOCK_STREAM, 0);
+   if (g_hSocket == -1)
+   {
+      printf("Error creating socket\n");
+      return FALSE;
+   }
+
+   // Fill in address structure
+   memset(&sa, 0, sizeof(sa));
+   sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+   sa.sin_family = AF_INET;
+   sa.sin_port = htons(LOCAL_ADMIN_PORT);
+
+   // Connect to server
+   if (connect(g_hSocket, (struct sockaddr *)&sa, sizeof(sa)) == -1)
+   {
+      printf("Cannot establish connection with server\n");
+      closesocket(g_hSocket);
+      g_hSocket = -1;
+      return FALSE;
+   }
+
+   return TRUE;
+}
+
+
+//
+// Disconnect from server
+//
+
+void Disconnect(void)
+{
+   if (g_hSocket != -1)
+   {
+      shutdown(g_hSocket, 2);
+      closesocket(g_hSocket);
+      g_hSocket = -1;
+   }
+}
+
+
+//
+// Send command to server
+//
+
+BOOL SendCommand(WORD wCmd)
+{
+   return send(g_hSocket, (char *)&wCmd, sizeof(WORD), 0) == sizeof(WORD);
+}
+
+
+//
+// Receive responce from server
+//
+
+WORD RecvResponce(void)
+{
+   WORD wResp;
+
+   return (recv(g_hSocket, (char *)&wResp, sizeof(WORD), 0) == sizeof(WORD)) ? wResp : LA_RESP_ERROR;
+}
+
+
+//
+// Send string to server
+//
+
+BOOL SendString(char *szString)
+{
+   WORD wLen;
+
+   wLen = strlen(szString);
+   if (send(g_hSocket, (char *)&wLen, sizeof(WORD), 0) != 2)
+      return FALSE;
+
+   return send(g_hSocket, szString, wLen, 0) == wLen;
+}
+
+
+//
+// Receive string from client
+//
+
+int RecvString(char *pBuffer, int iBufSize)
+{
+   int iError;
+   WORD wSize = 0;
+
+   // Receive string length
+   iError = recv(g_hSocket, (char *)&wSize, 2, 0);
+
+   if (wSize == 0xFFFF)
+      return 1;   // Server responds with an error instead of string
+
+   if ((iError != 2) || (wSize > iBufSize - 1))
+      return -1;  // Comm error
+
+   iError = recv(g_hSocket, pBuffer, wSize, 0);
+   if (iError != wSize)
+      return -1;
+   pBuffer[iError] = 0;
+   return 0;
+}
+
+
+//
+// Receive double word from server
+//
+
+BOOL RecvDWord(DWORD *pBuffer)
+{
+   return recv(g_hSocket, (char *)pBuffer, sizeof(DWORD), 0) == sizeof(DWORD);
+}
+
+
+//
+// Send double word to server
+//
+
+BOOL SendDWord(DWORD dwValue)
+{
+   return send(g_hSocket, (char *)&dwValue, sizeof(DWORD), 0) == sizeof(DWORD);
+}
diff --git a/src/server/tools/nxadm/nxadm.cpp b/src/server/tools/nxadm/nxadm.cpp
new file mode 100644 (file)
index 0000000..54a51d0
--- /dev/null
@@ -0,0 +1,254 @@
+/* 
+** NetXMS - Network Management System
+** Local administration tool
+** Copyright (C) 2003, 2004 Victor Kirhenshtein
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: nxadm.cpp
+**
+**/
+
+#include "nxadm.h"
+
+
+//
+// Display help
+//
+
+static void Help(void)
+{
+   printf("NetXMS Administartor Tool  Version 1.0\n"
+          "Copyright (c) 2004 NetXMS Development Team\n\n"
+          "Usage: nxadm <command> [<command-specific arguments>]\n\n"
+          "Possible commands are:\n"
+          "   cfg   : Manage configuration variables\n"
+          "   flags : Manage application flags\n"
+          "   help  : Get more specific help\n"
+          "\n");
+}
+
+
+//
+// Handler for "cfg" command
+//
+
+static int H_Config(int argc, char *argv[])
+{
+   int iError = 2;   // Default is communication error
+
+   if (argc == 0)
+   {
+      printf("Usage: nxadm cfg <command>\n\n"
+             "Valid commands are:\n"
+             "   list              : Enumerate all configuration variables\n"
+             "   get <var>         : Get value of specific variable\n"
+             "   set <var> <value> : Set value of specific variable\n");
+      return 1;
+   }
+
+   if (!stricmp(argv[0], "get"))
+   {
+      if (argc == 1)
+      {
+         printf("ERROR: Variable name missing\n");
+         iError = 1;
+      }
+      else
+      {
+         if (SendCommand(LA_CMD_GET_CONFIG))
+            if (SendString(argv[1]))
+            {
+               int iCode;
+               char szBuffer[256];
+
+               iCode = RecvString(szBuffer, 256);
+               switch(iCode)
+               {
+                  case 0:     // OK
+                     printf("%s\n", szBuffer);
+                     iError = 0;
+                     break;
+                  case 1:
+                     printf("ERROR: Variable %s doesn't exist\n", argv[1]);
+                     iError = 3;
+                     break;
+                  default:
+                     break;
+               }
+            }
+      }
+   }
+   else if (!stricmp(argv[0], "set"))
+   {
+      if (argc < 3)
+      {
+         printf("ERROR: Variable name or value missing\n");
+         iError = 1;
+      }
+      else
+      {
+         if (SendCommand(LA_CMD_SET_CONFIG))
+            if (SendString(argv[1]))
+               if (SendString(argv[2]))
+               {
+                  if (RecvResponce() == LA_RESP_SUCCESS)
+                  {
+                     printf("Successful\n");
+                     iError = 0;
+                  }
+                  else
+                  {
+                     printf("ERROR: Server was unable to set configuration variable\n");
+                     iError = 3;
+                  }
+               }
+      }
+   }
+   else
+   {
+      printf("ERROR: Invalid command syntax\n");
+      iError = 1;
+   }
+   if (iError == 2)
+      printf("ERROR: Client-server communication failed\n");
+   return iError;
+}
+
+
+//
+// Handler for "flags" command
+//
+
+static int H_Flags(int argc, char *argv[])
+{
+   int iError = 2;   // Default is communication error
+
+   if (argc == 0)
+   {
+      printf("Usage: nxadm flags <command>\n\n"
+             "Valid commands are:\n"
+             "   get        : Get current application flags value\n"
+             "   set<value> : Set application flags\n");
+      return 1;
+   }
+
+   if (!stricmp(argv[0], "get"))
+   {
+      DWORD dwFlags;
+
+      if (SendCommand(LA_CMD_GET_FLAGS))
+         if (RecvDWord(&dwFlags))
+         {
+            printf("Current flags: 0x%08X\n", dwFlags);
+            iError = 0;
+         }
+   }
+   else if (!stricmp(argv[0], "set"))
+   {
+      if (argc == 1)
+      {
+         printf("ERROR: New flags value missing\n");
+         iError = 1;
+      }
+      else
+      {
+         DWORD dwFlags;
+         char *eptr;
+
+         dwFlags = strtoul(argv[1], &eptr, 0);
+         if (*eptr != 0)
+         {
+            printf("ERROR: Invalid numeric format\n");
+            iError = 1;
+         }
+         else
+         {
+            if (SendCommand(LA_CMD_SET_FLAGS))
+               if (SendDWord(dwFlags))
+                  if (RecvResponce() == LA_RESP_SUCCESS)
+                  {
+                     printf("Successful\n");
+                     iError = 0;
+                  }
+         }
+      }
+   }
+   else
+   {
+      printf("ERROR: Invalid command syntax\n");
+      iError = 1;
+   }
+   if (iError == 2)
+      printf("ERROR: Client-server communication failed\n");
+   return iError;
+}
+
+
+//
+// Entry point
+//
+
+int main(int argc, char *argv[])
+{
+   int iError;
+   static struct
+   {
+      char szName[16];
+      int (* pHandler)(int, char *[]);
+   } cmdList[] = 
+   {
+      { "cfg", H_Config },
+      { "flags", H_Flags },
+      { "", NULL }
+   };
+
+   if (argc > 1)
+   {
+#ifdef _WIN32
+      WSADATA wsaData;
+
+      WSAStartup(0x0002, &wsaData);
+#endif
+
+      if (Connect())
+      {
+         int i;
+
+         for(i = 0; cmdList[i].pHandler != NULL; i++)
+            if (!stricmp(cmdList[i].szName, argv[1]))
+            {
+               iError = cmdList[i].pHandler(argc - 2, &argv[2]);
+               break;
+            }
+         if (cmdList[i].pHandler == NULL)
+         {
+            Help();
+            iError = 1;
+         }
+         Disconnect();
+      }
+      else
+      {
+         iError = 2;
+      }
+   }
+   else
+   {
+      Help();
+      iError = 1;
+   }
+   return iError;
+}
diff --git a/src/server/tools/nxadm/nxadm.dsp b/src/server/tools/nxadm/nxadm.dsp
new file mode 100644 (file)
index 0000000..bc90fc8
--- /dev/null
@@ -0,0 +1,118 @@
+# Microsoft Developer Studio Project File - Name="nxadm" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=nxadm - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "nxadm.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "nxadm.mak" CFG="nxadm - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "nxadm - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "nxadm - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "nxadm - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "..\..\include" /I "..\..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /subsystem:console /machine:I386
+
+!ELSEIF  "$(CFG)" == "nxadm - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ  /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\include" /I "..\..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ  /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "nxadm - Win32 Release"
+# Name "nxadm - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\comm.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\nxadm.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\include\local_admin.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\include\nms_common.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\nxadm.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/src/server/tools/nxadm/nxadm.dsw b/src/server/tools/nxadm/nxadm.dsw
new file mode 100644 (file)
index 0000000..3af6aff
--- /dev/null
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "nxadm"=.\nxadm.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/src/server/tools/nxadm/nxadm.h b/src/server/tools/nxadm/nxadm.h
new file mode 100644 (file)
index 0000000..994169f
--- /dev/null
@@ -0,0 +1,52 @@
+/* 
+** NetXMS - Network Management System
+** Local administration tool
+** Copyright (C) 2003, 2004 Victor Kirhenshtein
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: nxadm.h
+**
+**/
+
+#ifndef _nxadm_h_
+#define _nxadm_h_
+
+#include <stdio.h>
+#include <nms_common.h>
+#include <local_admin.h>
+
+
+//
+// Functions
+//
+
+BOOL Connect(void);
+void Disconnect(void);
+BOOL SendString(char *szString);
+int RecvString(char *pBuffer, int iBufSize);
+BOOL SendCommand(WORD wCmd);
+WORD RecvResponce(void);
+BOOL RecvDWord(DWORD *pBuffer);
+BOOL SendDWord(DWORD dwValue);
+
+
+//
+// Global variables
+//
+
+extern SOCKET g_hSocket;
+
+#endif