Commit be710417c186e60a42989ffe1147ace4638021b0
1 parent
94ddb039
Added check_openvpn
Showing
8 changed files
with
436 additions
and
0 deletions
CMakeLists.txt
@@ -21,3 +21,6 @@ add_executable(check_smart ${SOURCE_FILES_SMART}) | @@ -21,3 +21,6 @@ add_executable(check_smart ${SOURCE_FILES_SMART}) | ||
21 | set(SOURCE_FILES_TFTP check_tftp/check_tftp.cpp check_tftp/udp.cpp check_tftp/auxiliar.cpp) | 21 | set(SOURCE_FILES_TFTP check_tftp/check_tftp.cpp check_tftp/udp.cpp check_tftp/auxiliar.cpp) |
22 | add_executable(check_tftp ${SOURCE_FILES_TFTP}) | 22 | add_executable(check_tftp ${SOURCE_FILES_TFTP}) |
23 | 23 | ||
24 | +set(SOURCE_FILES_OPENVPN check_openvpn/check_openvpn.cpp check_openvpn/tcp.cpp check_openvpn/auxiliar.cpp) | ||
25 | +add_executable(check_openvpn ${SOURCE_FILES_OPENVPN}) | ||
26 | + |
check_openvpn/README.md
0 โ 100755
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_openvpn/auxiliar.cpp
0 โ 100755
1 | +// | ||
2 | +// Created by Imanol on 28-may-16. | ||
3 | +// | ||
4 | + | ||
5 | +#include "auxiliar.h" | ||
6 | + | ||
7 | +void timer_handler (int signum) | ||
8 | +{ | ||
9 | + if(signum == SIGVTALRM) | ||
10 | + { | ||
11 | + cout << servicename << " CRITICAL - timeout occurred" << endl; | ||
12 | + exit(2); | ||
13 | + } | ||
14 | +} | ||
15 | + | ||
16 | +int str2int(string str) | ||
17 | +{ | ||
18 | + int num; | ||
19 | + stringstream sstream; | ||
20 | + sstream << str; | ||
21 | + if(!(sstream >> num)) | ||
22 | + { | ||
23 | + throw integerConversionException("Integer conversion error"); | ||
24 | + } | ||
25 | + return num; | ||
26 | +} | ||
27 | + | ||
28 | +string int2str(int x) | ||
29 | +{ | ||
30 | + string str; | ||
31 | + stringstream sstream; | ||
32 | + sstream << x; | ||
33 | + sstream >> str; | ||
34 | + return str; | ||
35 | +} | ||
36 | + | ||
37 | +void split(const string &s, const char* delim, vector<string> & v) | ||
38 | +{ | ||
39 | + char *dup = strdup(s.c_str()); | ||
40 | + char *token = strtok(dup, delim); | ||
41 | + while(token != NULL) | ||
42 | + { | ||
43 | + v.push_back(string(token)); | ||
44 | + token = strtok(NULL, delim); | ||
45 | + } | ||
46 | + free(dup); | ||
47 | +} | ||
48 | + | ||
49 | +int exec(string cmd, string *output) | ||
50 | +{ | ||
51 | + *output = ""; | ||
52 | + FILE* pipe = popen(cmd.c_str(), "r"); | ||
53 | + if (!pipe) | ||
54 | + { | ||
55 | + cout << "Error opening child process" << endl; | ||
56 | + exit(3); | ||
57 | + } | ||
58 | + char buffer[128]; | ||
59 | + while(!feof(pipe)) | ||
60 | + { | ||
61 | + if(fgets(buffer, 128, pipe) != NULL) | ||
62 | + { | ||
63 | + *output += buffer; | ||
64 | + } | ||
65 | + } | ||
66 | + return pclose(pipe)/256; | ||
67 | +} |
check_openvpn/auxiliar.h
0 โ 100755
1 | +// | ||
2 | +// Created by Imanol on 28-may-16. | ||
3 | +// | ||
4 | + | ||
5 | +#ifndef NAGIOS_PLUGINS_AUXILIAR_H | ||
6 | +#define NAGIOS_PLUGINS_AUXILIAR_H | ||
7 | + | ||
8 | +#include <sstream> | ||
9 | +#include <iostream> | ||
10 | +#include <exception> | ||
11 | +#include <vector> | ||
12 | + | ||
13 | +#include <string.h> | ||
14 | +#include <stdlib.h> | ||
15 | +#include <stdio.h> | ||
16 | +#include <signal.h> | ||
17 | + | ||
18 | +using namespace std; | ||
19 | + | ||
20 | +extern char *servicename; | ||
21 | + | ||
22 | +int str2int(string str); | ||
23 | +string int2str(int x); | ||
24 | +int exec(string cmd, string *output); | ||
25 | +void timer_handler (int signum); | ||
26 | +void split(const string &s, const char* delim, vector<string> & v); | ||
27 | + | ||
28 | +class integerConversionException : public exception | ||
29 | +{ | ||
30 | +private: | ||
31 | + string s; | ||
32 | +public: | ||
33 | + integerConversionException(std::string ss) : s(ss) {} | ||
34 | + ~integerConversionException() throw () {} | ||
35 | + const char* what() const throw() { return s.c_str(); } | ||
36 | +}; | ||
37 | + | ||
38 | +#endif //NAGIOS_PLUGINS_AUXILIAR_H |
check_openvpn/check_openvpn.cpp
0 โ 100755
1 | +#include "check_openvpn.h" | ||
2 | + | ||
3 | +using namespace std; | ||
4 | + | ||
5 | +char *servicename = (char*)"OpenVPN"; | ||
6 | + | ||
7 | +void printVersion() | ||
8 | +{ | ||
9 | + cout << "check_openvpn v" << VERSION << endl << endl; | ||
10 | +} | ||
11 | + | ||
12 | +void printHelp(bool longVersion) | ||
13 | +{ | ||
14 | + if(longVersion) | ||
15 | + { | ||
16 | + printVersion(); | ||
17 | + cout << "Check OpenVPN server" << endl << endl; | ||
18 | + printHelp(false); | ||
19 | + cout << "Options:" << endl; | ||
20 | + cout << " -h" << endl; | ||
21 | + cout << " Print detailed help screen" << endl; | ||
22 | + cout << " -V" << endl; | ||
23 | + cout << " Print version information" << endl; | ||
24 | + cout << " -H HOSTADDRESS" << endl; | ||
25 | + cout << " Host where the UPnP server is running" << endl; | ||
26 | + cout << " -p PORT" << endl; | ||
27 | + cout << " OpenVPN Administration port" << endl; | ||
28 | + cout << " -P PASSWORD" << endl; | ||
29 | + cout << " OpenVPN Administration password" << endl; | ||
30 | + return; | ||
31 | + } | ||
32 | + cout << "Usage: " << endl << "check_openvpn [-hV] -H HOSTADDRESS -p PORT -P PASSWORD" << endl << endl; | ||
33 | +} | ||
34 | + | ||
35 | +int check_openvpn(uint16_t port, char *hostname, char *password, string *serverinfo) | ||
36 | +{ | ||
37 | + size_t numClients = 0; | ||
38 | + string ipList = ""; | ||
39 | + char buffer[MAX_TCP+1]; | ||
40 | + int s; | ||
41 | + int timeout = 10; | ||
42 | + int bytes = 0; | ||
43 | + string output = ""; | ||
44 | + | ||
45 | + s = createSocket(); | ||
46 | + connect(s,port,hostname,timeout); | ||
47 | + while(output != "ENTER PASSWORD:") | ||
48 | + { | ||
49 | + recvMsg(s,buffer,MAX_TCP); | ||
50 | + output += buffer; | ||
51 | + memset(buffer,0x00,MAX_TCP+1); | ||
52 | + } | ||
53 | + sendMsg(s,strcat(password,"\n"),strlen(password)+1); | ||
54 | + output = ""; | ||
55 | + do | ||
56 | + { | ||
57 | + bytes = recvMsg(s,buffer,MAX_TCP); | ||
58 | + output += buffer; | ||
59 | + memset(buffer,0x00,MAX_TCP+1); | ||
60 | + }while(bytes); | ||
61 | + if(output == "ENTER PASSWORD:") | ||
62 | + { | ||
63 | + *serverinfo = "Incorrect password"; | ||
64 | + close(s); | ||
65 | + return 3; | ||
66 | + } | ||
67 | + output = ""; | ||
68 | + sendMsg(s,(char*)"status 2\n",9); | ||
69 | + do | ||
70 | + { | ||
71 | + bytes = recvMsg(s,buffer,MAX_TCP); | ||
72 | + output += buffer; | ||
73 | + memset(buffer,0x00,MAX_TCP+1); | ||
74 | + }while(output.rfind("END") != output.size()-5); | ||
75 | + vector<string> splitstr; | ||
76 | + vector<string> fields; | ||
77 | + split(output,"\n",splitstr); | ||
78 | + for(vector<string>::iterator it = splitstr.begin() ; it != splitstr.end(); ++it) | ||
79 | + { | ||
80 | + if(it->substr(0,11) == "CLIENT_LIST") | ||
81 | + { | ||
82 | + split(*it,",",fields); | ||
83 | + ipList += fields[3] + ","; | ||
84 | + numClients++; | ||
85 | + } | ||
86 | + } | ||
87 | + if(numClients) | ||
88 | + { | ||
89 | + ipList.pop_back(); | ||
90 | + } | ||
91 | + *serverinfo = int2str(numClients) + " clients connected (" + ipList + ")" ; | ||
92 | + close(s); | ||
93 | + return 0; | ||
94 | +} | ||
95 | + | ||
96 | +int main(int argc, char **argv) | ||
97 | +{ | ||
98 | + struct itimerval timer; | ||
99 | + timer.it_value.tv_sec = 10; | ||
100 | + timer.it_value.tv_usec = 0; | ||
101 | + timer.it_interval.tv_sec = 0; | ||
102 | + timer.it_interval.tv_usec = 0; | ||
103 | + setitimer (ITIMER_VIRTUAL, &timer, 0); | ||
104 | + | ||
105 | + struct sigaction sa; | ||
106 | + memset (&sa, 0, sizeof (sa)); | ||
107 | + sa.sa_handler = &timer_handler; | ||
108 | + sigaction (SIGVTALRM, &sa, 0); | ||
109 | + | ||
110 | + uint16_t port = 1195; | ||
111 | + char *hostname = NULL; | ||
112 | + char *password = NULL; | ||
113 | + int c; | ||
114 | + | ||
115 | + while ((c = getopt (argc, argv, "H:p:P:Vh")) != -1) | ||
116 | + { | ||
117 | + switch(c) | ||
118 | + { | ||
119 | + case 'H': | ||
120 | + hostname = optarg; | ||
121 | + break; | ||
122 | + case 'p': | ||
123 | + port = (uint16_t) str2int(optarg); | ||
124 | + break; | ||
125 | + case 'P': | ||
126 | + password = optarg; | ||
127 | + break; | ||
128 | + case 'V': | ||
129 | + printVersion(); | ||
130 | + return 0; | ||
131 | + case 'h': | ||
132 | + printHelp(true); | ||
133 | + return 0; | ||
134 | + case '?': | ||
135 | + printHelp(false); | ||
136 | + return 3; | ||
137 | + } | ||
138 | + } | ||
139 | + | ||
140 | + if(hostname == NULL) | ||
141 | + { | ||
142 | + cout << "No HOSTADDRESS specified. Exiting." << endl; | ||
143 | + return 3; | ||
144 | + } | ||
145 | + | ||
146 | + if(password == NULL) | ||
147 | + { | ||
148 | + cout << "No PASSWORD specified. Exiting." << endl; | ||
149 | + return 3; | ||
150 | + } | ||
151 | + | ||
152 | + string serverinfo = ""; | ||
153 | + int returnCode = check_openvpn(port,hostname,password,&serverinfo); | ||
154 | + | ||
155 | + cout << servicename; | ||
156 | + switch(returnCode) | ||
157 | + { | ||
158 | + case 0: | ||
159 | + cout << " OK - " << serverinfo << endl ; | ||
160 | + break; | ||
161 | + | ||
162 | + case 2: | ||
163 | + cout << " CRITICAL - No response" << endl; | ||
164 | + break; | ||
165 | + | ||
166 | + case 3: | ||
167 | + cout << " UNKNOWN - " << serverinfo << endl; | ||
168 | + } | ||
169 | + | ||
170 | + return returnCode; | ||
171 | +} |
check_openvpn/check_openvpn.h
0 โ 100755
1 | +#ifndef CHECK_OPENVPN_H | ||
2 | +#define CHECK_OPENVPN_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 <sys/time.h> | ||
14 | + | ||
15 | +#include "auxiliar.h" | ||
16 | +#include "tcp.h" | ||
17 | + | ||
18 | +#define VERSION "1.0" | ||
19 | + | ||
20 | +int check_openvpn(char *hostname, string *serverinfo); | ||
21 | +void printVersion(); | ||
22 | +void printHelp(bool longVersion); | ||
23 | + | ||
24 | +#endif |
check_openvpn/tcp.cpp
0 โ 100644
1 | +#include "tcp.h" | ||
2 | + | ||
3 | +int createSocket() | ||
4 | +{ | ||
5 | + int sockfd; | ||
6 | + if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) | ||
7 | + { | ||
8 | + cout << "Could not create socket" << endl; | ||
9 | + exit(3); | ||
10 | + } | ||
11 | + return sockfd; | ||
12 | +} | ||
13 | + | ||
14 | +void connect(int s, uint16_t port, char *hostname, int timeout) | ||
15 | +{ | ||
16 | + struct in_addr *addr_ptr; | ||
17 | + struct hostent *hostPtr; | ||
18 | + string add; | ||
19 | + hostPtr = gethostbyname(hostname); | ||
20 | + if(hostPtr == NULL) | ||
21 | + { | ||
22 | + cout << "Could not resolve hostname" << endl; | ||
23 | + exit(3); | ||
24 | + } | ||
25 | + addr_ptr = (struct in_addr *)*hostPtr->h_addr_list; | ||
26 | + add = inet_ntoa(*addr_ptr); | ||
27 | + if(add == "") | ||
28 | + { | ||
29 | + cout << "Invalid address" << endl; | ||
30 | + exit(3); | ||
31 | + } | ||
32 | + struct sockaddr_in newSockAddr; | ||
33 | + newSockAddr.sin_family = AF_INET; | ||
34 | + newSockAddr.sin_port = htons(port); | ||
35 | + newSockAddr.sin_addr.s_addr = inet_addr(add.c_str()); | ||
36 | + if(connect(s, (struct sockaddr *)&newSockAddr, sizeof(struct sockaddr)) != 0) | ||
37 | + { | ||
38 | + cout << "Could not connect to " << hostname << " on port " << port << endl; | ||
39 | + exit(3); | ||
40 | + } | ||
41 | + | ||
42 | + struct timeval tv; | ||
43 | + tv.tv_sec = timeout; | ||
44 | + tv.tv_usec = 0; | ||
45 | + if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0) | ||
46 | + { | ||
47 | + cout << "Error setting socket timeout" << endl; | ||
48 | + exit(3); | ||
49 | + } | ||
50 | + fcntl(s, F_SETFL, O_NONBLOCK); | ||
51 | +} | ||
52 | + | ||
53 | +int sendMsg(int s, const char *msg, size_t msgLength) | ||
54 | +{ | ||
55 | + int bytes, total = 0; | ||
56 | + while(total != msgLength) | ||
57 | + { | ||
58 | + bytes = send(s,msg+total,msgLength-total,0); | ||
59 | + if(bytes == -1) | ||
60 | + { | ||
61 | + cout << "TCP: Could not write to socket." << endl; | ||
62 | + exit(3); | ||
63 | + } | ||
64 | + total += bytes; | ||
65 | + } | ||
66 | + return total; | ||
67 | +} | ||
68 | + | ||
69 | +int recvMsg(int s, char *msg, size_t msgLength) | ||
70 | +{ | ||
71 | + int bytes, total = 0; | ||
72 | + while(total != msgLength) | ||
73 | + { | ||
74 | + bytes = recv(s, msg+total, msgLength-total,0); | ||
75 | + if ( bytes <= 0 ) | ||
76 | + { | ||
77 | + if(errno == EWOULDBLOCK || errno == EAGAIN) | ||
78 | + { | ||
79 | + return 0; | ||
80 | + } | ||
81 | + cout << "TCP: Could not read from socket." << endl; | ||
82 | + exit(3); | ||
83 | + } | ||
84 | + total += bytes; | ||
85 | + } | ||
86 | + return total; | ||
87 | +} |
check_openvpn/tcp.h
0 โ 100644
1 | +#ifndef TCP_H | ||
2 | +#define TCP_H | ||
3 | + | ||
4 | +#define MAX_TCP 65535 | ||
5 | + | ||
6 | +#include <iostream> | ||
7 | + | ||
8 | +#include <string.h> | ||
9 | +#include <cstdlib> | ||
10 | + | ||
11 | +#include <errno.h> | ||
12 | +#include <arpa/inet.h> | ||
13 | +#include <sys/socket.h> | ||
14 | +#include <netdb.h> | ||
15 | +#include <fcntl.h> | ||
16 | +using namespace std; | ||
17 | + | ||
18 | +int createSocket(); | ||
19 | +void connect(int s, uint16_t port, char *hostname, int timeout); | ||
20 | +int sendMsg(int s, const char *msg, size_t msgLength); | ||
21 | +int recvMsg(int s, char *msg, size_t msgLength); | ||
22 | + | ||
23 | +#endif |