diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/check_smtp.c | 76 |
1 files changed, 54 insertions, 22 deletions
diff --git a/plugins/check_smtp.c b/plugins/check_smtp.c index 8c4f26e3..75cd5a8d 100644 --- a/plugins/check_smtp.c +++ b/plugins/check_smtp.c | |||
| @@ -40,9 +40,15 @@ void print_usage (void); | |||
| 40 | int server_port = SMTP_PORT; | 40 | int server_port = SMTP_PORT; |
| 41 | char *server_address = NULL; | 41 | char *server_address = NULL; |
| 42 | char *server_expect = NULL; | 42 | char *server_expect = NULL; |
| 43 | int smtp_use_dummycmd = 1; | 43 | int smtp_use_dummycmd = 0; |
| 44 | char *mail_command; | 44 | char *mail_command = NULL; |
| 45 | char *from_arg; | 45 | char *from_arg = NULL; |
| 46 | int ncommands=0; | ||
| 47 | int command_size=0; | ||
| 48 | int nresponses=0; | ||
| 49 | int response_size=0; | ||
| 50 | char **commands = NULL; | ||
| 51 | char **responses = NULL; | ||
| 46 | int warning_time = 0; | 52 | int warning_time = 0; |
| 47 | int check_warning_time = FALSE; | 53 | int check_warning_time = FALSE; |
| 48 | int critical_time = 0; | 54 | int critical_time = 0; |
| @@ -58,11 +64,12 @@ int | |||
| 58 | main (int argc, char **argv) | 64 | main (int argc, char **argv) |
| 59 | { | 65 | { |
| 60 | int sd; | 66 | int sd; |
| 67 | int n = 0; | ||
| 61 | double elapsed_time; | 68 | double elapsed_time; |
| 62 | long microsec; | 69 | long microsec; |
| 63 | int result = STATE_UNKNOWN; | 70 | int result = STATE_UNKNOWN; |
| 64 | char buffer[MAX_INPUT_BUFFER]; | 71 | char buffer[MAX_INPUT_BUFFER]; |
| 65 | char *from_str = NULL; | 72 | char *cmd_str = NULL; |
| 66 | char *helocmd = NULL; | 73 | char *helocmd = NULL; |
| 67 | struct timeval tv; | 74 | struct timeval tv; |
| 68 | 75 | ||
| @@ -82,10 +89,10 @@ main (int argc, char **argv) | |||
| 82 | asprintf (&helocmd, "%s%s%s", SMTP_HELO, helocmd, "\r\n"); | 89 | asprintf (&helocmd, "%s%s%s", SMTP_HELO, helocmd, "\r\n"); |
| 83 | 90 | ||
| 84 | /* initialize the MAIL command with optional FROM command */ | 91 | /* initialize the MAIL command with optional FROM command */ |
| 85 | asprintf (&from_str, "%sFROM: %s%s", mail_command, from_arg, "\r\n"); | 92 | asprintf (&cmd_str, "%sFROM: %s%s", mail_command, from_arg, "\r\n"); |
| 86 | 93 | ||
| 87 | if (verbose) | 94 | if (verbose && smtp_use_dummycmd) |
| 88 | printf ("FROMCMD: %s\n", from_str); | 95 | printf ("FROM CMD: %s", cmd_str); |
| 89 | 96 | ||
| 90 | /* initialize alarm signal handling */ | 97 | /* initialize alarm signal handling */ |
| 91 | (void) signal (SIGALRM, socket_timeout_alarm_handler); | 98 | (void) signal (SIGALRM, socket_timeout_alarm_handler); |
| @@ -99,8 +106,7 @@ main (int argc, char **argv) | |||
| 99 | /* try to connect to the host at the given port number */ | 106 | /* try to connect to the host at the given port number */ |
| 100 | result = my_tcp_connect (server_address, server_port, &sd); | 107 | result = my_tcp_connect (server_address, server_port, &sd); |
| 101 | 108 | ||
| 102 | /* we connected, so close connection before exiting */ | 109 | if (result == STATE_OK) { /* we connected */ |
| 103 | if (result == STATE_OK) { | ||
| 104 | 110 | ||
| 105 | /* watch for the SMTP connection string and */ | 111 | /* watch for the SMTP connection string and */ |
| 106 | /* return a WARNING status if we couldn't read any data */ | 112 | /* return a WARNING status if we couldn't read any data */ |
| @@ -109,6 +115,8 @@ main (int argc, char **argv) | |||
| 109 | result = STATE_WARNING; | 115 | result = STATE_WARNING; |
| 110 | } | 116 | } |
| 111 | else { | 117 | else { |
| 118 | if (verbose) | ||
| 119 | printf ("%s", buffer); | ||
| 112 | /* strip the buffer of carriage returns */ | 120 | /* strip the buffer of carriage returns */ |
| 113 | strip (buffer); | 121 | strip (buffer); |
| 114 | /* make sure we find the response we are looking for */ | 122 | /* make sure we find the response we are looking for */ |
| @@ -139,16 +147,25 @@ main (int argc, char **argv) | |||
| 139 | * Use the -f option to provide a FROM address | 147 | * Use the -f option to provide a FROM address |
| 140 | */ | 148 | */ |
| 141 | if (smtp_use_dummycmd) { | 149 | if (smtp_use_dummycmd) { |
| 142 | 150 | send(sd, cmd_str, strlen(cmd_str), 0); | |
| 143 | send(sd, from_str, strlen(from_str), 0); | ||
| 144 | |||
| 145 | /* allow for response to mail_command to reach us */ | ||
| 146 | recv(sd, buffer, MAX_INPUT_BUFFER-1, 0); | 151 | recv(sd, buffer, MAX_INPUT_BUFFER-1, 0); |
| 147 | |||
| 148 | if (verbose) | 152 | if (verbose) |
| 149 | printf(_("DUMMYCMD: %s\n%s\n"),from_str,buffer); | 153 | printf("%s", buffer); |
| 154 | } | ||
| 150 | 155 | ||
| 151 | } /* smtp_use_dummycmd */ | 156 | while (n < ncommands) { |
| 157 | asprintf (&cmd_str, "%s%s", commands[n], "\r\n"); | ||
| 158 | send(sd, cmd_str, strlen(cmd_str), 0); | ||
| 159 | recv(sd, buffer, MAX_INPUT_BUFFER-1, 0); | ||
| 160 | if (verbose) | ||
| 161 | printf("%s", buffer); | ||
| 162 | strip (buffer); | ||
| 163 | if (n < nresponses && strstr(buffer, responses[n])!=buffer) { | ||
| 164 | result = STATE_WARNING; | ||
| 165 | printf (_("SMTP %s - Invalid response '%s' to command '%s'\n"), state_text (result), buffer, commands[n]); | ||
| 166 | } | ||
| 167 | n++; | ||
| 168 | } | ||
| 152 | 169 | ||
| 153 | /* tell the server we're done */ | 170 | /* tell the server we're done */ |
| 154 | send (sd, SMTP_QUIT, strlen (SMTP_QUIT), 0); | 171 | send (sd, SMTP_QUIT, strlen (SMTP_QUIT), 0); |
| @@ -200,6 +217,7 @@ process_arguments (int argc, char **argv) | |||
| 200 | {"port", required_argument, 0, 'p'}, | 217 | {"port", required_argument, 0, 'p'}, |
| 201 | {"from", required_argument, 0, 'f'}, | 218 | {"from", required_argument, 0, 'f'}, |
| 202 | {"command", required_argument, 0, 'C'}, | 219 | {"command", required_argument, 0, 'C'}, |
| 220 | {"response", required_argument, 0, 'R'}, | ||
| 203 | {"nocommand", required_argument, 0, 'n'}, | 221 | {"nocommand", required_argument, 0, 'n'}, |
| 204 | {"verbose", no_argument, 0, 'v'}, | 222 | {"verbose", no_argument, 0, 'v'}, |
| 205 | {"version", no_argument, 0, 'V'}, | 223 | {"version", no_argument, 0, 'V'}, |
| @@ -222,7 +240,7 @@ process_arguments (int argc, char **argv) | |||
| 222 | } | 240 | } |
| 223 | 241 | ||
| 224 | while (1) { | 242 | while (1) { |
| 225 | c = getopt_long (argc, argv, "+hVv46t:p:f:e:c:w:H:C:", | 243 | c = getopt_long (argc, argv, "+hVv46t:p:f:e:c:w:H:C:R:", |
| 226 | longopts, &option); | 244 | longopts, &option); |
| 227 | 245 | ||
| 228 | if (c == -1 || c == EOF) | 246 | if (c == -1 || c == EOF) |
| @@ -245,16 +263,30 @@ process_arguments (int argc, char **argv) | |||
| 245 | break; | 263 | break; |
| 246 | case 'f': /* from argument */ | 264 | case 'f': /* from argument */ |
| 247 | from_arg = optarg; | 265 | from_arg = optarg; |
| 266 | smtp_use_dummycmd = 1; | ||
| 248 | break; | 267 | break; |
| 249 | case 'e': /* server expect string on 220 */ | 268 | case 'e': /* server expect string on 220 */ |
| 250 | server_expect = optarg; | 269 | server_expect = optarg; |
| 251 | break; | 270 | break; |
| 252 | case 'C': /* server expect string on 220 */ | 271 | case 'C': /* commands */ |
| 253 | mail_command = optarg; | 272 | if (ncommands >= command_size) { |
| 254 | smtp_use_dummycmd = 1; | 273 | commands = realloc (commands, command_size+8); |
| 274 | if (commands == NULL) | ||
| 275 | die (STATE_UNKNOWN, | ||
| 276 | _("Could not realloc() units [%d]\n"), ncommands); | ||
| 277 | } | ||
| 278 | commands[ncommands] = optarg; | ||
| 279 | ncommands++; | ||
| 255 | break; | 280 | break; |
| 256 | case 'n': /* server expect string on 220 */ | 281 | case 'R': /* server responses */ |
| 257 | smtp_use_dummycmd = 0; | 282 | if (nresponses >= response_size) { |
| 283 | responses = realloc (responses, response_size+8); | ||
| 284 | if (responses == NULL) | ||
| 285 | die (STATE_UNKNOWN, | ||
| 286 | _("Could not realloc() units [%d]\n"), nresponses); | ||
| 287 | } | ||
| 288 | responses[nresponses] = optarg; | ||
| 289 | nresponses++; | ||
| 258 | break; | 290 | break; |
| 259 | case 'c': /* critical time threshold */ | 291 | case 'c': /* critical time threshold */ |
| 260 | if (is_intnonneg (optarg)) { | 292 | if (is_intnonneg (optarg)) { |
