diff options
Diffstat (limited to 'plugins/check_ldap.c')
-rw-r--r-- | plugins/check_ldap.c | 104 |
1 files changed, 82 insertions, 22 deletions
diff --git a/plugins/check_ldap.c b/plugins/check_ldap.c index c371be97..845a4f52 100644 --- a/plugins/check_ldap.c +++ b/plugins/check_ldap.c | |||
@@ -1,29 +1,29 @@ | |||
1 | /***************************************************************************** | 1 | /***************************************************************************** |
2 | * | 2 | * |
3 | * Monitoring check_ldap plugin | 3 | * Monitoring check_ldap plugin |
4 | * | 4 | * |
5 | * License: GPL | 5 | * License: GPL |
6 | * Copyright (c) 2000-2008 Monitoring Plugins Development Team | 6 | * Copyright (c) 2000-2008 Monitoring Plugins Development Team |
7 | * | 7 | * |
8 | * Description: | 8 | * Description: |
9 | * | 9 | * |
10 | * This file contains the check_ldap plugin | 10 | * This file contains the check_ldap plugin |
11 | * | 11 | * |
12 | * | 12 | * |
13 | * This program is free software: you can redistribute it and/or modify | 13 | * This program is free software: you can redistribute it and/or modify |
14 | * it under the terms of the GNU General Public License as published by | 14 | * it under the terms of the GNU General Public License as published by |
15 | * the Free Software Foundation, either version 3 of the License, or | 15 | * the Free Software Foundation, either version 3 of the License, or |
16 | * (at your option) any later version. | 16 | * (at your option) any later version. |
17 | * | 17 | * |
18 | * This program is distributed in the hope that it will be useful, | 18 | * This program is distributed in the hope that it will be useful, |
19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
21 | * GNU General Public License for more details. | 21 | * GNU General Public License for more details. |
22 | * | 22 | * |
23 | * You should have received a copy of the GNU General Public License | 23 | * You should have received a copy of the GNU General Public License |
24 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 24 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
25 | * | 25 | * |
26 | * | 26 | * |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | 28 | ||
29 | /* progname may be check_ldaps */ | 29 | /* progname may be check_ldaps */ |
@@ -67,7 +67,10 @@ int ld_protocol = DEFAULT_PROTOCOL; | |||
67 | #endif | 67 | #endif |
68 | double warn_time = UNDEFINED; | 68 | double warn_time = UNDEFINED; |
69 | double crit_time = UNDEFINED; | 69 | double crit_time = UNDEFINED; |
70 | thresholds *entries_thresholds = NULL; | ||
70 | struct timeval tv; | 71 | struct timeval tv; |
72 | char* warn_entries = NULL; | ||
73 | char* crit_entries = NULL; | ||
71 | int starttls = FALSE; | 74 | int starttls = FALSE; |
72 | int ssl_on_connect = FALSE; | 75 | int ssl_on_connect = FALSE; |
73 | int verbose = 0; | 76 | int verbose = 0; |
@@ -94,6 +97,12 @@ main (int argc, char *argv[]) | |||
94 | int tls; | 97 | int tls; |
95 | int version=3; | 98 | int version=3; |
96 | 99 | ||
100 | /* for entry counting */ | ||
101 | |||
102 | LDAPMessage *next_entry; | ||
103 | int status_entries = STATE_OK; | ||
104 | int num_entries = 0; | ||
105 | |||
97 | setlocale (LC_ALL, ""); | 106 | setlocale (LC_ALL, ""); |
98 | bindtextdomain (PACKAGE, LOCALEDIR); | 107 | bindtextdomain (PACKAGE, LOCALEDIR); |
99 | textdomain (PACKAGE); | 108 | textdomain (PACKAGE); |
@@ -197,12 +206,14 @@ main (int argc, char *argv[]) | |||
197 | } | 206 | } |
198 | 207 | ||
199 | /* do a search of all objectclasses in the base dn */ | 208 | /* do a search of all objectclasses in the base dn */ |
200 | if (ldap_search_s (ld, ld_base, LDAP_SCOPE_BASE, ld_attr, NULL, 0, &result) | 209 | if (ldap_search_s (ld, ld_base, (crit_entries!=NULL || warn_entries!=NULL) ? LDAP_SCOPE_SUBTREE : LDAP_SCOPE_BASE, ld_attr, NULL, 0, &result) |
201 | != LDAP_SUCCESS) { | 210 | != LDAP_SUCCESS) { |
202 | if (verbose) | 211 | if (verbose) |
203 | ldap_perror(ld, "ldap_search"); | 212 | ldap_perror(ld, "ldap_search"); |
204 | printf (_("Could not search/find objectclasses in %s\n"), ld_base); | 213 | printf (_("Could not search/find objectclasses in %s\n"), ld_base); |
205 | return STATE_CRITICAL; | 214 | return STATE_CRITICAL; |
215 | } else if (crit_entries!=NULL || warn_entries!=NULL) { | ||
216 | num_entries = ldap_count_entries(ld, result); | ||
206 | } | 217 | } |
207 | 218 | ||
208 | /* unbind from the ldap server */ | 219 | /* unbind from the ldap server */ |
@@ -223,14 +234,42 @@ main (int argc, char *argv[]) | |||
223 | else | 234 | else |
224 | status = STATE_OK; | 235 | status = STATE_OK; |
225 | 236 | ||
237 | if(entries_thresholds != NULL) { | ||
238 | if (verbose) { | ||
239 | printf ("entries found: %d\n", num_entries); | ||
240 | print_thresholds("entry thresholds", entries_thresholds); | ||
241 | } | ||
242 | status_entries = get_status(num_entries, entries_thresholds); | ||
243 | if (status_entries == STATE_CRITICAL) { | ||
244 | status = STATE_CRITICAL; | ||
245 | } else if (status != STATE_CRITICAL) { | ||
246 | status = status_entries; | ||
247 | } | ||
248 | } | ||
249 | |||
226 | /* print out the result */ | 250 | /* print out the result */ |
227 | printf (_("LDAP %s - %.3f seconds response time|%s\n"), | 251 | if (crit_entries!=NULL || warn_entries!=NULL) { |
228 | state_text (status), | 252 | printf (_("LDAP %s - found %d entries in %.3f seconds|%s %s\n"), |
229 | elapsed_time, | 253 | state_text (status), |
230 | fperfdata ("time", elapsed_time, "s", | 254 | num_entries, |
231 | (int)warn_time, warn_time, | 255 | elapsed_time, |
232 | (int)crit_time, crit_time, | 256 | fperfdata ("time", elapsed_time, "s", |
233 | TRUE, 0, FALSE, 0)); | 257 | (int)warn_time, warn_time, |
258 | (int)crit_time, crit_time, | ||
259 | TRUE, 0, FALSE, 0), | ||
260 | sperfdata ("entries", (double)num_entries, "", | ||
261 | warn_entries, | ||
262 | crit_entries, | ||
263 | TRUE, 0.0, FALSE, 0.0)); | ||
264 | } else { | ||
265 | printf (_("LDAP %s - %.3f seconds response time|%s\n"), | ||
266 | state_text (status), | ||
267 | elapsed_time, | ||
268 | fperfdata ("time", elapsed_time, "s", | ||
269 | (int)warn_time, warn_time, | ||
270 | (int)crit_time, crit_time, | ||
271 | TRUE, 0, FALSE, 0)); | ||
272 | } | ||
234 | 273 | ||
235 | return status; | 274 | return status; |
236 | } | 275 | } |
@@ -263,6 +302,8 @@ process_arguments (int argc, char **argv) | |||
263 | {"port", required_argument, 0, 'p'}, | 302 | {"port", required_argument, 0, 'p'}, |
264 | {"warn", required_argument, 0, 'w'}, | 303 | {"warn", required_argument, 0, 'w'}, |
265 | {"crit", required_argument, 0, 'c'}, | 304 | {"crit", required_argument, 0, 'c'}, |
305 | {"warn-entries", required_argument, 0, 'W'}, | ||
306 | {"crit-entries", required_argument, 0, 'C'}, | ||
266 | {"verbose", no_argument, 0, 'v'}, | 307 | {"verbose", no_argument, 0, 'v'}, |
267 | {0, 0, 0, 0} | 308 | {0, 0, 0, 0} |
268 | }; | 309 | }; |
@@ -276,7 +317,7 @@ process_arguments (int argc, char **argv) | |||
276 | } | 317 | } |
277 | 318 | ||
278 | while (1) { | 319 | while (1) { |
279 | c = getopt_long (argc, argv, "hvV234TS6t:c:w:H:b:p:a:D:P:", longopts, &option); | 320 | c = getopt_long (argc, argv, "hvV234TS6t:c:w:H:b:p:a:D:P:C:W:", longopts, &option); |
280 | 321 | ||
281 | if (c == -1 || c == EOF) | 322 | if (c == -1 || c == EOF) |
282 | break; | 323 | break; |
@@ -284,10 +325,10 @@ process_arguments (int argc, char **argv) | |||
284 | switch (c) { | 325 | switch (c) { |
285 | case 'h': /* help */ | 326 | case 'h': /* help */ |
286 | print_help (); | 327 | print_help (); |
287 | exit (STATE_OK); | 328 | exit (STATE_UNKNOWN); |
288 | case 'V': /* version */ | 329 | case 'V': /* version */ |
289 | print_revision (progname, NP_VERSION); | 330 | print_revision (progname, NP_VERSION); |
290 | exit (STATE_OK); | 331 | exit (STATE_UNKNOWN); |
291 | case 't': /* timeout period */ | 332 | case 't': /* timeout period */ |
292 | if (!is_intnonneg (optarg)) | 333 | if (!is_intnonneg (optarg)) |
293 | usage2 (_("Timeout interval must be a positive integer"), optarg); | 334 | usage2 (_("Timeout interval must be a positive integer"), optarg); |
@@ -318,6 +359,12 @@ process_arguments (int argc, char **argv) | |||
318 | case 'c': | 359 | case 'c': |
319 | crit_time = strtod (optarg, NULL); | 360 | crit_time = strtod (optarg, NULL); |
320 | break; | 361 | break; |
362 | case 'W': | ||
363 | warn_entries = optarg; | ||
364 | break; | ||
365 | case 'C': | ||
366 | crit_entries = optarg; | ||
367 | break; | ||
321 | #ifdef HAVE_LDAP_SET_OPTION | 368 | #ifdef HAVE_LDAP_SET_OPTION |
322 | case '2': | 369 | case '2': |
323 | ld_protocol = 2; | 370 | ld_protocol = 2; |
@@ -381,6 +428,13 @@ validate_arguments () | |||
381 | if (ld_base==NULL) | 428 | if (ld_base==NULL) |
382 | usage4 (_("Please specify the LDAP base\n")); | 429 | usage4 (_("Please specify the LDAP base\n")); |
383 | 430 | ||
431 | if (crit_entries!=NULL || warn_entries!=NULL) { | ||
432 | set_thresholds(&entries_thresholds, | ||
433 | warn_entries, crit_entries); | ||
434 | } | ||
435 | if (ld_passwd==NULL) | ||
436 | ld_passwd = getenv("LDAP_PASSWORD"); | ||
437 | |||
384 | return OK; | 438 | return OK; |
385 | } | 439 | } |
386 | 440 | ||
@@ -414,7 +468,7 @@ print_help (void) | |||
414 | printf (" %s\n", "-D [--bind]"); | 468 | printf (" %s\n", "-D [--bind]"); |
415 | printf (" %s\n", _("ldap bind DN (if required)")); | 469 | printf (" %s\n", _("ldap bind DN (if required)")); |
416 | printf (" %s\n", "-P [--pass]"); | 470 | printf (" %s\n", "-P [--pass]"); |
417 | printf (" %s\n", _("ldap password (if required)")); | 471 | printf (" %s\n", _("ldap password (if required, or set the password through environment variable 'LDAP_PASSWORD')")); |
418 | printf (" %s\n", "-T [--starttls]"); | 472 | printf (" %s\n", "-T [--starttls]"); |
419 | printf (" %s\n", _("use starttls mechanism introduced in protocol version 3")); | 473 | printf (" %s\n", _("use starttls mechanism introduced in protocol version 3")); |
420 | printf (" %s\n", "-S [--ssl]"); | 474 | printf (" %s\n", "-S [--ssl]"); |
@@ -430,6 +484,11 @@ print_help (void) | |||
430 | 484 | ||
431 | printf (UT_WARN_CRIT); | 485 | printf (UT_WARN_CRIT); |
432 | 486 | ||
487 | printf (" %s\n", "-W [--warn-entries]"); | ||
488 | printf (" %s\n", _("Number of found entries to result in warning status")); | ||
489 | printf (" %s\n", "-C [--crit-entries]"); | ||
490 | printf (" %s\n", _("Number of found entries to result in critical status")); | ||
491 | |||
433 | printf (UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); | 492 | printf (UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); |
434 | 493 | ||
435 | printf (UT_VERBOSE); | 494 | printf (UT_VERBOSE); |
@@ -441,6 +500,7 @@ print_help (void) | |||
441 | printf (" %s\n", _("'SSL on connect' will be used no matter how the plugin was called.")); | 500 | printf (" %s\n", _("'SSL on connect' will be used no matter how the plugin was called.")); |
442 | printf (" %s\n", _("This detection is deprecated, please use 'check_ldap' with the '--starttls' or '--ssl' flags")); | 501 | printf (" %s\n", _("This detection is deprecated, please use 'check_ldap' with the '--starttls' or '--ssl' flags")); |
443 | printf (" %s\n", _("to define the behaviour explicitly instead.")); | 502 | printf (" %s\n", _("to define the behaviour explicitly instead.")); |
503 | printf (" %s\n", _("The parameters --warn-entries and --crit-entries are optional.")); | ||
444 | 504 | ||
445 | printf (UT_SUPPORT); | 505 | printf (UT_SUPPORT); |
446 | } | 506 | } |