Improve readability and output of check_network

fixes #7668
This commit is contained in:
Jean Flach 2014-11-14 13:09:04 +01:00
parent 6ca188e090
commit e187f405d9
1 changed files with 64 additions and 37 deletions

View File

@ -24,7 +24,7 @@
#include "thresholds.h" #include "thresholds.h"
#include "boost\program_options.hpp" #include "boost/program_options.hpp"
#define VERSION 1.0 #define VERSION 1.0
namespace po = boost::program_options; namespace po = boost::program_options;
@ -45,7 +45,7 @@ struct printInfoStruct
threshold warn, crit; threshold warn, crit;
}; };
static void die(const DWORD err=NULL); static void die(const DWORD err);
static int parseArguments(int, TCHAR **, po::variables_map&, printInfoStruct&); static int parseArguments(int, TCHAR **, po::variables_map&, printInfoStruct&);
static int printOutput(printInfoStruct&, const vector<nInterface>&); static int printOutput(printInfoStruct&, const vector<nInterface>&);
static int check_network(vector<nInterface>&); static int check_network(vector<nInterface>&);
@ -174,7 +174,7 @@ int parseArguments(int ac, wchar_t **av, po::variables_map& vm, printInfoStruct&
int printOutput(printInfoStruct& printInfo, const vector<nInterface>& vInterfaces) int printOutput(printInfoStruct& printInfo, const vector<nInterface>& vInterfaces)
{ {
long tIn = 0, tOut = 0; long tIn = 0, tOut = 0;
std::wstringstream tss; std::wstringstream tss, perfDataFirst;
state state = OK; state state = OK;
for (vector<nInterface>::const_iterator it = vInterfaces.begin(); it != vInterfaces.end(); ++it) { for (vector<nInterface>::const_iterator it = vInterfaces.begin(); it != vInterfaces.end(); ++it) {
@ -187,16 +187,18 @@ int printOutput(printInfoStruct& printInfo, const vector<nInterface>& vInterface
state = WARNING; state = WARNING;
if (printInfo.crit.rend(tIn + tOut)) if (printInfo.crit.rend(tIn + tOut))
state = CRITICAL; state = CRITICAL;
perfDataFirst << L"network=" << tIn + tOut << L"B/s;" << printInfo.warn.pString() << L";" << printInfo.crit.pString() << L";" << L"0 ";
switch (state) { switch (state) {
case OK: case OK:
wcout << L"NETWORK OK " << tIn + tOut << L"B/s|" << tss.str() << endl; wcout << L"NETWORK OK " << tIn + tOut << L"B/s|" << perfDataFirst.str() << tss.str() << endl;
break; break;
case WARNING: case WARNING:
wcout << L"NETWORK WARNING " << tIn + tOut << L"B/s|" << tss.str() << endl; wcout << L"NETWORK WARNING " << tIn + tOut << L"B/s|" << perfDataFirst.str() << tss.str() << endl;
break; break;
case CRITICAL: case CRITICAL:
wcout << L"NETWORK CRITICAL " << tIn + tOut << L"B/s|" << tss.str() << endl; wcout << L"NETWORK CRITICAL " << tIn + tOut << L"B/s|" << perfDataFirst.str() << tss.str() << endl;
break; break;
} }
@ -212,47 +214,72 @@ int check_network(vector <nInterface>& vInterfaces)
PDH_HCOUNTER phCounterIn, phCounterOut; PDH_HCOUNTER phCounterIn, phCounterOut;
DWORD dwBufferSizeIn = 0, dwBufferSizeOut = 0, dwItemCount = 0; DWORD dwBufferSizeIn = 0, dwBufferSizeOut = 0, dwItemCount = 0;
PDH_FMT_COUNTERVALUE_ITEM *pDisplayValuesIn = NULL, *pDisplayValuesOut = NULL; PDH_FMT_COUNTERVALUE_ITEM *pDisplayValuesIn = NULL, *pDisplayValuesOut = NULL;
PDH_STATUS err;
if (PdhOpenQuery(NULL, NULL, &phQuery) != ERROR_SUCCESS) err = PdhOpenQuery(NULL, NULL, &phQuery);
if (err != ERROR_SUCCESS)
goto die; goto die;
//Totaly reasonable statement err = PdhAddEnglishCounter(phQuery, perfIn, NULL, &phCounterIn);
if (PdhOpenQuery(NULL, NULL, &phQuery) == ERROR_SUCCESS) { if (err != ERROR_SUCCESS)
if (PdhAddEnglishCounter(phQuery, perfIn, NULL, &phCounterIn) == ERROR_SUCCESS) { goto die;
if (PdhAddEnglishCounter(phQuery, perfOut, NULL, &phCounterOut) == ERROR_SUCCESS) {
if (PdhCollectQueryData(phQuery) == ERROR_SUCCESS) {
Sleep(1000);
if (PdhCollectQueryData(phQuery) == ERROR_SUCCESS) {
if (PdhGetFormattedCounterArray(phCounterIn, PDH_FMT_LONG, &dwBufferSizeIn, &dwItemCount, pDisplayValuesIn) == PDH_MORE_DATA &&
PdhGetFormattedCounterArray(phCounterOut, PDH_FMT_LONG, &dwBufferSizeOut, &dwItemCount, pDisplayValuesOut) == PDH_MORE_DATA) {
pDisplayValuesIn = new PDH_FMT_COUNTERVALUE_ITEM[dwItemCount*dwBufferSizeIn];
pDisplayValuesOut = new PDH_FMT_COUNTERVALUE_ITEM[dwItemCount*dwBufferSizeOut];
if (PdhGetFormattedCounterArray(phCounterIn, PDH_FMT_LONG, &dwBufferSizeIn, &dwItemCount, pDisplayValuesIn) == ERROR_SUCCESS &&
PdhGetFormattedCounterArray(phCounterOut, PDH_FMT_LONG, &dwBufferSizeOut, &dwItemCount, pDisplayValuesOut) == ERROR_SUCCESS) {
for (DWORD i = 0; i < dwItemCount; i++) {
nInterface *iface = new nInterface(wstring(pDisplayValuesIn[i].szName));
iface->BytesInSec = pDisplayValuesIn[i].FmtValue.longValue;
iface->BytesOutSec = pDisplayValuesOut[i].FmtValue.longValue;
vInterfaces.push_back(*iface);
}
return -1;
}
}
}
}
}
}
}
err = PdhAddEnglishCounter(phQuery, perfOut, NULL, &phCounterOut);
if (err != ERROR_SUCCESS)
goto die;
err = PdhCollectQueryData(phQuery);
if (err != ERROR_SUCCESS)
goto die;
Sleep(1000);
err = PdhCollectQueryData(phQuery);
if (err != ERROR_SUCCESS)
goto die;
err = PdhGetFormattedCounterArray(phCounterIn, PDH_FMT_LONG, &dwBufferSizeIn, &dwItemCount, pDisplayValuesIn);
if (err == PDH_MORE_DATA || err == ERROR_SUCCESS)
pDisplayValuesIn = new PDH_FMT_COUNTERVALUE_ITEM[dwItemCount*dwBufferSizeIn];
else
goto die;
err = PdhGetFormattedCounterArray(phCounterOut, PDH_FMT_LONG, &dwBufferSizeOut, &dwItemCount, pDisplayValuesOut);
if (err == PDH_MORE_DATA || err == ERROR_SUCCESS)
pDisplayValuesOut = new PDH_FMT_COUNTERVALUE_ITEM[dwItemCount*dwBufferSizeOut];
else
goto die;
err = PdhGetFormattedCounterArray(phCounterIn, PDH_FMT_LONG, &dwBufferSizeIn, &dwItemCount, pDisplayValuesIn);
if (err != ERROR_SUCCESS)
goto die;
err = PdhGetFormattedCounterArray(phCounterOut, PDH_FMT_LONG, &dwBufferSizeOut, &dwItemCount, pDisplayValuesOut);
if (err != ERROR_SUCCESS)
goto die;
for (DWORD i = 0; i < dwItemCount; i++) {
nInterface *iface = new nInterface(wstring(pDisplayValuesIn[i].szName));
iface->BytesInSec = pDisplayValuesIn[i].FmtValue.longValue;
iface->BytesOutSec = pDisplayValuesOut[i].FmtValue.longValue;
vInterfaces.push_back(*iface);
}
PdhCloseQuery(phQuery);
delete pDisplayValuesIn;
delete pDisplayValuesOut;
return -1;
die: die:
die(); die(err);
if (phQuery) if (phQuery)
PdhCloseQuery(phQuery); PdhCloseQuery(phQuery);
if (pDisplayValuesIn)
delete pDisplayValuesIn;
if (pDisplayValuesOut)
delete pDisplayValuesOut;
return 3; return 3;
} }
void die(DWORD err) void die(DWORD err = 0)
{ {
if (!err) if (!err)
err = GetLastError(); err = GetLastError();