Configuration poller code added (unfinished)
authorVictor Kirhenshtein <victor@netxms.org>
Fri, 7 Nov 2003 16:04:48 +0000 (16:04 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Fri, 7 Nov 2003 16:04:48 +0000 (16:04 +0000)
src/server/core/main.cpp
src/server/core/nms_events.h
src/server/core/nms_objects.h
src/server/core/node.cpp
src/server/core/status.cpp

index 18bb54d..d060b10 100644 (file)
@@ -35,6 +35,7 @@ void DiscoveryThread(void *arg);
 void Syncer(void *arg);
 void NodePoller(void *arg);
 void StatusPoller(void *arg);
+void ConfigurationPoller(void *arg);
 void EventProcessor(void *arg);
 
 
@@ -48,6 +49,7 @@ char g_szLogFile[MAX_PATH] = DEFAULT_LOG_FILE;
 DB_HANDLE g_hCoreDB = 0;
 DWORD g_dwDiscoveryPollingInterval;
 DWORD g_dwStatusPollingInterval;
+DWORD g_dwConfigurationPollingInterval;
 
 
 //
@@ -82,8 +84,9 @@ BOOL SleepAndCheckForShutdown(int iSeconds)
 
 static void LoadGlobalConfig()
 {
-   g_dwDiscoveryPollingInterval = ConfigReadInt("DiscoveryPollingInterval", 3600);
+   g_dwDiscoveryPollingInterval = ConfigReadInt("DiscoveryPollingInterval", 900);
    g_dwStatusPollingInterval = ConfigReadInt("StatusPollingInterval", 60);
+   g_dwConfigurationPollingInterval = ConfigReadInt("ConfigurationPollingInterval", 3600);
 }
 
 
index b307108..869e7bc 100644 (file)
 #define EVENT_NODE_CRITICAL      10
 #define EVENT_NODE_UNKNOWN       11
 #define EVENT_NODE_UNMANAGED     12
+#define EVENT_NODE_FLAGS_CHANGED 13
+#define EVENT_SNMP_FAIL          14
+#define EVENT_AGENT_FAIL         15
+#define EVENT_INTERFACE_DELETED  16
 
 
 //
index 7c45ba5..e4223d4 100644 (file)
@@ -32,6 +32,7 @@
 
 extern DWORD g_dwDiscoveryPollingInterval;
 extern DWORD g_dwStatusPollingInterval;
+extern DWORD g_dwConfigurationPollingInterval;
 
 
 //
@@ -267,6 +268,9 @@ protected:
    char m_szObjectId[MAX_OID_LEN * 4];
    time_t m_tLastDiscoveryPoll;
    time_t m_tLastStatusPoll;
+   time_t m_tLastConfigurationPoll;
+   int m_iSnmpAgentFails;
+   int m_iNativeAgentFails;
 
 public:
    Node();
@@ -302,6 +306,8 @@ public:
    void SetDiscoveryPollTimeStamp(void) { m_tLastDiscoveryPoll = time(NULL); }
    BOOL ReadyForStatusPoll(void) { return (DWORD)time(NULL) - (DWORD)m_tLastStatusPoll > g_dwStatusPollingInterval ? TRUE : FALSE; }
    void StatusPoll(void);
+   BOOL ReadyForConfigurationPoll(void) { return (DWORD)time(NULL) - (DWORD)m_tLastConfigurationPoll > g_dwConfigurationPollingInterval ? TRUE : FALSE; }
+   void ConfigurationPoll(void);
 
    virtual void CalculateCompoundStatus(void);
 };
index 5b2151d..afdab5b 100644 (file)
@@ -41,6 +41,9 @@ Node::Node()
    m_szObjectId[0] = 0;
    m_tLastDiscoveryPoll = 0;
    m_tLastStatusPoll = 0;
+   m_tLastConfigurationPoll = 0;
+   m_iSnmpAgentFails = 0;
+   m_iNativeAgentFails = 0;
 }
 
 
@@ -64,6 +67,9 @@ Node::Node(DWORD dwAddr, DWORD dwFlags, DWORD dwDiscoveryFlags)
    m_szObjectId[0] = 0;
    m_tLastDiscoveryPoll = 0;
    m_tLastStatusPoll = 0;
+   m_tLastConfigurationPoll = 0;
+   m_iSnmpAgentFails = 0;
+   m_iNativeAgentFails = 0;
 }
 
 
@@ -473,3 +479,75 @@ void Node::StatusPoll(void)
    CalculateCompoundStatus();
    m_tLastStatusPoll = time(NULL);
 }
+
+
+//
+// Perform configuration poll on node
+//
+
+void Node::ConfigurationPoll(void)
+{
+   DWORD dwOldFlags = m_dwFlags;
+   AgentConnection *pAgentConn;
+   INTERFACE_LIST *pIfList;
+
+   // Check node's capabilities
+   if (SnmpGet(m_dwIpAddr, m_szCommunityString, ".1.3.6.1.2.1.1.2.0", NULL, 0, m_szObjectId, MAX_OID_LEN * 4))
+   {
+      m_dwFlags |= NF_IS_SNMP;
+      m_iSnmpAgentFails = 0;
+   }
+   else
+   {
+      if (m_iSnmpAgentFails == 0)
+         PostEvent(EVENT_SNMP_FAIL, m_dwId, NULL);
+      m_iSnmpAgentFails++;
+   }
+
+   pAgentConn = new AgentConnection(m_dwIpAddr, m_wAgentPort, m_wAuthMethod, m_szSharedSecret);
+   if (pAgentConn->Connect())
+   {
+      m_dwFlags |= NF_IS_NATIVE_AGENT;
+      m_iNativeAgentFails = 0;
+   }
+   else
+   {
+      if (m_iNativeAgentFails == 0)
+         PostEvent(EVENT_AGENT_FAIL, m_dwId, NULL);
+      m_iNativeAgentFails++;
+   }
+
+   // Generate event if node flags has been changed
+   if (dwOldFlags != m_dwFlags)
+      PostEvent(EVENT_NODE_FLAGS_CHANGED, m_dwId, "xx", dwOldFlags, m_dwFlags);
+
+   // Retrieve interface list
+   pIfList = GetInterfaceList();
+   if (pIfList != NULL)
+   {
+      DWORD i;
+
+      // Find non-existing interfaces
+      for(i = 0; i < m_dwChildCount; i++)
+         if (m_pChildList[i]->Type() == OBJECT_INTERFACE)
+         {
+            Interface *pInterface = (Interface *)m_pChildList[i];
+            int j;
+
+            for(j = 0; j < pIfList->iNumEntries; j++)
+               if ((pIfList->pInterfaces[j].dwIndex == pInterface->IfIndex()) &&
+                   (pIfList->pInterfaces[j].dwIpAddr == pInterface->IpAddr()) &&
+                   (pIfList->pInterfaces[j].dwIpNetMask == pInterface->IpNetMask()))
+                  break;
+            if (j == pIfList->iNumEntries)
+            {
+               // No such interface in current configuration, delete it
+               PostEvent(EVENT_INTERFACE_DELETED, m_dwId, "dsaa", pInterface->IfIndex(),
+                         pInterface->Name(), pInterface->IpAddr(), pInterface->IpNetMask());
+               pInterface->Delete();
+               i = 0;   // Restart loop
+            }
+         }
+
+   }
+}
index 0457859..3a66eb3 100644 (file)
@@ -45,3 +45,27 @@ void StatusPoller(void *arg)
       }
    }
 }
+
+
+//
+// Configuration poll thread
+//
+
+void ConfigurationPoller(void *arg)
+{
+   Node *pNode;
+
+   while(!ShutdownInProgress())
+   {
+      if (SleepAndCheckForShutdown(30))
+         break;      // Shutdown has arrived
+
+      // Walk through nodes and do configuration poll
+      for(DWORD i = 0; i < g_dwNodeAddrIndexSize; i++)
+      {
+         pNode = (Node *)g_pNodeIndexByAddr[i].pObject;
+         if (pNode->ReadyForConfigurationPoll())
+            pNode->ConfigurationPoll();
+      }
+   }
+}