diff options
Diffstat (limited to 'plugins/check_ssh.c')
-rw-r--r-- | plugins/check_ssh.c | 76 |
1 files changed, 34 insertions, 42 deletions
diff --git a/plugins/check_ssh.c b/plugins/check_ssh.c index b12cda1..42a88cf 100644 --- a/plugins/check_ssh.c +++ b/plugins/check_ssh.c | |||
@@ -49,7 +49,7 @@ static char *remote_version = NULL; | |||
49 | static char *remote_protocol = NULL; | 49 | static char *remote_protocol = NULL; |
50 | static bool verbose = false; | 50 | static bool verbose = false; |
51 | 51 | ||
52 | static int process_arguments(int, char **); | 52 | static int process_arguments(int /*argc*/, char ** /*argv*/); |
53 | static int validate_arguments(void); | 53 | static int validate_arguments(void); |
54 | static void print_help(void); | 54 | static void print_help(void); |
55 | void print_usage(void); | 55 | void print_usage(void); |
@@ -57,8 +57,6 @@ void print_usage(void); | |||
57 | static int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_protocol); | 57 | static int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_protocol); |
58 | 58 | ||
59 | int main(int argc, char **argv) { | 59 | int main(int argc, char **argv) { |
60 | int result = STATE_UNKNOWN; | ||
61 | |||
62 | setlocale(LC_ALL, ""); | 60 | setlocale(LC_ALL, ""); |
63 | bindtextdomain(PACKAGE, LOCALEDIR); | 61 | bindtextdomain(PACKAGE, LOCALEDIR); |
64 | textdomain(PACKAGE); | 62 | textdomain(PACKAGE); |
@@ -75,7 +73,7 @@ int main(int argc, char **argv) { | |||
75 | alarm(socket_timeout); | 73 | alarm(socket_timeout); |
76 | 74 | ||
77 | /* ssh_connect exits if error is found */ | 75 | /* ssh_connect exits if error is found */ |
78 | result = ssh_connect(server_name, port, remote_version, remote_protocol); | 76 | int result = ssh_connect(server_name, port, remote_version, remote_protocol); |
79 | 77 | ||
80 | alarm(0); | 78 | alarm(0); |
81 | 79 | ||
@@ -84,9 +82,6 @@ int main(int argc, char **argv) { | |||
84 | 82 | ||
85 | /* process command-line arguments */ | 83 | /* process command-line arguments */ |
86 | int process_arguments(int argc, char **argv) { | 84 | int process_arguments(int argc, char **argv) { |
87 | int c; | ||
88 | |||
89 | int option = 0; | ||
90 | static struct option longopts[] = {{"help", no_argument, 0, 'h'}, | 85 | static struct option longopts[] = {{"help", no_argument, 0, 'h'}, |
91 | {"version", no_argument, 0, 'V'}, | 86 | {"version", no_argument, 0, 'V'}, |
92 | {"host", required_argument, 0, 'H'}, /* backward compatibility */ | 87 | {"host", required_argument, 0, 'H'}, /* backward compatibility */ |
@@ -103,17 +98,19 @@ int process_arguments(int argc, char **argv) { | |||
103 | if (argc < 2) | 98 | if (argc < 2) |
104 | return ERROR; | 99 | return ERROR; |
105 | 100 | ||
106 | for (c = 1; c < argc; c++) | 101 | for (int i = 1; i < argc; i++) |
107 | if (strcmp("-to", argv[c]) == 0) | 102 | if (strcmp("-to", argv[i]) == 0) |
108 | strcpy(argv[c], "-t"); | 103 | strcpy(argv[i], "-t"); |
109 | 104 | ||
110 | while (1) { | 105 | int option_char; |
111 | c = getopt_long(argc, argv, "+Vhv46t:r:H:p:P:", longopts, &option); | 106 | while (true) { |
107 | int option = 0; | ||
108 | option_char = getopt_long(argc, argv, "+Vhv46t:r:H:p:P:", longopts, &option); | ||
112 | 109 | ||
113 | if (c == -1 || c == EOF) | 110 | if (option_char == -1 || option_char == EOF) |
114 | break; | 111 | break; |
115 | 112 | ||
116 | switch (c) { | 113 | switch (option_char) { |
117 | case '?': /* help */ | 114 | case '?': /* help */ |
118 | usage5(); | 115 | usage5(); |
119 | case 'V': /* version */ | 116 | case 'V': /* version */ |
@@ -161,16 +158,16 @@ int process_arguments(int argc, char **argv) { | |||
161 | } | 158 | } |
162 | } | 159 | } |
163 | 160 | ||
164 | c = optind; | 161 | option_char = optind; |
165 | if (server_name == NULL && c < argc) { | 162 | if (server_name == NULL && option_char < argc) { |
166 | if (is_host(argv[c])) { | 163 | if (is_host(argv[option_char])) { |
167 | server_name = argv[c++]; | 164 | server_name = argv[option_char++]; |
168 | } | 165 | } |
169 | } | 166 | } |
170 | 167 | ||
171 | if (port == -1 && c < argc) { | 168 | if (port == -1 && option_char < argc) { |
172 | if (is_intpos(argv[c])) { | 169 | if (is_intpos(argv[option_char])) { |
173 | port = atoi(argv[c++]); | 170 | port = atoi(argv[option_char++]); |
174 | } else { | 171 | } else { |
175 | print_usage(); | 172 | print_usage(); |
176 | exit(STATE_UNKNOWN); | 173 | exit(STATE_UNKNOWN); |
@@ -195,34 +192,27 @@ int validate_arguments(void) { | |||
195 | *-----------------------------------------------------------------------*/ | 192 | *-----------------------------------------------------------------------*/ |
196 | 193 | ||
197 | int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_protocol) { | 194 | int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_protocol) { |
198 | int sd; | ||
199 | int result; | ||
200 | int len = 0; | ||
201 | ssize_t recv_ret = 0; | ||
202 | char *version_control_string = NULL; | ||
203 | char *buffer = NULL; | ||
204 | char *ssh_proto = NULL; | ||
205 | char *ssh_server = NULL; | ||
206 | static char *rev_no = VERSION; | ||
207 | struct timeval tv; | 195 | struct timeval tv; |
208 | |||
209 | gettimeofday(&tv, NULL); | 196 | gettimeofday(&tv, NULL); |
210 | 197 | ||
211 | result = my_tcp_connect(haddr, hport, &sd); | 198 | int socket; |
199 | int result = my_tcp_connect(haddr, hport, &socket); | ||
212 | 200 | ||
213 | if (result != STATE_OK) | 201 | if (result != STATE_OK) |
214 | return result; | 202 | return result; |
215 | 203 | ||
216 | char *output = (char *)calloc(BUFF_SZ + 1, sizeof(char)); | 204 | char *output = (char *)calloc(BUFF_SZ + 1, sizeof(char)); |
217 | 205 | char *buffer = NULL; | |
206 | ssize_t recv_ret = 0; | ||
207 | char *version_control_string = NULL; | ||
218 | ssize_t byte_offset = 0; | 208 | ssize_t byte_offset = 0; |
219 | 209 | while ((version_control_string == NULL) && (recv_ret = recv(socket, output + byte_offset, BUFF_SZ - byte_offset, 0) > 0)) { | |
220 | while ((version_control_string == NULL) && (recv_ret = recv(sd, output + byte_offset, BUFF_SZ - byte_offset, 0) > 0)) { | ||
221 | 210 | ||
222 | if (strchr(output, '\n')) { /* we've got at least one full line, start parsing*/ | 211 | if (strchr(output, '\n')) { /* we've got at least one full line, start parsing*/ |
223 | byte_offset = 0; | 212 | byte_offset = 0; |
224 | 213 | ||
225 | char *index = NULL; | 214 | char *index = NULL; |
215 | int len = 0; | ||
226 | while ((index = strchr(output + byte_offset, '\n')) != NULL) { | 216 | while ((index = strchr(output + byte_offset, '\n')) != NULL) { |
227 | /*Partition the buffer so that this line is a separate string, | 217 | /*Partition the buffer so that this line is a separate string, |
228 | * by replacing the newline with NUL*/ | 218 | * by replacing the newline with NUL*/ |
@@ -241,7 +231,7 @@ int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_proto | |||
241 | 231 | ||
242 | if (version_control_string == NULL) { | 232 | if (version_control_string == NULL) { |
243 | /* move unconsumed data to beginning of buffer, null rest */ | 233 | /* move unconsumed data to beginning of buffer, null rest */ |
244 | memmove((void *)output, (void *)output + byte_offset + 1, BUFF_SZ - len + 1); | 234 | memmove((void *)output, (void *)(output + byte_offset + 1), BUFF_SZ - len + 1); |
245 | memset(output + byte_offset + 1, 0, BUFF_SZ - byte_offset + 1); | 235 | memset(output + byte_offset + 1, 0, BUFF_SZ - byte_offset + 1); |
246 | 236 | ||
247 | /*start reading from end of current line chunk on next recv*/ | 237 | /*start reading from end of current line chunk on next recv*/ |
@@ -271,7 +261,8 @@ int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_proto | |||
271 | strip(version_control_string); | 261 | strip(version_control_string); |
272 | if (verbose) | 262 | if (verbose) |
273 | printf("%s\n", version_control_string); | 263 | printf("%s\n", version_control_string); |
274 | ssh_proto = version_control_string + 4; | 264 | |
265 | char *ssh_proto = version_control_string + 4; | ||
275 | 266 | ||
276 | /* | 267 | /* |
277 | * We assume the protoversion is of the form Major.Minor, although | 268 | * We assume the protoversion is of the form Major.Minor, although |
@@ -289,7 +280,7 @@ int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_proto | |||
289 | * "1.x" (e.g., "1.5" or "1.3")." | 280 | * "1.x" (e.g., "1.5" or "1.3")." |
290 | * - RFC 4253:5 | 281 | * - RFC 4253:5 |
291 | */ | 282 | */ |
292 | ssh_server = ssh_proto + strspn(ssh_proto, "0123456789.") + 1; /* (+1 for the '-' separating protoversion from softwareversion) */ | 283 | char *ssh_server = ssh_proto + strspn(ssh_proto, "0123456789.") + 1; /* (+1 for the '-' separating protoversion from softwareversion) */ |
293 | 284 | ||
294 | /* If there's a space in the version string, whatever's after the space is a comment | 285 | /* If there's a space in the version string, whatever's after the space is a comment |
295 | * (which is NOT part of the server name/version)*/ | 286 | * (which is NOT part of the server name/version)*/ |
@@ -303,14 +294,15 @@ int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_proto | |||
303 | } | 294 | } |
304 | ssh_proto[strspn(ssh_proto, "0123456789. ")] = 0; | 295 | ssh_proto[strspn(ssh_proto, "0123456789. ")] = 0; |
305 | 296 | ||
297 | static char *rev_no = VERSION; | ||
306 | xasprintf(&buffer, "SSH-%s-check_ssh_%s\r\n", ssh_proto, rev_no); | 298 | xasprintf(&buffer, "SSH-%s-check_ssh_%s\r\n", ssh_proto, rev_no); |
307 | send(sd, buffer, strlen(buffer), MSG_DONTWAIT); | 299 | send(socket, buffer, strlen(buffer), MSG_DONTWAIT); |
308 | if (verbose) | 300 | if (verbose) |
309 | printf("%s\n", buffer); | 301 | printf("%s\n", buffer); |
310 | 302 | ||
311 | if (remote_version && strcmp(remote_version, ssh_server)) { | 303 | if (remote_version && strcmp(remote_version, ssh_server)) { |
312 | printf(_("SSH CRITICAL - %s (protocol %s) version mismatch, expected '%s'\n"), ssh_server, ssh_proto, remote_version); | 304 | printf(_("SSH CRITICAL - %s (protocol %s) version mismatch, expected '%s'\n"), ssh_server, ssh_proto, remote_version); |
313 | close(sd); | 305 | close(socket); |
314 | exit(STATE_CRITICAL); | 306 | exit(STATE_CRITICAL); |
315 | } | 307 | } |
316 | 308 | ||
@@ -318,13 +310,13 @@ int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_proto | |||
318 | if (remote_protocol && strcmp(remote_protocol, ssh_proto)) { | 310 | if (remote_protocol && strcmp(remote_protocol, ssh_proto)) { |
319 | printf(_("SSH CRITICAL - %s (protocol %s) protocol version mismatch, expected '%s' | %s\n"), ssh_server, ssh_proto, remote_protocol, | 311 | printf(_("SSH CRITICAL - %s (protocol %s) protocol version mismatch, expected '%s' | %s\n"), ssh_server, ssh_proto, remote_protocol, |
320 | fperfdata("time", elapsed_time, "s", false, 0, false, 0, true, 0, true, (int)socket_timeout)); | 312 | fperfdata("time", elapsed_time, "s", false, 0, false, 0, true, 0, true, (int)socket_timeout)); |
321 | close(sd); | 313 | close(socket); |
322 | exit(STATE_CRITICAL); | 314 | exit(STATE_CRITICAL); |
323 | } | 315 | } |
324 | 316 | ||
325 | printf(_("SSH OK - %s (protocol %s) | %s\n"), ssh_server, ssh_proto, | 317 | printf(_("SSH OK - %s (protocol %s) | %s\n"), ssh_server, ssh_proto, |
326 | fperfdata("time", elapsed_time, "s", false, 0, false, 0, true, 0, true, (int)socket_timeout)); | 318 | fperfdata("time", elapsed_time, "s", false, 0, false, 0, true, 0, true, (int)socket_timeout)); |
327 | close(sd); | 319 | close(socket); |
328 | exit(STATE_OK); | 320 | exit(STATE_OK); |
329 | } | 321 | } |
330 | 322 | ||