diff options
-rw-r--r-- | plugins/check_smtp.c | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/plugins/check_smtp.c b/plugins/check_smtp.c index f96db49..4e5d3c8 100644 --- a/plugins/check_smtp.c +++ b/plugins/check_smtp.c | |||
@@ -52,8 +52,11 @@ | |||
52 | * | 52 | * |
53 | * According to rfc821 you can include a null reversepath in the from command | 53 | * According to rfc821 you can include a null reversepath in the from command |
54 | * - but a log message is generated on the smtp server. | 54 | * - but a log message is generated on the smtp server. |
55 | * | ||
56 | * Use the -f option to provide a FROM address | ||
55 | */ | 57 | */ |
56 | #define SMTP_DUMMYCMD "MAIL FROM:<>\r\n" | 58 | |
59 | #define SMTP_DUMMYCMD "MAIL " | ||
57 | #define SMTP_USE_DUMMYCMD 1 | 60 | #define SMTP_USE_DUMMYCMD 1 |
58 | #define SMTP_QUIT "QUIT\r\n" | 61 | #define SMTP_QUIT "QUIT\r\n" |
59 | 62 | ||
@@ -67,6 +70,7 @@ void print_usage (void); | |||
67 | int server_port = SMTP_PORT; | 70 | int server_port = SMTP_PORT; |
68 | char *server_address = NULL; | 71 | char *server_address = NULL; |
69 | char *server_expect = NULL; | 72 | char *server_expect = NULL; |
73 | char *from_arg = " "; | ||
70 | int warning_time = 0; | 74 | int warning_time = 0; |
71 | int check_warning_time = FALSE; | 75 | int check_warning_time = FALSE; |
72 | int critical_time = 0; | 76 | int critical_time = 0; |
@@ -80,16 +84,31 @@ main (int argc, char **argv) | |||
80 | int result; | 84 | int result; |
81 | char buffer[MAX_INPUT_BUFFER] = ""; | 85 | char buffer[MAX_INPUT_BUFFER] = ""; |
82 | char helocmd[255] = SMTP_HELO ; | 86 | char helocmd[255] = SMTP_HELO ; |
87 | char from_str[255] = SMTP_DUMMYCMD ; | ||
83 | char myhostname[248]; | 88 | char myhostname[248]; |
84 | 89 | ||
85 | 90 | ||
86 | if (process_arguments (argc, argv) != OK) | 91 | if (process_arguments (argc, argv) != OK) |
87 | usage ("Invalid command arguments supplied\n"); | 92 | usage ("Invalid command arguments supplied\n"); |
88 | 93 | ||
89 | /* initalize the HELO command with the localhostname */ | 94 | /* initialize the HELO command with the localhostname */ |
90 | gethostname(myhostname, sizeof(myhostname)); | 95 | gethostname(myhostname, sizeof(myhostname)); |
91 | strcat(helocmd, myhostname); | 96 | strcat(helocmd, myhostname); |
92 | strcat(helocmd, "\r\n"); | 97 | strcat(helocmd, "\r\n"); |
98 | |||
99 | /* initialize the MAIL command with optional FROM command */ | ||
100 | if (from_arg) { | ||
101 | strcat(from_str, "FROM: "); | ||
102 | strcat(from_str, from_arg); | ||
103 | } | ||
104 | /* terminate line with a CRLF */ | ||
105 | strcat(from_str, "\r\n"); | ||
106 | |||
107 | if (verbose == TRUE){ | ||
108 | printf ("FROMCMD: %s\n", from_str); | ||
109 | } | ||
110 | |||
111 | |||
93 | 112 | ||
94 | /* initialize alarm signal handling */ | 113 | /* initialize alarm signal handling */ |
95 | signal (SIGALRM, socket_timeout_alarm_handler); | 114 | signal (SIGALRM, socket_timeout_alarm_handler); |
@@ -157,9 +176,11 @@ main (int argc, char **argv) | |||
157 | recv(sd,buffer,MAX_INPUT_BUFFER-1,0); | 176 | recv(sd,buffer,MAX_INPUT_BUFFER-1,0); |
158 | 177 | ||
159 | #ifdef SMTP_USE_DUMMYCMD | 178 | #ifdef SMTP_USE_DUMMYCMD |
160 | send(sd,SMTP_DUMMYCMD,strlen(SMTP_DUMMYCMD),0); | 179 | send(sd,from_str,strlen(from_str),0); |
161 | /* allow for response to DUMMYCMD to reach us */ | 180 | /* allow for response to DUMMYCMD to reach us */ |
162 | recv(sd,buffer,MAX_INPUT_BUFFER-1,0); | 181 | recv(sd,buffer,MAX_INPUT_BUFFER-1,0); |
182 | if (verbose == TRUE) | ||
183 | printf("DUMMYCMD: %s\n%s\n",from_str,buffer); | ||
163 | #endif /* SMTP_USE_DUMMYCMD */ | 184 | #endif /* SMTP_USE_DUMMYCMD */ |
164 | 185 | ||
165 | /* finally close the connection */ | 186 | /* finally close the connection */ |
@@ -240,7 +261,8 @@ call_getopt (int argc, char **argv) | |||
240 | {"expect", required_argument, 0, 'e'}, | 261 | {"expect", required_argument, 0, 'e'}, |
241 | {"critical", required_argument, 0, 'c'}, | 262 | {"critical", required_argument, 0, 'c'}, |
242 | {"warning", required_argument, 0, 'w'}, | 263 | {"warning", required_argument, 0, 'w'}, |
243 | {"port", required_argument, 0, 'P'}, | 264 | {"port", required_argument, 0, 'p'}, |
265 | {"from", required_argument, 0, 'f'}, | ||
244 | {"verbose", no_argument, 0, 'v'}, | 266 | {"verbose", no_argument, 0, 'v'}, |
245 | {"version", no_argument, 0, 'V'}, | 267 | {"version", no_argument, 0, 'V'}, |
246 | {"help", no_argument, 0, 'h'}, | 268 | {"help", no_argument, 0, 'h'}, |
@@ -251,10 +273,10 @@ call_getopt (int argc, char **argv) | |||
251 | while (1) { | 273 | while (1) { |
252 | #ifdef HAVE_GETOPT_H | 274 | #ifdef HAVE_GETOPT_H |
253 | c = | 275 | c = |
254 | getopt_long (argc, argv, "+hVvt:p:e:c:w:H:", long_options, | 276 | getopt_long (argc, argv, "+hVvt:p:f:e:c:w:H:", long_options, |
255 | &option_index); | 277 | &option_index); |
256 | #else | 278 | #else |
257 | c = getopt (argc, argv, "+?hVvt:p:e:c:w:H:"); | 279 | c = getopt (argc, argv, "+?hVvt:p:f:e:c:w:H:"); |
258 | #endif | 280 | #endif |
259 | 281 | ||
260 | i++; | 282 | i++; |
@@ -266,6 +288,7 @@ call_getopt (int argc, char **argv) | |||
266 | case 't': | 288 | case 't': |
267 | case 'p': | 289 | case 'p': |
268 | case 'e': | 290 | case 'e': |
291 | case 'f': | ||
269 | case 'c': | 292 | case 'c': |
270 | case 'w': | 293 | case 'w': |
271 | case 'H': | 294 | case 'H': |
@@ -289,7 +312,10 @@ call_getopt (int argc, char **argv) | |||
289 | usage ("Server port must be a positive integer\n"); | 312 | usage ("Server port must be a positive integer\n"); |
290 | } | 313 | } |
291 | break; | 314 | break; |
292 | case 'e': /* username */ | 315 | case 'f': /* from argument */ |
316 | from_arg = optarg; | ||
317 | break; | ||
318 | case 'e': /* server expect string on 220 */ | ||
293 | server_expect = optarg; | 319 | server_expect = optarg; |
294 | break; | 320 | break; |
295 | case 'c': /* critical time threshold */ | 321 | case 'c': /* critical time threshold */ |
@@ -364,6 +390,8 @@ print_help (void) | |||
364 | " Make connection on the indicated port (default: %d)\n" | 390 | " Make connection on the indicated port (default: %d)\n" |
365 | " -e, --expect=STRING\n" | 391 | " -e, --expect=STRING\n" |
366 | " String to expect in first line of server response (default: %s)\n" | 392 | " String to expect in first line of server response (default: %s)\n" |
393 | " -f, --from=STRING\n" | ||
394 | " from address to include in MAIL command (default NULL, Exchange2000 requires one)\n" | ||
367 | " -w, --warning=INTEGER\n" | 395 | " -w, --warning=INTEGER\n" |
368 | " Seconds necessary to result in a warning status\n" | 396 | " Seconds necessary to result in a warning status\n" |
369 | " -c, --critical=INTEGER\n" | 397 | " -c, --critical=INTEGER\n" |
@@ -388,7 +416,7 @@ void | |||
388 | print_usage (void) | 416 | print_usage (void) |
389 | { | 417 | { |
390 | printf | 418 | printf |
391 | ("Usage: %s -H host [-e expect] [-p port] [-w warn] [-c crit] [-t timeout] [-v]\n" | 419 | ("Usage: %s -H host [-e expect] [-p port] [-f from addr] [-w warn] [-c crit] [-t timeout] [-v]\n" |
392 | " %s --help\n" | 420 | " %s --help\n" |
393 | " %s --version\n", PROGNAME, PROGNAME, PROGNAME); | 421 | " %s --version\n", PROGNAME, PROGNAME, PROGNAME); |
394 | } | 422 | } |