Commit 33630ee2678b8455810490918974908cf09d14e4
1 parent
50560f6d
Added freebsd version of memfree
Showing
6 changed files
with
305 additions
and
0 deletions
check_memfree_freebsd/README.md
0 → 100644
1 | +``` | |
2 | +check_memfree v1.0 | |
3 | + | |
4 | +Check free memory space on local machine. | |
5 | + | |
6 | +Usage: | |
7 | +check_memfree [-hV] -w <percent_free>% -c <percent_free>% | |
8 | +check_memfree [-hV] -w <bytes_free> -c <bytes_free> | |
9 | + | |
10 | +Options: | |
11 | + -h | |
12 | + Print detailed help screen | |
13 | + -V | |
14 | + Print version information | |
15 | + -w INTEGER | |
16 | + Exit with WARNING status if less than INTEGER bytes of memory space are free | |
17 | + -w PERCENT% | |
18 | + Exit with WARNING status if less than PERCENT of memory space is free | |
19 | + -c INTEGER | |
20 | + Exit with CRITICAL status if less than INTEGER bytes of memory space are free | |
21 | + -c PERCENT% | |
22 | + Exit with CRITCAL status if less than PERCENT of memory space is free | |
23 | +``` | ... | ... |
check_memfree_freebsd/check_memfree
0 → 100755
No preview for this file type
check_memfree_freebsd/check_memfree.cpp
0 → 100644
1 | +#include "check_memfree.h" | |
2 | + | |
3 | +using namespace std; | |
4 | + | |
5 | +char *servicename = (char*)"MEMORY"; | |
6 | + | |
7 | +int getNum(string cmd) | |
8 | +{ | |
9 | + char buffer[128]; | |
10 | + stringstream sstr; | |
11 | + FILE* pipe = popen(cmd.c_str(), "r"); | |
12 | + while (!feof(pipe)) | |
13 | + { | |
14 | + if (fgets(buffer, 128, pipe) != NULL) | |
15 | + { | |
16 | + sstr.str(sstr.str()+buffer); | |
17 | + } | |
18 | + } | |
19 | + pclose(pipe); | |
20 | + int num; | |
21 | + sstr >> num; | |
22 | + return num; | |
23 | +} | |
24 | + | |
25 | +void printVersion() | |
26 | +{ | |
27 | + cout << "check_memfree v" << VERSION << endl << endl; | |
28 | +} | |
29 | + | |
30 | +void printHelp(bool longVersion) | |
31 | +{ | |
32 | + if(longVersion) | |
33 | + { | |
34 | + printVersion(); | |
35 | + cout << "Check free memory space on local machine." << endl << endl; | |
36 | + printHelp(false); | |
37 | + cout << "Options:" << endl; | |
38 | + cout << " -h" << endl; | |
39 | + cout << " Print detailed help screen" << endl; | |
40 | + cout << " -V" << endl; | |
41 | + cout << " Print version information" << endl; | |
42 | + cout << " -w INTEGER" << endl; | |
43 | + cout << " Exit with WARNING status if less than INTEGER bytes of memory space are free" << endl; | |
44 | + cout << " -w PERCENT%" << endl; | |
45 | + cout << " Exit with WARNING status if less than PERCENT of memory space is free" << endl; | |
46 | + cout << " -c INTEGER" << endl; | |
47 | + cout << " Exit with CRITICAL status if less than INTEGER bytes of memory space are free" << endl; | |
48 | + cout << " -c PERCENT%" << endl; | |
49 | + cout << " Exit with CRITCAL status if less than PERCENT of memory space is free" << endl << endl; | |
50 | + return; | |
51 | + } | |
52 | + cout << "Usage: " << endl << "check_memfree [-hV] -w <percent_free>% -c <percent_free>%" << endl << "check_memfree [-hV] -w <bytes_free> -c <bytes_free>" << endl << endl; | |
53 | +} | |
54 | + | |
55 | +int main(int argc, char **argv) | |
56 | +{ | |
57 | + struct itimerval timer; | |
58 | + timer.it_value.tv_sec = 10; | |
59 | + timer.it_value.tv_usec = 0; | |
60 | + timer.it_interval.tv_sec = 0; | |
61 | + timer.it_interval.tv_usec = 0; | |
62 | + setitimer (ITIMER_VIRTUAL, &timer, 0); | |
63 | + | |
64 | + struct sigaction sa; | |
65 | + memset (&sa, 0, sizeof (sa)); | |
66 | + sa.sa_handler = &timer_handler; | |
67 | + sigaction (SIGVTALRM, &sa, 0); | |
68 | + | |
69 | + char *warningFlag = NULL; | |
70 | + char *criticalFlag = NULL; | |
71 | + int c; | |
72 | + | |
73 | + while ((c = getopt (argc, argv, "w:c:Vh")) != -1) | |
74 | + { | |
75 | + switch(c) | |
76 | + { | |
77 | + case 'w': | |
78 | + warningFlag = optarg; | |
79 | + break; | |
80 | + case 'c': | |
81 | + criticalFlag = optarg; | |
82 | + break; | |
83 | + case 'V': | |
84 | + printVersion(); | |
85 | + return 0; | |
86 | + case 'h': | |
87 | + printHelp(true); | |
88 | + return 0; | |
89 | + case '?': | |
90 | + printHelp(false); | |
91 | + return 3; | |
92 | + } | |
93 | + } | |
94 | + | |
95 | + if(warningFlag == NULL) | |
96 | + { | |
97 | + cout << "Warning limit (-w) wasn't set. Exiting." << endl; | |
98 | + return 3; | |
99 | + } | |
100 | + if(criticalFlag == NULL) | |
101 | + { | |
102 | + cout << "Critical limit (-w) wasn't set. Exiting." << endl; | |
103 | + return 3; | |
104 | + } | |
105 | + | |
106 | + double freeMem = 0; | |
107 | + double totalMem = 0; | |
108 | + double pageSize = 0; | |
109 | + | |
110 | + totalMem = getNum("sysctl hw.physmem | cut -d' ' -f 2") / 1024; | |
111 | + pageSize = getNum("sysctl hw.pagesize | cut -d' ' -f 2"); | |
112 | + | |
113 | + freeMem += getNum("sysctl vm.stats.vm.v_inactive_count | cut -d' ' -f 2") * pageSize; | |
114 | + freeMem += getNum("sysctl vm.stats.vm.v_cache_count | cut -d' ' -f 2") * pageSize; | |
115 | + freeMem += getNum("sysctl vm.stats.vm.v_free_count | cut -d' ' -f 2") * pageSize; | |
116 | + freeMem /= 1024; | |
117 | + | |
118 | + int freeMemMB = freeMem / 1024; | |
119 | + int totalMemMB = totalMem / 1024; | |
120 | + int percFree = ((double)freeMemMB/(double)totalMemMB)*100; | |
121 | + | |
122 | + range warningLimit, criticalLimit; | |
123 | + | |
124 | + try | |
125 | + { | |
126 | + warningLimit = parseRange(warningFlag,totalMemMB); | |
127 | + criticalLimit = parseRange(criticalFlag,totalMemMB); | |
128 | + } | |
129 | + catch(rangeException e) | |
130 | + { | |
131 | + cout << e.what() << endl; | |
132 | + exit(3); | |
133 | + } | |
134 | + | |
135 | + int returnCode; | |
136 | + | |
137 | + cout << servicename; | |
138 | + | |
139 | + if((freeMemMB > criticalLimit.min) && (freeMemMB < criticalLimit.max)) | |
140 | + { | |
141 | + cout << " CRITICAL"; | |
142 | + returnCode = 2; | |
143 | + } | |
144 | + else if((freeMemMB > warningLimit.min) && (freeMemMB < warningLimit.max)) | |
145 | + { | |
146 | + cout << " WARNING"; | |
147 | + returnCode = 1; | |
148 | + } | |
149 | + else | |
150 | + { | |
151 | + cout << " OK"; | |
152 | + returnCode = 0; | |
153 | + } | |
154 | + cout << " - " << percFree << "% free (" << freeMemMB << " MB out of " << totalMemMB << " MB) |memory=" << freeMemMB << "MB;" << warningLimit.max << ";" << criticalLimit.max << ";" << "0;" << totalMemMB << endl; | |
155 | + return returnCode; | |
156 | +} | ... | ... |
check_memfree_freebsd/check_memfree.h
0 → 100644
1 | +#ifndef CHECK_MEMFREE_H | |
2 | +#define CHECK_MEMFREE_H | |
3 | + | |
4 | +#include <iostream> | |
5 | +#include <sstream> | |
6 | +#include <fstream> | |
7 | +#include <limits> | |
8 | + | |
9 | +#include <ctype.h> | |
10 | +#include <cstdlib> | |
11 | +#include <unistd.h> | |
12 | +#include <cstring> | |
13 | +#include <cstdio> | |
14 | + | |
15 | +#include <sys/time.h> | |
16 | + | |
17 | +#include "range.h" | |
18 | +#include "aux.h" | |
19 | + | |
20 | +#define VERSION "1.0" | |
21 | + | |
22 | +int getNum(string cmd); | |
23 | +void printVersion(); | |
24 | +void printHelp(bool longVersion); | |
25 | + | |
26 | +#endif | ... | ... |
check_memfree_freebsd/range.cpp
0 → 100644
1 | +#include "range.h" | |
2 | + | |
3 | +range parseRange(char* input, int total) | |
4 | +{ | |
5 | + bool includeRange = false; | |
6 | + range r; | |
7 | + if(input[0] == '~') | |
8 | + { | |
9 | + if(strlen(input) > 2) | |
10 | + { | |
11 | + r.min = 0; | |
12 | + if(input[1] == ':') | |
13 | + { | |
14 | + if(input[strlen(input)-1] == '%') | |
15 | + { | |
16 | + input[strlen(input)-1] = '\0'; | |
17 | + r.max = total*((double)str2int(string(input+2))/100); | |
18 | + } | |
19 | + r.max = str2int(string(input+2)); | |
20 | + } | |
21 | + return r; | |
22 | + } | |
23 | + throw rangeException("Wrong range format or maximum and minimum are unsatisfiable"); | |
24 | + } | |
25 | + else if(input[0] == '@') | |
26 | + { | |
27 | + includeRange = true; | |
28 | + input++; | |
29 | + } | |
30 | + string str = string(input); | |
31 | + size_t pos = str.find_first_of(":"); | |
32 | + if(pos != string::npos) | |
33 | + { | |
34 | + if(str.find_first_of(":",pos+1) != string::npos) | |
35 | + { | |
36 | + throw rangeException("Wrong range format or maximum and minimum are unsatisfiable"); | |
37 | + } | |
38 | + if(str[pos-1] == '%') | |
39 | + { | |
40 | + r.min = total*((double)str2int(str.substr(0,pos-1))/100); | |
41 | + } | |
42 | + else | |
43 | + { | |
44 | + r.min = str2int(str.substr(0,pos)); | |
45 | + } | |
46 | + } | |
47 | + else | |
48 | + { | |
49 | + r.min = 0; | |
50 | + if(str[str.length()-1] == '%') | |
51 | + { | |
52 | + r.max = total*((double)str2int(str.substr(0,str.length()-1))/100); | |
53 | + } | |
54 | + else | |
55 | + { | |
56 | + r.max = str2int(str); | |
57 | + } | |
58 | + } | |
59 | + if(includeRange) | |
60 | + { | |
61 | + r.min--; | |
62 | + r.max++; | |
63 | + } | |
64 | + if(r.min > r.max) | |
65 | + { | |
66 | + throw rangeException("Wrong range format or maximum and minimum are unsatisfiable"); | |
67 | + } | |
68 | + return r; | |
69 | +} | ... | ... |
check_memfree_freebsd/range.h
0 → 100644
1 | +#ifndef RANGE_H | |
2 | +#define RANGE_H | |
3 | + | |
4 | +#include <exception> | |
5 | + | |
6 | +#include <string.h> | |
7 | + | |
8 | +#include "aux.h" | |
9 | + | |
10 | +struct range | |
11 | +{ | |
12 | + int min; | |
13 | + int max; | |
14 | +}; | |
15 | + | |
16 | +void wrongRange(); | |
17 | +range parseRange(char* input, int total); | |
18 | + | |
19 | +class rangeException : public exception | |
20 | +{ | |
21 | + public: | |
22 | + rangeException(std::string ss) : s(ss) {} | |
23 | + ~rangeException() throw () {} | |
24 | + const char* what() const throw() { return s.c_str(); } | |
25 | + private: | |
26 | + string s; | |
27 | +}; | |
28 | + | |
29 | +#endif | |
30 | + | |
31 | + | ... | ... |