Various minor fixes
authorVictor Kirhenshtein <victor@netxms.org>
Thu, 21 Sep 2006 20:49:13 +0000 (20:49 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Thu, 21 Sep 2006 20:49:13 +0000 (20:49 +0000)
ChangeLog
TODO
src/console/win32/EventPolicyEditor.cpp
src/console/win32/RuleList.cpp
src/console/win32/RuleList.h
src/console/win32/tools.cpp
src/server/core/netinfo.cpp
src/server/libnxsrv/messages.mc

index 3ec0b78..bb001a1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,8 @@
 *
 
 - Threshold state now saved across NetXMS server restarts
+- Windows console:
+       - Event processing policy editor improved
 - Fixed issues: #104, #109, #111
 
 
diff --git a/TODO b/TODO
index 2c19b03..89e8ef0 100644 (file)
--- a/TODO
+++ b/TODO
@@ -8,7 +8,7 @@ GENERAL:
 - Finish FreeBSD subagent
 - Finish Solaris subagent
 - Finish AIX subagent
-- HP-UX subagent
+- Finish HP-UX subagent
 - Write README for NetWare
 - Add ability to clear collected DCI data
 - Add possibility to set different polling timeouts for different nodes
@@ -26,9 +26,6 @@ SERVER:
 
 - Implement sending of all alarms from database
 - Check if object indexes always locked when used
-- Remove system-dependent code for getting interface list and ARP cache
-  from management server. Server should rely on SNMP or native agent for
-  this functionality.
 - Optimize SNMP subsystem
 - Add special handling for HP iLO boards
 - Add logging API for database drivers
@@ -37,10 +34,12 @@ SERVER:
 - NxDbMgr -- backup before db recover
 - OSPF discovery
 
+
 ALL AGENTS:
 - Add Process.Count($1,$2,$3), where $3 is process command line
 - Check PhysicalDisk.* on external controllers
 
+
 LINUX AGENT:
 
 - Return correct interface type in Net.InterfaceList
index b3a3002..c1160d0 100644 (file)
@@ -143,13 +143,14 @@ int CEventPolicyEditor::OnCreate(LPCREATESTRUCT lpCreateStruct)
    m_wndRuleList.SetImageList(m_pImageList);
 
    // Setup columns
-   m_wndRuleList.InsertColumn(0, "No.", 35, CF_CENTER | CF_TITLE_COLOR | CF_NON_SELECTABLE);
-   m_wndRuleList.InsertColumn(1, "Source", 150);
-   m_wndRuleList.InsertColumn(2, "Event", 150);
-   m_wndRuleList.InsertColumn(3, "Severity", 90, CF_NON_SELECTABLE);
-   m_wndRuleList.InsertColumn(4, "Alarm", 150, CF_NON_SELECTABLE);
-   m_wndRuleList.InsertColumn(5, "Action", 150);
-   m_wndRuleList.InsertColumn(6, "Comments", 200, CF_TEXTBOX | CF_NON_SELECTABLE);
+   m_wndRuleList.InsertColumn(0, _T("No."), 35, CF_CENTER | CF_TITLE_COLOR | CF_NON_SELECTABLE);
+   m_wndRuleList.InsertColumn(1, _T("Source"), 150);
+   m_wndRuleList.InsertColumn(2, _T("Event"), 150);
+   m_wndRuleList.InsertColumn(3, _T("Severity"), 90, CF_NON_SELECTABLE);
+   m_wndRuleList.InsertColumn(4, _T("Alarm"), 150, CF_NON_SELECTABLE);
+   m_wndRuleList.InsertColumn(5, _T("Action"), 150);
+   m_wndRuleList.InsertColumn(6, _T("Comments"), 200, CF_TEXTBOX | CF_NON_SELECTABLE);
+   m_wndRuleList.RestoreColumns(_T("EventEditor"), _T("RuleList"));
 
    // Fill rule list with existing rules
    for(i = 0; i < m_pEventPolicy->dwNumRules; i++)
@@ -186,6 +187,8 @@ void CEventPolicyEditor::OnClose()
    DWORD dwResult;
    int iAnswer = IDNO;
 
+   m_wndRuleList.SaveColumns(_T("EventEditor"), _T("RuleList"));
+
    if (m_bIsModified)
    {
       iAnswer = MessageBox(_T("Event processing policy was modified. Do you want to save changes?"),
index 77371a9..8007228 100644 (file)
@@ -579,7 +579,7 @@ int CRuleList::InsertColumn(int iInsertBefore, char *pszText, int iWidth, DWORD
    
    RecalcWidth();
    UpdateScrollBars();
-   m_wndHeader.SetWindowPos(NULL, 0, 0, m_iTotalWidth, RULE_HEADER_HEIGHT, SWP_NOZORDER);
+   m_wndHeader.SetWindowPos(NULL, -m_iXOrg, 0, m_iTotalWidth, RULE_HEADER_HEIGHT, SWP_NOZORDER);
    return iNewCol;
 }
 
@@ -697,7 +697,7 @@ void CRuleList::OnHeaderBeginTrack(NMHEADER *pHdrInfo, LRESULT *pResult)
 {
    int x;
 
-   x = GetColumnStartPos(pHdrInfo->iItem) + pHdrInfo->pitem->cxy;
+   x = GetColumnStartPos(pHdrInfo->iItem) + pHdrInfo->pitem->cxy - m_iXOrg;
    DrawShadowLine(x, RULE_HEADER_HEIGHT, x, m_iTotalHeight + RULE_HEADER_HEIGHT);
    *pResult = 0;
 }
@@ -713,9 +713,9 @@ void CRuleList::OnHeaderTrack(NMHEADER *pHdrInfo, LRESULT *pResult)
 
    // Draw line at old and new column width
    sx = GetColumnStartPos(pHdrInfo->iItem);
-   x = sx + m_pColList[pHdrInfo->iItem].m_iWidth;
+   x = sx + m_pColList[pHdrInfo->iItem].m_iWidth - m_iXOrg;
    DrawShadowLine(x, RULE_HEADER_HEIGHT, x, m_iTotalHeight + RULE_HEADER_HEIGHT);
-   x = sx + pHdrInfo->pitem->cxy;
+   x = sx + pHdrInfo->pitem->cxy - m_iXOrg;
    DrawShadowLine(x, RULE_HEADER_HEIGHT, x, m_iTotalHeight + RULE_HEADER_HEIGHT);
 
    // New column width
@@ -732,7 +732,7 @@ void CRuleList::OnHeaderTrack(NMHEADER *pHdrInfo, LRESULT *pResult)
 void CRuleList::OnHeaderEndTrack(NMHEADER *pHdrInfo, LRESULT *pResult)
 {
    RecalcWidth();
-   m_wndHeader.SetWindowPos(NULL, 0, 0, m_iTotalWidth, RULE_HEADER_HEIGHT, SWP_NOZORDER);
+   m_wndHeader.SetWindowPos(NULL, -m_iXOrg, 0, m_iTotalWidth, RULE_HEADER_HEIGHT, SWP_NOZORDER);
    UpdateScrollBars();
    InvalidateRect(NULL);
 }
@@ -1585,3 +1585,51 @@ void CRuleList::OnContextMenu(CWnd* pWnd, CPoint point)
 
    GetParent()->SendMessage(WM_CONTEXTMENU, (WPARAM)m_hWnd, MAKELPARAM(point.x, point.y));
 }
+
+
+//
+// Save column dimensions
+//
+
+void CRuleList::SaveColumns(TCHAR *pszSection, TCHAR *pszPrefix)
+{
+   int i;
+   TCHAR szParam[256];
+
+   _sntprintf(szParam, 256, _T("%s_CNT"), pszPrefix);
+   theApp.WriteProfileInt(pszSection, szParam, m_iNumColumns);
+
+   for(i = 0; i < m_iNumColumns; i++)
+   {
+      _sntprintf(szParam, 256, _T("%s_%d"), pszPrefix, i);
+      theApp.WriteProfileInt(pszSection, szParam, m_pColList[i].m_iWidth);
+   }
+}
+
+
+//
+// Restore column dimensions from registry
+//
+
+void CRuleList::RestoreColumns(TCHAR *pszSection, TCHAR *pszPrefix)
+{
+   int i, nCount;
+   TCHAR szParam[256];
+   HDITEM hdi;
+
+   _sntprintf(szParam, 256, _T("%s_CNT"), pszPrefix);
+   nCount = theApp.GetProfileInt(pszSection, szParam, 0);
+
+   hdi.mask = HDI_WIDTH;
+   for(i = 0; i < nCount; i++)
+   {
+      _sntprintf(szParam, 256, _T("%s_%d"), pszPrefix, i);
+      hdi.cxy = theApp.GetProfileInt(pszSection, szParam, 100);
+      m_pColList[i].m_iWidth = hdi.cxy;
+      m_wndHeader.SetItem(i, &hdi);
+   }
+
+   RecalcWidth();
+   UpdateScrollBars();
+   m_wndHeader.SetWindowPos(NULL, -m_iXOrg, 0, m_iTotalWidth, RULE_HEADER_HEIGHT, SWP_NOZORDER);
+}
index 85ffd3e..0a601d2 100644 (file)
@@ -177,6 +177,8 @@ private:
    RL_Row **m_ppRowList;
 
 public:
+       void RestoreColumns(TCHAR *pszSection, TCHAR *pszPrefix);
+       void SaveColumns(TCHAR *pszSection, TCHAR *pszPrefix);
        int GetSelectionCount(void);
        void SetNegationFlag(int nRow, int nCol, BOOL bNegate);
        void SetCellText(int iRow, int iColumn, char *pszText);
index d5d83f6..541cc0d 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Windows Console
-** Copyright (C) 2004 Victor Kirhenshtein
+** Copyright (C) 2004, 2005, 2006 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
index 6e721fa..faf1183 100644 (file)
 #include <sys/utsname.h>
 #endif
 
-#if HAVE_NET_IF_H
-#include <net/if.h>
-#endif
-
 #endif   /* _WIN32 */
 
 
@@ -72,7 +68,7 @@ void InitLocalNetInfo(void)
    }
 #elif HAVE_SYS_UTSNAME_H
    struct utsname un;
-   char szName[MAX_PATH];
+   char szName[MAX_PATH], szErrorText[256];
    int i;
 
    if (uname(&un) != -1)
@@ -92,8 +88,20 @@ void InitLocalNetInfo(void)
          {
             DLClose(m_hSubAgent);
             m_hSubAgent = NULL;
+            WriteLog(MSG_PLATFORM_SUBAGENT_NOT_LOADED, EVENTLOG_ERROR_TYPE,
+                     "ss", szName, _T("Subagent doesn't provide any usable parameters"));
+         }
+         else
+         {
+            WriteLog(MSG_PLATFORM_SUBAGENT_LOADED,
+                     EVENTLOG_INFORMATION_TYPE, "s", szName);
          }
       }
+      else
+      {
+         WriteLog(MSG_PLATFORM_SUBAGENT_NOT_LOADED, EVENTLOG_ERROR_TYPE,
+                  "ss", szName, szErrorText);
+      }
    }
 #endif
 }
@@ -121,20 +129,6 @@ void StrToMac(char *pszStr, BYTE *pBuffer)
 }
 
 
-//
-// Get interface index from name
-//
-
-static DWORD InterfaceIndexFromName(char *pszIfName)
-{
-#if HAVE_IF_NAMETOINDEX
-   return if_nametoindex(pszIfName);
-#else
-   return 0;   // By default, return 0, which means error
-#endif
-}
-
-
 //
 // Get local ARP cache
 //
@@ -353,7 +347,7 @@ static INTERFACE_LIST *SysGetLocalIfList(void)
                   *pSlash = 0;
                   pSlash++;
                }
-               else     // Just a paranoia protection, should'n happen if agent working correctly
+               else     // Just a paranoia protection, should'n happen if subagent working correctly
                {
                   pSlash = _T("24");
                }
@@ -403,18 +397,21 @@ static INTERFACE_LIST *SysGetLocalIfList(void)
 ARP_CACHE *GetLocalArpCache(void)
 {
    ARP_CACHE *pArpCache = NULL;
-   AgentConnection conn(inet_addr("127.0.0.1"));
 
-   // Try to get local interface list from agent via loopback address
-   if (conn.Connect(g_pServerKey))
-   {
-      pArpCache = conn.GetArpCache();
-      conn.Disconnect();
-   }
+   // Get ARP cache from built-in code or platform subagent
+   pArpCache = SysGetLocalArpCache();
 
-   // Use built-in code as last resort
+   // Try to get ARP cache from agent via loopback address
    if (pArpCache == NULL)
-      pArpCache = SysGetLocalArpCache();
+   {
+      AgentConnection conn(inet_addr("127.0.0.1"));
+
+      if (conn.Connect(g_pServerKey))
+      {
+         pArpCache = conn.GetArpCache();
+         conn.Disconnect();
+      }
+   }
 
    return pArpCache;
 }
@@ -427,18 +424,21 @@ ARP_CACHE *GetLocalArpCache(void)
 INTERFACE_LIST *GetLocalInterfaceList(void)
 {
    INTERFACE_LIST *pIfList = NULL;
-   AgentConnection conn(inet_addr("127.0.0.1"));
+
+   // Get interface list from built-in code or platform subagent
+   pIfList = SysGetLocalIfList();
 
    // Try to get local interface list from agent via loopback address
-   if (conn.Connect(g_pServerKey))
+   if (pIfList == NULL)
    {
-      pIfList = conn.GetInterfaceList();
-      conn.Disconnect();
-   }
+      AgentConnection conn(inet_addr("127.0.0.1"));
 
-   // Use built-in code as last resort
-   if (pIfList == NULL)
-      pIfList = SysGetLocalIfList();
+      if (conn.Connect(g_pServerKey))
+      {
+         pIfList = conn.GetInterfaceList();
+         conn.Disconnect();
+      }
+   }
 
    CleanInterfaceList(pIfList);
    return pIfList;
index 31006b2..b1ab54f 100644 (file)
@@ -566,4 +566,16 @@ Language=English
 Database driver "%1" cannot be loaded because of API version mismatch (driver: %3; server: %2)
 .
 
+MessageId=
+SymbolicName=MSG_PLATFORM_SUBAGENT_LOADED
+Language=English
+Platform subagent "%1" successfully loaded
+.
+
+MessageId=
+SymbolicName=MSG_PLATFORM_SUBAGENT_NOT_LOADED
+Language=English
+Cannot loads platform subagent "%1": %2
+.
+
 ;#endif