summaryrefslogtreecommitdiffstats
path: root/plugins/check_dbi.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/check_dbi.c')
-rw-r--r--plugins/check_dbi.c108
1 files changed, 73 insertions, 35 deletions
diff --git a/plugins/check_dbi.c b/plugins/check_dbi.c
index 9efcd1cb..468ded31 100644
--- a/plugins/check_dbi.c
+++ b/plugins/check_dbi.c
@@ -71,8 +71,9 @@ static double timediff(struct timeval /*start*/, struct timeval /*end*/);
71 71
72static void np_dbi_print_error(dbi_conn /*conn*/, char * /*fmt*/, ...); 72static void np_dbi_print_error(dbi_conn /*conn*/, char * /*fmt*/, ...);
73 73
74static mp_state_enum do_query(dbi_conn /*conn*/, const char ** /*res_val_str*/, double * /*res_val*/, double * /*res_time*/, mp_dbi_metric /*metric*/, 74static mp_state_enum do_query(dbi_conn /*conn*/, const char ** /*res_val_str*/,
75 mp_dbi_type /*type*/, char * /*np_dbi_query*/); 75 double * /*res_val*/, double * /*res_time*/, mp_dbi_metric /*metric*/,
76 mp_dbi_type /*type*/, char * /*np_dbi_query*/);
76 77
77int main(int argc, char **argv) { 78int main(int argc, char **argv) {
78 int status = STATE_UNKNOWN; 79 int status = STATE_UNKNOWN;
@@ -118,7 +119,8 @@ int main(int argc, char **argv) {
118 dbi_inst *instance_p = {0}; 119 dbi_inst *instance_p = {0};
119 120
120 if (dbi_initialize_r(NULL, instance_p) < 0) { 121 if (dbi_initialize_r(NULL, instance_p) < 0) {
121 printf("UNKNOWN - failed to initialize DBI; possibly you don't have any drivers installed.\n"); 122 printf(
123 "UNKNOWN - failed to initialize DBI; possibly you don't have any drivers installed.\n");
122 return STATE_UNKNOWN; 124 return STATE_UNKNOWN;
123 } 125 }
124 126
@@ -133,10 +135,12 @@ int main(int argc, char **argv) {
133 135
134 driver = dbi_driver_open_r(config.dbi_driver, instance_p); 136 driver = dbi_driver_open_r(config.dbi_driver, instance_p);
135 if (!driver) { 137 if (!driver) {
136 printf("UNKNOWN - failed to open DBI driver '%s'; possibly it's not installed.\n", config.dbi_driver); 138 printf("UNKNOWN - failed to open DBI driver '%s'; possibly it's not installed.\n",
139 config.dbi_driver);
137 140
138 printf("Known drivers:\n"); 141 printf("Known drivers:\n");
139 for (driver = dbi_driver_list_r(NULL, instance_p); driver; driver = dbi_driver_list_r(driver, instance_p)) { 142 for (driver = dbi_driver_list_r(NULL, instance_p); driver;
143 driver = dbi_driver_list_r(driver, instance_p)) {
140 printf(" - %s\n", dbi_driver_get_name(driver)); 144 printf(" - %s\n", dbi_driver_get_name(driver));
141 } 145 }
142 return STATE_UNKNOWN; 146 return STATE_UNKNOWN;
@@ -156,7 +160,8 @@ int main(int argc, char **argv) {
156 const char *opt; 160 const char *opt;
157 161
158 if (verbose > 1) { 162 if (verbose > 1) {
159 printf("Setting DBI driver option '%s' to '%s'\n", config.dbi_options[i].key, config.dbi_options[i].value); 163 printf("Setting DBI driver option '%s' to '%s'\n", config.dbi_options[i].key,
164 config.dbi_options[i].value);
160 } 165 }
161 166
162 if (!dbi_conn_set_option(conn, config.dbi_options[i].key, config.dbi_options[i].value)) { 167 if (!dbi_conn_set_option(conn, config.dbi_options[i].key, config.dbi_options[i].value)) {
@@ -164,10 +169,12 @@ int main(int argc, char **argv) {
164 } 169 }
165 /* else: status != 0 */ 170 /* else: status != 0 */
166 171
167 np_dbi_print_error(conn, "UNKNOWN - failed to set option '%s' to '%s'", config.dbi_options[i].key, config.dbi_options[i].value); 172 np_dbi_print_error(conn, "UNKNOWN - failed to set option '%s' to '%s'",
173 config.dbi_options[i].key, config.dbi_options[i].value);
168 printf("Known driver options:\n"); 174 printf("Known driver options:\n");
169 175
170 for (opt = dbi_conn_get_option_list(conn, NULL); opt; opt = dbi_conn_get_option_list(conn, opt)) { 176 for (opt = dbi_conn_get_option_list(conn, NULL); opt;
177 opt = dbi_conn_get_option_list(conn, opt)) {
171 printf(" - %s\n", opt); 178 printf(" - %s\n", opt);
172 } 179 }
173 dbi_conn_close(conn); 180 dbi_conn_close(conn);
@@ -230,14 +237,16 @@ int main(int argc, char **argv) {
230 } 237 }
231 238
232 if (dbi_conn_select_db(conn, config.dbi_database)) { 239 if (dbi_conn_select_db(conn, config.dbi_database)) {
233 np_dbi_print_error(conn, "UNKNOWN - failed to select database '%s'", config.dbi_database); 240 np_dbi_print_error(conn, "UNKNOWN - failed to select database '%s'",
241 config.dbi_database);
234 return STATE_UNKNOWN; 242 return STATE_UNKNOWN;
235 } 243 }
236 } 244 }
237 245
238 if (config.dbi_query) { 246 if (config.dbi_query) {
239 /* execute query */ 247 /* execute query */
240 status = do_query(conn, &query_val_str, &query_val, &query_time, config.metric, config.type, config.dbi_query); 248 status = do_query(conn, &query_val_str, &query_val, &query_time, config.metric, config.type,
249 config.dbi_query);
241 if (status != STATE_OK) { 250 if (status != STATE_OK) {
242 /* do_query prints an error message in this case */ 251 /* do_query prints an error message in this case */
243 return status; 252 return status;
@@ -281,7 +290,8 @@ int main(int argc, char **argv) {
281 /* In case of METRIC_QUERY_RESULT, isnan(query_val) indicates an error 290 /* In case of METRIC_QUERY_RESULT, isnan(query_val) indicates an error
282 * which should have been reported and handled (abort) before 291 * which should have been reported and handled (abort) before
283 * ... unless we expected a string to be returned */ 292 * ... unless we expected a string to be returned */
284 assert((config.metric != METRIC_QUERY_RESULT) || (!isnan(query_val)) || (config.type == TYPE_STRING)); 293 assert((config.metric != METRIC_QUERY_RESULT) || (!isnan(query_val)) ||
294 (config.type == TYPE_STRING));
285 295
286 assert((config.type != TYPE_STRING) || (config.expect || config.expect_re_str)); 296 assert((config.type != TYPE_STRING) || (config.expect || config.expect_re_str));
287 297
@@ -289,12 +299,14 @@ int main(int argc, char **argv) {
289 if (config.dbi_query) { 299 if (config.dbi_query) {
290 if (config.type == TYPE_STRING) { 300 if (config.type == TYPE_STRING) {
291 assert(config.expect || config.expect_re_str); 301 assert(config.expect || config.expect_re_str);
292 printf(", '%s' returned '%s' in %fs", config.dbi_query, query_val_str ? query_val_str : "<nothing>", query_time); 302 printf(", '%s' returned '%s' in %fs", config.dbi_query,
303 query_val_str ? query_val_str : "<nothing>", query_time);
293 if (status != STATE_OK) { 304 if (status != STATE_OK) {
294 if (config.expect) { 305 if (config.expect) {
295 printf(" (expected '%s')", config.expect); 306 printf(" (expected '%s')", config.expect);
296 } else if (config.expect_re_str) { 307 } else if (config.expect_re_str) {
297 printf(" (expected regex /%s/%s)", config.expect_re_str, ((config.expect_re_cflags & REG_ICASE) ? "i" : "")); 308 printf(" (expected regex /%s/%s)", config.expect_re_str,
309 ((config.expect_re_cflags & REG_ICASE) ? "i" : ""));
298 } 310 }
299 } 311 }
300 } else if (isnan(query_val)) { 312 } else if (isnan(query_val)) {
@@ -304,18 +316,31 @@ int main(int argc, char **argv) {
304 } 316 }
305 } 317 }
306 318
307 printf(" | conntime=%fs;%s;%s;0; server_version=%u;%s;%s;0;", conn_time, 319 printf(
308 ((config.metric == METRIC_CONN_TIME) && config.warning_range) ? config.warning_range : "", 320 " | conntime=%fs;%s;%s;0; server_version=%u;%s;%s;0;", conn_time,
309 ((config.metric == METRIC_CONN_TIME) && config.critical_range) ? config.critical_range : "", server_version, 321 ((config.metric == METRIC_CONN_TIME) && config.warning_range) ? config.warning_range : "",
310 ((config.metric == METRIC_SERVER_VERSION) && config.warning_range) ? config.warning_range : "", 322 ((config.metric == METRIC_CONN_TIME) && config.critical_range) ? config.critical_range : "",
311 ((config.metric == METRIC_SERVER_VERSION) && config.critical_range) ? config.critical_range : ""); 323 server_version,
324 ((config.metric == METRIC_SERVER_VERSION) && config.warning_range) ? config.warning_range
325 : "",
326 ((config.metric == METRIC_SERVER_VERSION) && config.critical_range) ? config.critical_range
327 : "");
312 if (config.dbi_query) { 328 if (config.dbi_query) {
313 if (!isnan(query_val)) { /* this is also true when -e is used */ 329 if (!isnan(query_val)) { /* this is also true when -e is used */
314 printf(" query=%f;%s;%s;;", query_val, ((config.metric == METRIC_QUERY_RESULT) && config.warning_range) ? config.warning_range : "", 330 printf(" query=%f;%s;%s;;", query_val,
315 ((config.metric == METRIC_QUERY_RESULT) && config.critical_range) ? config.critical_range : ""); 331 ((config.metric == METRIC_QUERY_RESULT) && config.warning_range)
332 ? config.warning_range
333 : "",
334 ((config.metric == METRIC_QUERY_RESULT) && config.critical_range)
335 ? config.critical_range
336 : "");
316 } 337 }
317 printf(" querytime=%fs;%s;%s;0;", query_time, ((config.metric == METRIC_QUERY_TIME) && config.warning_range) ? config.warning_range : "", 338 printf(" querytime=%fs;%s;%s;0;", query_time,
318 ((config.metric == METRIC_QUERY_TIME) && config.critical_range) ? config.critical_range : ""); 339 ((config.metric == METRIC_QUERY_TIME) && config.warning_range) ? config.warning_range
340 : "",
341 ((config.metric == METRIC_QUERY_TIME) && config.critical_range)
342 ? config.critical_range
343 : "");
319 } 344 }
320 printf("\n"); 345 printf("\n");
321 return status; 346 return status;
@@ -442,7 +467,8 @@ check_dbi_config_wrapper process_arguments(int argc, char **argv) {
442 *value = '\0'; 467 *value = '\0';
443 ++value; 468 ++value;
444 469
445 new = realloc(result.config.dbi_options, (result.config.dbi_options_num + 1) * sizeof(*new)); 470 new = realloc(result.config.dbi_options,
471 (result.config.dbi_options_num + 1) * sizeof(*new));
446 if (!new) { 472 if (!new) {
447 printf("UNKNOWN - failed to reallocate memory\n"); 473 printf("UNKNOWN - failed to reallocate memory\n");
448 exit(STATE_UNKNOWN); 474 exit(STATE_UNKNOWN);
@@ -464,7 +490,8 @@ check_dbi_config_wrapper process_arguments(int argc, char **argv) {
464 } 490 }
465 } 491 }
466 492
467 set_thresholds(&result.config.dbi_thresholds, result.config.warning_range, result.config.critical_range); 493 set_thresholds(&result.config.dbi_thresholds, result.config.warning_range,
494 result.config.critical_range);
468 495
469 return validate_arguments(result); 496 return validate_arguments(result);
470} 497}
@@ -474,21 +501,28 @@ check_dbi_config_wrapper validate_arguments(check_dbi_config_wrapper config_wrap
474 usage("Must specify a DBI driver"); 501 usage("Must specify a DBI driver");
475 } 502 }
476 503
477 if (((config_wrapper.config.metric == METRIC_QUERY_RESULT) || (config_wrapper.config.metric == METRIC_QUERY_TIME)) && 504 if (((config_wrapper.config.metric == METRIC_QUERY_RESULT) ||
505 (config_wrapper.config.metric == METRIC_QUERY_TIME)) &&
478 (!config_wrapper.config.dbi_query)) { 506 (!config_wrapper.config.dbi_query)) {
479 usage("Must specify a query to execute (metric == QUERY_RESULT)"); 507 usage("Must specify a query to execute (metric == QUERY_RESULT)");
480 } 508 }
481 509
482 if ((config_wrapper.config.metric != METRIC_CONN_TIME) && (config_wrapper.config.metric != METRIC_SERVER_VERSION) && 510 if ((config_wrapper.config.metric != METRIC_CONN_TIME) &&
483 (config_wrapper.config.metric != METRIC_QUERY_RESULT) && (config_wrapper.config.metric != METRIC_QUERY_TIME)) { 511 (config_wrapper.config.metric != METRIC_SERVER_VERSION) &&
512 (config_wrapper.config.metric != METRIC_QUERY_RESULT) &&
513 (config_wrapper.config.metric != METRIC_QUERY_TIME)) {
484 usage("Invalid metric specified"); 514 usage("Invalid metric specified");
485 } 515 }
486 516
487 if (config_wrapper.config.expect && (config_wrapper.config.warning_range || config_wrapper.config.critical_range || config_wrapper.config.expect_re_str)) { 517 if (config_wrapper.config.expect &&
518 (config_wrapper.config.warning_range || config_wrapper.config.critical_range ||
519 config_wrapper.config.expect_re_str)) {
488 usage("Do not mix -e and -w/-c/-r/-R"); 520 usage("Do not mix -e and -w/-c/-r/-R");
489 } 521 }
490 522
491 if (config_wrapper.config.expect_re_str && (config_wrapper.config.warning_range || config_wrapper.config.critical_range || config_wrapper.config.expect)) { 523 if (config_wrapper.config.expect_re_str &&
524 (config_wrapper.config.warning_range || config_wrapper.config.critical_range ||
525 config_wrapper.config.expect)) {
492 usage("Do not mix -r/-R and -w/-c/-e"); 526 usage("Do not mix -r/-R and -w/-c/-e");
493 } 527 }
494 528
@@ -496,7 +530,8 @@ check_dbi_config_wrapper validate_arguments(check_dbi_config_wrapper config_wrap
496 usage("Option -e requires metric QUERY_RESULT"); 530 usage("Option -e requires metric QUERY_RESULT");
497 } 531 }
498 532
499 if (config_wrapper.config.expect_re_str && (config_wrapper.config.metric != METRIC_QUERY_RESULT)) { 533 if (config_wrapper.config.expect_re_str &&
534 (config_wrapper.config.metric != METRIC_QUERY_RESULT)) {
500 usage("Options -r/-R require metric QUERY_RESULT"); 535 usage("Options -r/-R require metric QUERY_RESULT");
501 } 536 }
502 537
@@ -607,7 +642,8 @@ void print_usage(void) {
607 printf(" [-e <string>] [-r|-R <regex>]\n"); 642 printf(" [-e <string>] [-r|-R <regex>]\n");
608} 643}
609 644
610const char *get_field_str(dbi_conn conn, dbi_result res, unsigned short field_type, mp_dbi_metric metric, mp_dbi_type type) { 645const char *get_field_str(dbi_conn conn, dbi_result res, unsigned short field_type,
646 mp_dbi_metric metric, mp_dbi_type type) {
611 const char *str; 647 const char *str;
612 648
613 if (field_type != DBI_TYPE_STRING) { 649 if (field_type != DBI_TYPE_STRING) {
@@ -630,7 +666,8 @@ const char *get_field_str(dbi_conn conn, dbi_result res, unsigned short field_ty
630 return str; 666 return str;
631} 667}
632 668
633double get_field(dbi_conn conn, dbi_result res, unsigned short *field_type, mp_dbi_metric metric, mp_dbi_type type) { 669double get_field(dbi_conn conn, dbi_result res, unsigned short *field_type, mp_dbi_metric metric,
670 mp_dbi_type type) {
634 double val = NAN; 671 double val = NAN;
635 672
636 if (*field_type == DBI_TYPE_INTEGER) { 673 if (*field_type == DBI_TYPE_INTEGER) {
@@ -679,7 +716,8 @@ double get_field(dbi_conn conn, dbi_result res, unsigned short *field_type, mp_d
679 return val; 716 return val;
680} 717}
681 718
682mp_state_enum get_query_result(dbi_conn conn, dbi_result res, const char **res_val_str, double *res_val, mp_dbi_metric metric, mp_dbi_type type) { 719mp_state_enum get_query_result(dbi_conn conn, dbi_result res, const char **res_val_str,
720 double *res_val, mp_dbi_metric metric, mp_dbi_type type) {
683 unsigned short field_type; 721 unsigned short field_type;
684 double val = NAN; 722 double val = NAN;
685 723
@@ -747,8 +785,8 @@ mp_state_enum get_query_result(dbi_conn conn, dbi_result res, const char **res_v
747 return STATE_OK; 785 return STATE_OK;
748} 786}
749 787
750mp_state_enum do_query(dbi_conn conn, const char **res_val_str, double *res_val, double *res_time, mp_dbi_metric metric, mp_dbi_type type, 788mp_state_enum do_query(dbi_conn conn, const char **res_val_str, double *res_val, double *res_time,
751 char *np_dbi_query) { 789 mp_dbi_metric metric, mp_dbi_type type, char *np_dbi_query) {
752 dbi_result res; 790 dbi_result res;
753 791
754 struct timeval timeval_start; 792 struct timeval timeval_start;