mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
463 lines
15 KiB
463 lines
15 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
|
//
|
|
// File: servmon.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
#include "preDNSsn.h"
|
|
#include <SnapBase.h>
|
|
|
|
#include "resource.h"
|
|
#include "dnsutil.h"
|
|
#include "DNSSnap.h"
|
|
#include "snapdata.h"
|
|
|
|
#include "server.h"
|
|
#include "serverui.h"
|
|
|
|
#ifdef DEBUG_ALLOCATOR
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
#endif
|
|
|
|
#define CDNSServerMonitoringPageHolder CDNSServerPropertyPageHolder
|
|
|
|
#define MAX_STATISTICS_LINE_LEN 256
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
int FormatDate(SYSTEMTIME* p, LPWSTR lpsz, int nCharMax)
|
|
{
|
|
return ::GetDateFormat(LOCALE_USER_DEFAULT,
|
|
DATE_SHORTDATE,
|
|
p,
|
|
NULL,
|
|
lpsz,
|
|
nCharMax);
|
|
}
|
|
|
|
int FormatTime(SYSTEMTIME* p, LPWSTR lpsz, int nCharMax)
|
|
{
|
|
return ::GetTimeFormat(LOCALE_USER_DEFAULT,
|
|
0,
|
|
p,
|
|
NULL,
|
|
lpsz,
|
|
nCharMax);
|
|
}
|
|
|
|
UINT LoadLabelsBlock(UINT nStringID, CString& szLabels, LPWSTR* szLabelArray)
|
|
{
|
|
UINT nLabelCount = 0;
|
|
if (szLabels.LoadString(nStringID))
|
|
{
|
|
ParseNewLineSeparatedString(szLabels.GetBuffer(1),szLabelArray, &nLabelCount);
|
|
szLabels.ReleaseBuffer();
|
|
}
|
|
return nLabelCount;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// CDNSServer_TestPropertyPage
|
|
|
|
CDNSServer_PollingIntervalEditGroup::
|
|
CDNSServer_PollingIntervalEditGroup(UINT nMinVal, UINT nMaxVal)
|
|
: CDNSTimeIntervalEditGroup(nMinVal, nMaxVal)
|
|
{
|
|
}
|
|
|
|
|
|
void CDNSServer_PollingIntervalEditGroup::OnEditChange()
|
|
{
|
|
m_pPage->SetDirty(TRUE);
|
|
}
|
|
|
|
void CTestResultsListCtrl::Initialize()
|
|
{
|
|
// get size of control to help set the column widths
|
|
CRect controlRect;
|
|
GetClientRect(controlRect);
|
|
|
|
// get width of control, width of potential scrollbar, width needed for sub-item
|
|
// string
|
|
int controlWidth = controlRect.Width();
|
|
int scrollThumbWidth = ::GetSystemMetrics(SM_CXHTHUMB);
|
|
|
|
// clean net width
|
|
int nNetControlWidth = controlWidth - scrollThumbWidth - 12 * ::GetSystemMetrics(SM_CXBORDER);
|
|
|
|
// fields widths
|
|
int nWidth = nNetControlWidth/SVR_TEST_RESULT_LISTVIEW_NCOLS;
|
|
|
|
// set up columns
|
|
CString szHeaders;
|
|
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
szHeaders.LoadString(IDS_TEST_LISTVIEW_HEADERS);
|
|
}
|
|
ASSERT(!szHeaders.IsEmpty());
|
|
LPWSTR lpszArr[SVR_TEST_RESULT_LISTVIEW_NCOLS];
|
|
UINT n;
|
|
ParseNewLineSeparatedString(szHeaders.GetBuffer(1), lpszArr, &n);
|
|
szHeaders.ReleaseBuffer();
|
|
ASSERT(n == SVR_TEST_RESULT_LISTVIEW_NCOLS);
|
|
|
|
for (int k=0; k<SVR_TEST_RESULT_LISTVIEW_NCOLS; k++)
|
|
InsertColumn(k+1, lpszArr[k], LVCFMT_LEFT, nWidth, k+1);
|
|
}
|
|
|
|
void CTestResultsListCtrl::InsertEntry(CDNSServerTestQueryResult* pTestResult,
|
|
int nItemIndex)
|
|
{
|
|
WCHAR szDate[256];
|
|
WCHAR szTime[256];
|
|
FormatDate(pTestResult, szDate, 256);
|
|
FormatTime(pTestResult, szTime, 256);
|
|
|
|
BOOL bPlainQuery, bRecursiveQuery;
|
|
CDNSServerTestQueryResult::Unpack(pTestResult->m_dwQueryFlags, &bPlainQuery, &bRecursiveQuery);
|
|
|
|
UINT nState = 0;
|
|
if (nItemIndex == 0 )
|
|
nState = LVIS_SELECTED | LVIS_FOCUSED; // have at least one item, select it
|
|
VERIFY(-1 != InsertItem(LVIF_TEXT , nItemIndex,
|
|
szDate,
|
|
nState, 0, 0, NULL));
|
|
|
|
SetItemText(nItemIndex, 1, szTime); // TIME
|
|
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
if (pTestResult->m_dwAddressResolutionResult != 0)
|
|
{
|
|
CString szFailedOnNameResolution;
|
|
szFailedOnNameResolution.LoadString(IDS_SERVER_TEST_RESULT_FAIL_ON_NAME_RES);
|
|
if (bPlainQuery)
|
|
SetItemText(nItemIndex, 2, szFailedOnNameResolution);
|
|
if (bRecursiveQuery)
|
|
SetItemText(nItemIndex, 3, szFailedOnNameResolution);
|
|
}
|
|
else
|
|
{
|
|
CString szFail;
|
|
szFail.LoadString(IDS_SERVER_TEST_RESULT_FAIL);
|
|
CString szPass;
|
|
szPass.LoadString(IDS_SERVER_TEST_RESULT_PASS);
|
|
if (bPlainQuery)
|
|
SetItemText(nItemIndex, 2,
|
|
(pTestResult->m_dwPlainQueryResult == 0)? szPass : szFail);
|
|
if (bRecursiveQuery)
|
|
SetItemText(nItemIndex, 3,
|
|
(pTestResult->m_dwRecursiveQueryResult == 0)? szPass : szFail);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CTestResultsListCtrl::UpdateEntry(CDNSServerTestQueryResult* pTestResult,
|
|
int nItemIndex)
|
|
{
|
|
// have to update DATE and TIME
|
|
|
|
WCHAR szDate[256];
|
|
WCHAR szTime[256];
|
|
FormatDate(pTestResult, szDate, 256);
|
|
FormatTime(pTestResult, szTime, 256);
|
|
|
|
VERIFY(SetItem(nItemIndex, // nItem
|
|
0, // nSubItem
|
|
LVIF_TEXT, // nMask
|
|
szDate, // lpszItem
|
|
0, // nImage
|
|
0, // nState
|
|
0, // nStateMask
|
|
NULL // lParam
|
|
));
|
|
CString szTemp;
|
|
SetItemText(nItemIndex, 1, szTime);
|
|
}
|
|
|
|
void CTestResultsListCtrl::FormatDate(CDNSServerTestQueryResult* pTestResult,
|
|
LPWSTR lpsz, int nCharMax)
|
|
{
|
|
VERIFY( nCharMax > ::FormatDate(
|
|
&(pTestResult->m_queryTime),
|
|
lpsz,
|
|
nCharMax));
|
|
}
|
|
|
|
void CTestResultsListCtrl::FormatTime(CDNSServerTestQueryResult* pTestResult,
|
|
LPWSTR lpsz, int nCharMax)
|
|
{
|
|
VERIFY( nCharMax > ::FormatTime(
|
|
&(pTestResult->m_queryTime),
|
|
lpsz,
|
|
nCharMax));
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CDNSServer_TestPropertyPage, CPropertyPageBase)
|
|
ON_BN_CLICKED(IDC_ENABLE_TESTING_CHECK, OnEnableTestingCheck)
|
|
ON_BN_CLICKED(IDC_SIMPLE_QUERY_CHECK, OnQueryCheck)
|
|
ON_BN_CLICKED(IDC_RECURSIVE_QUERY_CHECK, OnQueryCheck)
|
|
ON_BN_CLICKED(IDC_TEST_NOW_BUTTON, OnTestNow)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
CDNSServer_TestPropertyPage::CDNSServer_TestPropertyPage()
|
|
: CPropertyPageBase(IDD_SERVMON_TEST_PAGE),
|
|
m_pollingIntervalEditGroup(MIN_SERVER_TEST_INTERVAL, MAX_SERVER_TEST_INTERVAL)
|
|
{
|
|
}
|
|
|
|
|
|
BOOL CDNSServer_TestPropertyPage::OnInitDialog()
|
|
{
|
|
CPropertyPageBase::OnInitDialog();
|
|
|
|
m_pollingIntervalEditGroup.m_pPage = this;
|
|
VERIFY(m_pollingIntervalEditGroup.Initialize(this,
|
|
IDC_POLLING_INT_EDIT, IDC_POLLING_INT_COMBO,IDS_TIME_INTERVAL_UNITS));
|
|
|
|
HWND hWnd = ::GetDlgItem(GetSafeHwnd(), IDC_POLLING_INT_EDIT);
|
|
|
|
// Disable IME support on the controls
|
|
ImmAssociateContext(hWnd, NULL);
|
|
|
|
VERIFY(m_listCtrl.SubclassDlgItem(IDC_RESULTS_LIST, this));
|
|
m_listCtrl.Initialize();
|
|
|
|
SetUIData();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void CDNSServer_TestPropertyPage::SetUIData()
|
|
{
|
|
CDNSServerMonitoringPageHolder* pHolder = (CDNSServerMonitoringPageHolder*)GetHolder();
|
|
CDNSServerNode* pServerNode = pHolder->GetServerNode();
|
|
|
|
pServerNode->GetTestOptions(&m_testOptions);
|
|
|
|
GetSimpleQueryCheck()->SetCheck(m_testOptions.m_bSimpleQuery);
|
|
GetRecursiveQueryCheck()->SetCheck(m_testOptions.m_bRecursiveQuery);
|
|
|
|
//
|
|
// Check to see if this is a root server
|
|
//
|
|
BOOL bRoot = FALSE;
|
|
DNS_STATUS err = ::ServerHasRootZone(pServerNode->GetRPCName(), &bRoot);
|
|
if (err == 0 && bRoot)
|
|
{
|
|
//
|
|
// Disable recursive queries on root server
|
|
//
|
|
GetRecursiveQueryCheck()->EnableWindow(FALSE);
|
|
GetRecursiveQueryCheck()->SetCheck(FALSE);
|
|
}
|
|
|
|
CButton* pEnableTestingCheck = GetEnableTestingCheck();
|
|
if (!(m_testOptions.m_bSimpleQuery || m_testOptions.m_bRecursiveQuery))
|
|
{
|
|
GetTestNowButton()->EnableWindow(FALSE);
|
|
pEnableTestingCheck->EnableWindow(FALSE);
|
|
pEnableTestingCheck->SetCheck(FALSE);
|
|
m_pollingIntervalEditGroup.EnableUI(FALSE);
|
|
}
|
|
else
|
|
{
|
|
pEnableTestingCheck->SetCheck(m_testOptions.m_bEnabled);
|
|
}
|
|
|
|
m_pollingIntervalEditGroup.SetVal(m_testOptions.m_dwInterval);
|
|
|
|
EnableControlsHelper(m_testOptions.m_bEnabled);
|
|
|
|
PopulateList();
|
|
}
|
|
|
|
void CDNSServer_TestPropertyPage::EnableControlsHelper(BOOL bEnable)
|
|
{
|
|
//GetSimpleQueryCheck()->EnableWindow(bEnable);
|
|
//GetRecursiveQueryCheck()->EnableWindow(bEnable);
|
|
m_pollingIntervalEditGroup.EnableUI(bEnable);
|
|
}
|
|
|
|
BOOL CDNSServer_TestPropertyPage::OnApply()
|
|
{
|
|
if (!IsDirty())
|
|
return TRUE;
|
|
|
|
CDNSServerTestOptions newTestOptions;
|
|
|
|
newTestOptions.m_bEnabled = GetEnableTestingCheck()->GetCheck();
|
|
newTestOptions.m_bSimpleQuery = GetSimpleQueryCheck()->GetCheck();
|
|
newTestOptions.m_bRecursiveQuery = GetRecursiveQueryCheck()->GetCheck();
|
|
newTestOptions.m_dwInterval = m_pollingIntervalEditGroup.GetVal();
|
|
|
|
|
|
if (newTestOptions == m_testOptions)
|
|
return TRUE; // no need to update
|
|
|
|
m_testOptions = newTestOptions;
|
|
DNS_STATUS err = GetHolder()->NotifyConsole(this);
|
|
if (err != 0)
|
|
{
|
|
DNSErrorDialog(err, IDS_MSG_SERVER_TEST_OPTIONS_UPDATE_FAILED);
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
SetDirty(FALSE);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDNSServer_TestPropertyPage::OnPropertyChange(BOOL, long*)
|
|
{
|
|
CDNSServerMonitoringPageHolder* pHolder = (CDNSServerMonitoringPageHolder*)GetHolder();
|
|
CDNSServerNode* pServerNode = pHolder->GetServerNode();
|
|
pServerNode->ResetTestOptions(&m_testOptions);
|
|
|
|
//if (err != 0)
|
|
// pHolder->SetError(err);
|
|
//return (err == 0);
|
|
|
|
return FALSE; // no need to UI changes on this
|
|
}
|
|
|
|
void CDNSServer_TestPropertyPage::OnEnableTestingCheck()
|
|
{
|
|
SetDirty(TRUE);
|
|
EnableControlsHelper(GetEnableTestingCheck()->GetCheck());
|
|
}
|
|
|
|
void CDNSServer_TestPropertyPage::OnQueryCheck()
|
|
{
|
|
SetDirty(TRUE);
|
|
BOOL bCanQuery = GetSimpleQueryCheck()->GetCheck() ||
|
|
GetRecursiveQueryCheck()->GetCheck();
|
|
GetTestNowButton()->EnableWindow(bCanQuery);
|
|
CButton* pEnableTestingCheck = GetEnableTestingCheck();
|
|
pEnableTestingCheck->EnableWindow(bCanQuery);
|
|
if (!bCanQuery)
|
|
{
|
|
GetTestNowButton()->EnableWindow(FALSE);
|
|
pEnableTestingCheck->EnableWindow(FALSE);
|
|
pEnableTestingCheck->SetCheck(FALSE);
|
|
m_pollingIntervalEditGroup.EnableUI(FALSE);
|
|
}
|
|
}
|
|
|
|
void CDNSServer_TestPropertyPage::OnTestNow()
|
|
{
|
|
CDNSServerMonitoringPageHolder* pHolder = (CDNSServerMonitoringPageHolder*)GetHolder();
|
|
CDNSServerNode* pServerNode = pHolder->GetServerNode();
|
|
|
|
BOOL bSimpleQuery = GetSimpleQueryCheck()->GetCheck();
|
|
BOOL bRecursiveQuery = GetRecursiveQueryCheck()->GetCheck();
|
|
pHolder->GetComponentData()->PostMessageToTimerThread(
|
|
WM_TIMER_THREAD_SEND_QUERY_TEST_NOW,
|
|
(WPARAM)pServerNode,
|
|
CDNSServerTestQueryResult::Pack(bSimpleQuery, bRecursiveQuery));
|
|
}
|
|
|
|
void CDNSServer_TestPropertyPage::OnHaveTestData(LPARAM lParam)
|
|
{
|
|
TRACE(_T("CDNSServer_TestPropertyPage::OnHaveTestData(LPARAM lParam = %d)\n"), lParam);
|
|
if (m_hWnd == NULL)
|
|
return; // not page not created yet
|
|
AddEntryToList((CDNSServerTestQueryResultList::addAction)lParam);
|
|
SetFocus();
|
|
}
|
|
|
|
|
|
void CDNSServer_TestPropertyPage::AddEntryToList(CDNSServerTestQueryResultList::addAction action)
|
|
{
|
|
CDNSServerMonitoringPageHolder* pHolder = (CDNSServerMonitoringPageHolder*)GetHolder();
|
|
CDNSServerNode* pServerNode = pHolder->GetServerNode();
|
|
CDNSServerTestQueryResultList* pResultList = &(pServerNode->m_testResultList);
|
|
int nCount = m_listCtrl.GetItemCount();
|
|
|
|
switch (action)
|
|
{
|
|
case CDNSServerTestQueryResultList::added:
|
|
case CDNSServerTestQueryResultList::addedAndRemoved:
|
|
{
|
|
if (action == CDNSServerTestQueryResultList::addedAndRemoved)
|
|
{
|
|
ASSERT(nCount > 0);
|
|
m_listCtrl.DeleteItem(nCount-1);
|
|
}
|
|
|
|
pResultList->Lock();
|
|
|
|
CDNSServerTestQueryResult* pTestResult = pResultList->GetHead();
|
|
m_listCtrl.InsertEntry(pTestResult, 0);
|
|
|
|
pResultList->Unlock();
|
|
|
|
}
|
|
break;
|
|
case CDNSServerTestQueryResultList::changed:
|
|
{
|
|
ASSERT(nCount > 0);
|
|
// for the moment just remove and add again
|
|
pResultList->Lock();
|
|
|
|
CDNSServerTestQueryResult* pTestResult = pResultList->GetHead();
|
|
m_listCtrl.UpdateEntry(pTestResult, 0);
|
|
|
|
pResultList->Unlock();
|
|
}
|
|
break;
|
|
};
|
|
|
|
}
|
|
|
|
void CDNSServer_TestPropertyPage::PopulateList()
|
|
{
|
|
m_listCtrl.DeleteAllItems();
|
|
|
|
CDNSServerMonitoringPageHolder* pHolder = (CDNSServerMonitoringPageHolder*)GetHolder();
|
|
CDNSServerNode* pServerNode = pHolder->GetServerNode();
|
|
CDNSServerTestQueryResultList* pResultList = &(pServerNode->m_testResultList);
|
|
|
|
pResultList->Lock();
|
|
int k = 0;
|
|
POSITION pos;
|
|
for( pos = pResultList->GetHeadPosition(); pos != NULL; )
|
|
{
|
|
CDNSServerTestQueryResult* pTestResult = pResultList->GetNext(pos);
|
|
m_listCtrl.InsertEntry(pTestResult, k++);
|
|
}
|
|
pResultList->Unlock();
|
|
}
|
|
|
|
|
|
/*
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// CDNSServerMonitoringPageHolder
|
|
|
|
CDNSServerMonitoringPageHolder::CDNSServerMonitoringPageHolder(CDNSRootData* pRootDataNode,
|
|
CDNSServerNode* pServerNode, CComponentDataObject* pComponentData)
|
|
: CPropertyPageHolderBase(pRootDataNode, pServerNode, pComponentData)
|
|
{
|
|
ASSERT(pRootDataNode == GetContainerNode());
|
|
|
|
m_bAutoDeletePages = FALSE; // we have the pages as embedded members
|
|
AddPageToList((CPropertyPageBase*)&m_statisticsPage);
|
|
AddPageToList((CPropertyPageBase*)&m_testPage);
|
|
}
|
|
*/
|