From 864544b29ef7ad2cddc32c26b4251fc1b680c8f9 Mon Sep 17 00:00:00 2001 From: Ton Voon Date: Tue, 31 Jan 2006 14:52:49 +0000 Subject: Adding check_mysql_query, using new ranges and threshold checking git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1309 f882894a-f735-0410-b71e-b25c423dba1c --- plugins/check_mysql_query.c | 299 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 plugins/check_mysql_query.c (limited to 'plugins/check_mysql_query.c') diff --git a/plugins/check_mysql_query.c b/plugins/check_mysql_query.c new file mode 100644 index 00000000..321af7aa --- /dev/null +++ b/plugins/check_mysql_query.c @@ -0,0 +1,299 @@ +/****************************************************************************** +* +* CHECK_MYSQL_QUERY.C +* +* Program: Mysql plugin for Nagios +* License: GPL +* Copyright (c) 2006 Nagios Plugins Team, after Didi Rieder (check_mysql) +* +* $Id$ +* +* Description: +* This plugin is for running arbitrary SQL and checking the results +* +******************************************************************************/ + +const char *progname = "check_mysql_query"; +const char *revision = "$Revision$"; +const char *copyright = "2006"; +const char *email = "nagiosplug-devel@lists.sourceforge.net"; + +#include "common.h" +#include "utils.h" +#include "netutils.h" + +#include +#include + +char *db_user = NULL; +char *db_host = NULL; +char *db_pass = NULL; +char *db = NULL; +unsigned int db_port = MYSQL_PORT; + +int process_arguments (int, char **); +int validate_arguments (void); +void print_help (void); +void print_usage (void); + +char *sql_query = NULL; +int verbose = 0; +thresholds *my_thresholds = NULL; + + +int +main (int argc, char **argv) +{ + + MYSQL mysql; + MYSQL_RES *res; + MYSQL_ROW row; + + double value; + char *error = NULL; + int status; + + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + + if (process_arguments (argc, argv) == ERROR) + usage4 (_("Could not parse arguments")); + + /* initialize mysql */ + mysql_init (&mysql); + + mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"client"); + + /* establish a connection to the server and error checking */ + if (!mysql_real_connect(&mysql,db_host,db_user,db_pass,db,db_port,NULL,0)) { + if (mysql_errno (&mysql) == CR_UNKNOWN_HOST) + die (STATE_WARNING, "QUERY %s: %s\n", _("WARNING"), mysql_error (&mysql)); + else if (mysql_errno (&mysql) == CR_VERSION_ERROR) + die (STATE_WARNING, "QUERY %s: %s\n", _("WARNING"), mysql_error (&mysql)); + else if (mysql_errno (&mysql) == CR_OUT_OF_MEMORY) + die (STATE_WARNING, "QUERY %s: %s\n", _("WARNING"), mysql_error (&mysql)); + else if (mysql_errno (&mysql) == CR_IPSOCK_ERROR) + die (STATE_WARNING, "QUERY %s: %s\n", _("WARNING"), mysql_error (&mysql)); + else if (mysql_errno (&mysql) == CR_SOCKET_CREATE_ERROR) + die (STATE_WARNING, "QUERY %s: %s\n", _("WARNING"), mysql_error (&mysql)); + else + die (STATE_CRITICAL, "QUERY %s: %s\n", _("CRITICAL"), mysql_error (&mysql)); + } + + if (mysql_query (&mysql, sql_query) != 0) { + error = strdup(mysql_error(&mysql)); + mysql_close (&mysql); + die (STATE_CRITICAL, "QUERY %s: %s - %s\n", _("CRITICAL"), _("Error with query"), error); + } + + /* store the result */ + if ( (res = mysql_store_result (&mysql)) == NULL) { + error = strdup(mysql_error(&mysql)); + mysql_close (&mysql); + die (STATE_CRITICAL, "QUERY %s: Error with store_result - %s\n", _("CRITICAL"), error); + } + + /* Check there is some data */ + if (mysql_num_rows(res) == 0) { + mysql_close(&mysql); + die (STATE_WARNING, "QUERY %s: %s\n", _("WARNING"), _("No rows returned")); + } + + /* fetch the first row */ + if ( (row = mysql_fetch_row (res)) == NULL) { + error = strdup(mysql_error(&mysql)); + mysql_free_result (res); + mysql_close (&mysql); + die (STATE_CRITICAL, "QUERY %s: Fetch row error - %s\n", _("CRITICAL"), error); + } + + /* free the result */ + mysql_free_result (res); + + /* close the connection */ + mysql_close (&mysql); + + if (! is_numeric(row[0])) { + die (STATE_CRITICAL, "QUERY %s: %s - '%s'\n", _("CRITICAL"), _("Is not a numeric"), row[0]); + } + + value = strtod(row[0], NULL); + + if (verbose >= 3) + printf("mysql result: %f\n", value); + + status = get_status(value, my_thresholds); + + if (status == STATE_OK) { + printf("QUERY %s: ", _("OK")); + } else if (status == STATE_WARNING) { + printf("QUERY %s: ", _("WARNING")); + } else if (status == STATE_CRITICAL) { + printf("QUERY %s: ", _("CRITICAL")); + } + printf(_("'%s' returned %f"), sql_query, value); + printf("\n"); + + return status; +} + + +/* process command-line arguments */ +int +process_arguments (int argc, char **argv) +{ + int c; + char *warning = NULL; + char *critical = NULL; + + int option = 0; + static struct option longopts[] = { + {"hostname", required_argument, 0, 'H'}, + {"database", required_argument, 0, 'd'}, + {"username", required_argument, 0, 'u'}, + {"password", required_argument, 0, 'p'}, + {"port", required_argument, 0, 'P'}, + {"verbose", no_argument, 0, 'v'}, + {"version", no_argument, 0, 'V'}, + {"help", no_argument, 0, 'h'}, + {"query", required_argument, 0, 'q'}, + {"warning", required_argument, 0, 'w'}, + {"critical", required_argument, 0, 'c'}, + {0, 0, 0, 0} + }; + + if (argc < 1) + return ERROR; + + while (1) { + c = getopt_long (argc, argv, "hvVSP:p:u:d:H:q:w:c:", longopts, &option); + + if (c == -1 || c == EOF) + break; + + switch (c) { + case 'H': /* hostname */ + if (is_host (optarg)) { + db_host = optarg; + } + else { + usage2 (_("Invalid hostname/address"), optarg); + } + break; + case 'd': /* hostname */ + db = optarg; + break; + case 'u': /* username */ + db_user = optarg; + break; + case 'p': /* authentication information: password */ + asprintf(&db_pass, "%s", optarg); + + /* Delete the password from process list */ + while (*optarg != '\0') { + *optarg = 'X'; + optarg++; + } + break; + case 'P': /* critical time threshold */ + db_port = atoi (optarg); + break; + case 'v': + verbose++; + break; + case 'V': /* version */ + print_revision (progname, revision); + exit (STATE_OK); + case 'h': /* help */ + print_help (); + exit (STATE_OK); + case 'q': + asprintf(&sql_query, "%s", optarg); + break; + case 'w': + warning = optarg; + break; + case 'c': + critical = optarg; + break; + case '?': /* help */ + usage2 (_("Unknown argument"), optarg); + } + } + + c = optind; + + set_thresholds(&my_thresholds, warning, critical); + + return validate_arguments (); +} + + +int +validate_arguments (void) +{ + if (sql_query == NULL) + usage("Must specify a SQL query to run"); + + if (db_user == NULL) + db_user = strdup(""); + + if (db_host == NULL) + db_host = strdup(""); + + if (db_pass == NULL) + db_pass == strdup(""); + + if (db == NULL) + db = strdup(""); + + return OK; +} + + +void +print_help (void) +{ + char *myport; + asprintf (&myport, "%d", MYSQL_PORT); + + print_revision (progname, revision); + + printf (_(COPYRIGHT), copyright, email); + + printf ("%s\n", _("This program checks a query result against threshold levels")); + + print_usage (); + + + printf (_(UT_HELP_VRSN)); + printf (" -q, --query=STRING\n"); + printf (" %s\n", _("SQL query to run. Only first column in first row will be read")); + printf (_(UT_WARN_CRIT_RANGE)); + printf (_(UT_HOST_PORT), 'P', myport); + printf (" -d, --database=STRING\n"); + printf (" %s\n", _("Database to check")); + printf (" -u, --username=STRING\n"); + printf (" %s\n", _("Username to login with")); + printf (" -p, --password=STRING\n"); + printf (" %s\n", _("Password to login with")); + printf (" ==> %s <==\n", _("IMPORTANT: THIS FORM OF AUTHENTICATION IS NOT SECURE!!!")); + + printf ("\n"); + + printf ("%s\n", _("A query is required. The result from the query should be numeric.")); + printf ("%s\n", _("For extra security, create a user with minimal access.")); + + printf (_(UT_SUPPORT)); +} + + +void +print_usage (void) +{ + printf ("\ +Usage: %s -q SQL_query [-w warn] [-c crit]\n\ + [-d database] [-H host] [-P port] [-u user] [-p password]\n", + progname); +} -- cgit v1.2.3