143 lines
3.7 KiB
C++
143 lines
3.7 KiB
C++
#include <stdafx.h>
|
|
#include "Errors.h"
|
|
#include "SNMPCtrl.h"
|
|
#include "EventCmd.h"
|
|
|
|
CSNMPController gSNMPController;
|
|
|
|
CSNMPController::CSNMPController()
|
|
{
|
|
m_hSNMPService = NULL;
|
|
m_hServiceController = NULL;
|
|
}
|
|
|
|
CSNMPController::~CSNMPController()
|
|
{
|
|
if (m_hSNMPService != NULL)
|
|
CloseServiceHandle(m_hSNMPService);
|
|
if (m_hServiceController != NULL)
|
|
CloseServiceHandle(m_hServiceController);
|
|
}
|
|
|
|
DWORD CSNMPController::LoadSvcHandle()
|
|
{
|
|
if (m_hSNMPService == NULL)
|
|
{
|
|
if (m_hServiceController == NULL)
|
|
{
|
|
m_hServiceController = OpenSCManager(
|
|
gCommandLine.m_szSystem,
|
|
"ServicesActive",
|
|
GENERIC_EXECUTE);
|
|
|
|
if (m_hServiceController == NULL)
|
|
return _E(GetLastError(), IDS_ERR25);
|
|
}
|
|
|
|
m_hSNMPService = OpenService(
|
|
m_hServiceController,
|
|
"SNMP",
|
|
SERVICE_CONTROL_INTERROGATE | SERVICE_START | SERVICE_STOP);
|
|
|
|
if (m_hSNMPService == NULL)
|
|
return _E(GetLastError(), IDS_ERR26);
|
|
}
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
BOOL CSNMPController::IsSNMPRunning()
|
|
{
|
|
SERVICE_STATUS snmpStatus;
|
|
|
|
if (LoadSvcHandle() != ERROR_SUCCESS)
|
|
return FALSE;
|
|
|
|
if (!QueryServiceStatus(m_hSNMPService, &snmpStatus))
|
|
return _E(GetLastError(), IDS_ERR27);
|
|
|
|
_W(WARN_TRACK, IDS_TRCK_WRN49, snmpStatus.dwCurrentState);
|
|
|
|
return snmpStatus.dwCurrentState == SERVICE_RUNNING;
|
|
}
|
|
|
|
DWORD CSNMPController::StartSNMP()
|
|
{
|
|
DWORD retCode;
|
|
SERVICE_STATUS svcStatus;
|
|
DWORD dwRetries;
|
|
|
|
if ((retCode = LoadSvcHandle()) != ERROR_SUCCESS)
|
|
return retCode;
|
|
|
|
if (!StartService(m_hSNMPService, 0, NULL))
|
|
return _E(GetLastError(), IDS_ERR28);
|
|
|
|
for (dwRetries = 10; dwRetries > 0; dwRetries--)
|
|
{
|
|
printf("."); fflush(stdout);
|
|
if (!QueryServiceStatus(m_hSNMPService, &svcStatus))
|
|
return _E(GetLastError(), IDS_ERR29);
|
|
if (svcStatus.dwCurrentState == SERVICE_RUNNING)
|
|
break;
|
|
if (svcStatus.dwCurrentState == SERVICE_START_PENDING)
|
|
{
|
|
if (svcStatus.dwWaitHint < 200)
|
|
svcStatus.dwWaitHint = 200;
|
|
if (svcStatus.dwWaitHint > 1000)
|
|
svcStatus.dwWaitHint = 1000;
|
|
Sleep(svcStatus.dwWaitHint);
|
|
}
|
|
else
|
|
return _E(ERROR_INVALID_STATE, IDS_ERR06, svcStatus.dwWaitHint);
|
|
}
|
|
printf("\n");
|
|
|
|
return retCode;
|
|
}
|
|
|
|
DWORD CSNMPController::StopSNMP()
|
|
{
|
|
DWORD retCode;
|
|
SERVICE_STATUS svcStatus;
|
|
DWORD dwRetries;
|
|
|
|
if ((retCode = LoadSvcHandle()) != ERROR_SUCCESS)
|
|
return retCode;
|
|
|
|
if (!ControlService(m_hSNMPService, SERVICE_CONTROL_STOP, &svcStatus))
|
|
{
|
|
retCode = GetLastError();
|
|
if (retCode == ERROR_SERVICE_NOT_ACTIVE)
|
|
{
|
|
_W(WARN_TRACK, IDS_TRCK_WRN50);
|
|
return ERROR_SUCCESS;
|
|
}
|
|
return _E(GetLastError(), IDS_ERR30);
|
|
}
|
|
|
|
for (dwRetries = 10; dwRetries > 0; dwRetries--)
|
|
{
|
|
printf("."); fflush(stdout);
|
|
if (!QueryServiceStatus(m_hSNMPService, &svcStatus))
|
|
return _E(GetLastError(), IDS_ERR31);
|
|
if (svcStatus.dwCurrentState == SERVICE_STOPPED)
|
|
break;
|
|
if (svcStatus.dwCurrentState == SERVICE_STOP_PENDING)
|
|
{
|
|
if (svcStatus.dwWaitHint < 200)
|
|
svcStatus.dwWaitHint = 200;
|
|
if (svcStatus.dwWaitHint > 1000)
|
|
svcStatus.dwWaitHint = 1000;
|
|
Sleep(svcStatus.dwWaitHint);
|
|
}
|
|
else
|
|
return _E(ERROR_INVALID_STATE, IDS_ERR06, svcStatus.dwWaitHint);
|
|
}
|
|
printf("\n");
|
|
|
|
if (dwRetries == 0)
|
|
return _E(ERROR_TIMEOUT, IDS_ERR07);
|
|
|
|
return retCode;
|
|
}
|