]> granicus.if.org Git - icinga2/blobdiff - plugins/check_swap.cpp
Add summarized performance data to check_network
[icinga2] / plugins / check_swap.cpp
index 51f8bde22111cc5eb68e277b294a1b79e55b30c5..dc08f3b3b98c12c431f1c94051ee6c8f4d5f84ef 100644 (file)
@@ -1,21 +1,4 @@
-/******************************************************************************
- * Icinga 2                                                                   *
- * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/)  *
- *                                                                            *
- * This program is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU General Public License                *
- * as published by the Free Software Foundation; either version 2             *
- * of the License, or (at your option) any later version.                     *
- *                                                                            *
- * This program is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
- * GNU General Public License for more details.                               *
- *                                                                            *
- * You should have received a copy of the GNU General Public License          *
- * along with this program; if not, write to the Free Software Foundation     *
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
- ******************************************************************************/
+/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
 
 #include "plugins/thresholds.hpp"
 #include <boost/program_options.hpp>
@@ -36,6 +19,7 @@ struct printInfoStruct
        double aSwap;
        double percentFree;
        Bunit unit = BunitMB;
+       bool showUsed;
 };
 
 struct pageFileInfo
@@ -46,7 +30,7 @@ struct pageFileInfo
 
 static bool l_Debug;
 
-BOOL EnumPageFilesProc(LPVOID pContext, PENUM_PAGE_FILE_INFORMATION pPageFileInfo, LPCTSTR lpFilename) {
+BOOL EnumPageFilesProc(LPVOID pContext, PENUM_PAGE_FILE_INFORMATION pPageFileInfo, LPCWSTR lpFilename) {
        std::vector<pageFileInfo>* pageFile = static_cast<std::vector<pageFileInfo>*>(pContext);
        SYSTEM_INFO systemInfo;
 
@@ -73,6 +57,7 @@ static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoSt
                ("warning,w", po::wvalue<std::wstring>(), "Warning threshold")
                ("critical,c", po::wvalue<std::wstring>(), "Critical threshold")
                ("unit,u", po::wvalue<std::wstring>(), "The unit to use for display (default MB)")
+               ("show-used,U", "Show used swap instead of the free swap")
                ;
 
        po::wcommand_line_parser parser(ac, av);
@@ -167,6 +152,12 @@ static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoSt
                }
        }
 
+       if (vm.count("show-used")) {
+               printInfo.showUsed = true;
+               printInfo.warn.legal = true;
+               printInfo.crit.legal = true;
+       }
+
        return -1;
 }
 
@@ -177,39 +168,42 @@ static int printOutput(printInfoStruct& printInfo)
 
        state state = OK;
 
-       if (printInfo.warn.rend(printInfo.aSwap, printInfo.tSwap))
+       std::wcout << L"SWAP ";
+
+       double currentValue;
+
+       if (!printInfo.showUsed)
+               currentValue = printInfo.aSwap;
+       else
+               currentValue = printInfo.tSwap - printInfo.aSwap;
+
+       if (printInfo.warn.rend(currentValue, printInfo.tSwap))
                state = WARNING;
 
-       if (printInfo.crit.rend(printInfo.aSwap, printInfo.tSwap))
+       if (printInfo.crit.rend(currentValue, printInfo.tSwap))
                state = CRITICAL;
 
-       switch (state) {
-       case OK:
-               std::wcout << L"SWAP OK - " << printInfo.percentFree << L"% free | 'swap'=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";"
-                       << printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap)
-                       << L";0;" << printInfo.tSwap << '\n';
-               break;
-       case WARNING:
-               std::wcout << L"SWAP WARNING - " << printInfo.percentFree << L"% free | 'swap'=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";"
-                       << printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap)
-                       << L";0;" << printInfo.tSwap << '\n';
-               break;
-       case CRITICAL:
-               std::wcout << L"SWAP CRITICAL - " << printInfo.percentFree << L"% free | 'swap'=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";"
-                       << printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap)
-                       << L";0;" << printInfo.tSwap << '\n';
-               break;
-       }
+       std::wcout << stateToString(state) << " - ";
+
+       if (!printInfo.showUsed)
+               std::wcout << printInfo.percentFree << L"% free ";
+       else
+               std::wcout << 100 - printInfo.percentFree << L"% used ";
+
+       std::wcout << "| 'swap'=" << currentValue << BunitStr(printInfo.unit) << L";"
+               << printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap)
+               << L";0;" << printInfo.tSwap << '\n';
 
        return state;
 }
 
 static int check_swap(printInfoStruct& printInfo)
 {
-       PENUM_PAGE_FILE_CALLBACK pageFileCallback = &EnumPageFilesProc;
+       // Needs explicit cast: http://msinilo.pl/blog2/post/p1348/
+       PENUM_PAGE_FILE_CALLBACKW pageFileCallback = (PENUM_PAGE_FILE_CALLBACKW)EnumPageFilesProc;
        std::vector<pageFileInfo> pageFiles;
 
-       if(!EnumPageFiles(pageFileCallback, &pageFiles)) {
+       if(!EnumPageFilesW(pageFileCallback, &pageFiles)) {
                printErrorInfo();
                return 3;
        }
@@ -219,7 +213,10 @@ static int check_swap(printInfoStruct& printInfo)
                printInfo.aSwap += round(pageFiles.at(i).availableSpwap / pow(1024.0, printInfo.unit));
        }
 
-       printInfo.percentFree = 100.0 * printInfo.aSwap / printInfo.tSwap;
+       if (printInfo.aSwap > 0 && printInfo.tSwap > 0)
+               printInfo.percentFree = 100.0 * printInfo.aSwap / printInfo.tSwap;
+       else
+               printInfo.percentFree = 0;
 
        return -1;
 }