Merge pull request #6313 from Icinga/fix/win-check-swap

Fix wrong calculation of check_swap windows plugin
This commit is contained in:
Michael Friedrich 2018-09-27 10:08:47 +02:00 committed by GitHub
commit fbf4546357
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 29 additions and 7 deletions

View File

@ -21,7 +21,8 @@
#include <boost/program_options.hpp> #include <boost/program_options.hpp>
#include <iostream> #include <iostream>
#include <shlwapi.h> #include <shlwapi.h>
#include <winbase.h> #include <Psapi.h>
#include <vector>
#define VERSION 1.0 #define VERSION 1.0
@ -37,8 +38,26 @@ struct printInfoStruct
Bunit unit = BunitMB; Bunit unit = BunitMB;
}; };
struct pageFileInfo
{
SIZE_T totalSwap;
SIZE_T availableSpwap;
};
static bool l_Debug; static bool l_Debug;
BOOL EnumPageFilesProc(LPVOID pContext, PENUM_PAGE_FILE_INFORMATION pPageFileInfo, LPCTSTR lpFilename) {
std::vector<pageFileInfo>* pageFile = static_cast<std::vector<pageFileInfo>*>(pContext);
SYSTEM_INFO systemInfo;
GetSystemInfo(&systemInfo);
// pPageFileInfo output is in pages, we need to multiply it by the page size
pageFile->push_back({ pPageFileInfo->TotalSize * systemInfo.dwPageSize, (pPageFileInfo->TotalSize - pPageFileInfo->TotalInUse) * systemInfo.dwPageSize });
return TRUE;
}
static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoStruct& printInfo) static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoStruct& printInfo)
{ {
WCHAR namePath[MAX_PATH]; WCHAR namePath[MAX_PATH];
@ -187,17 +206,20 @@ static int printOutput(printInfoStruct& printInfo)
static int check_swap(printInfoStruct& printInfo) static int check_swap(printInfoStruct& printInfo)
{ {
MEMORYSTATUSEX MemBuf; PENUM_PAGE_FILE_CALLBACK pageFileCallback = &EnumPageFilesProc;
MemBuf.dwLength = sizeof(MemBuf); std::vector<pageFileInfo> pageFiles;
if (!GlobalMemoryStatusEx(&MemBuf)) { if(!EnumPageFiles(pageFileCallback, &pageFiles)) {
printErrorInfo(); printErrorInfo();
return 3; return 3;
} }
printInfo.tSwap = round(MemBuf.ullTotalPageFile / pow(1024.0, printInfo.unit)); for (int i = 0; i < pageFiles.size(); i++) {
printInfo.aSwap = round(MemBuf.ullAvailPageFile / pow(1024.0, printInfo.unit)); printInfo.tSwap += round(pageFiles.at(i).totalSwap / pow(1024.0, printInfo.unit));
printInfo.percentFree = 100.0 * MemBuf.ullAvailPageFile / MemBuf.ullTotalPageFile; printInfo.aSwap += round(pageFiles.at(i).availableSpwap / pow(1024.0, printInfo.unit));
}
printInfo.percentFree = 100.0 * printInfo.aSwap / printInfo.tSwap;
return -1; return -1;
} }