]> granicus.if.org Git - icinga2/commitdiff
Fix wrong calculation of check_swap windows plugin 6313/head
authorMichael Insel <michael@insel.email>
Tue, 15 May 2018 18:44:34 +0000 (20:44 +0200)
committerMichael Insel <michael@insel.email>
Sat, 23 Jun 2018 22:24:14 +0000 (00:24 +0200)
This fixes the wrong calculation of the check_swap windows plugin.

plugins/check_swap.cpp

index d405a094f8c525a9cea6d6c8609b4b0c1f64d412..4c317dbac17d0bf107f87f3d15b66d1f31067a6d 100644 (file)
@@ -21,7 +21,8 @@
 #include <boost/program_options.hpp>
 #include <iostream>
 #include <shlwapi.h>
-#include <winbase.h>
+#include <Psapi.h>
+#include <vector>
 
 #define VERSION 1.0
 
@@ -37,8 +38,26 @@ struct printInfoStruct
        Bunit unit = BunitMB;
 };
 
+struct pageFileInfo
+{
+       SIZE_T totalSwap;
+       SIZE_T availableSpwap;
+};
+
 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)
 {
        WCHAR namePath[MAX_PATH];
@@ -187,17 +206,20 @@ static int printOutput(printInfoStruct& printInfo)
 
 static int check_swap(printInfoStruct& printInfo)
 {
-       MEMORYSTATUSEX MemBuf;
-       MemBuf.dwLength = sizeof(MemBuf);
+       PENUM_PAGE_FILE_CALLBACK pageFileCallback = &EnumPageFilesProc;
+       std::vector<pageFileInfo> pageFiles;
 
-       if (!GlobalMemoryStatusEx(&MemBuf)) {
+       if(!EnumPageFiles(pageFileCallback, &pageFiles)) {
                printErrorInfo();
                return 3;
        }
 
-       printInfo.tSwap = round(MemBuf.ullTotalPageFile / pow(1024.0, printInfo.unit));
-       printInfo.aSwap = round(MemBuf.ullAvailPageFile / pow(1024.0, printInfo.unit));
-       printInfo.percentFree = 100.0 * MemBuf.ullAvailPageFile / MemBuf.ullTotalPageFile;
+       for (int i = 0; i < pageFiles.size(); i++) {
+               printInfo.tSwap += round(pageFiles.at(i).totalSwap / pow(1024.0, printInfo.unit));
+               printInfo.aSwap += round(pageFiles.at(i).availableSpwap / pow(1024.0, printInfo.unit));
+       }
+
+       printInfo.percentFree = 100.0 * printInfo.aSwap / printInfo.tSwap;
 
        return -1;
 }