summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/check_ssh.c76
1 files changed, 34 insertions, 42 deletions
diff --git a/plugins/check_ssh.c b/plugins/check_ssh.c
index b12cda1d..42a88cf9 100644
--- a/plugins/check_ssh.c
+++ b/plugins/check_ssh.c
@@ -49,7 +49,7 @@ static char *remote_version = NULL;
49static char *remote_protocol = NULL; 49static char *remote_protocol = NULL;
50static bool verbose = false; 50static bool verbose = false;
51 51
52static int process_arguments(int, char **); 52static int process_arguments(int /*argc*/, char ** /*argv*/);
53static int validate_arguments(void); 53static int validate_arguments(void);
54static void print_help(void); 54static void print_help(void);
55void print_usage(void); 55void print_usage(void);
@@ -57,8 +57,6 @@ void print_usage(void);
57static int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_protocol); 57static int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_protocol);
58 58
59int main(int argc, char **argv) { 59int 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 */
86int process_arguments(int argc, char **argv) { 84int 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
197int ssh_connect(char *haddr, int hport, char *remote_version, char *remote_protocol) { 194int 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