PDA

View Full Version : Check_Mysql_Query


umoorjani
08-10-2006, 05:22 PM
Bonjour,

J'ai compilé, check_mysql_query ensembles avec les nouveau plugins Nagios 1.4.4 et tous fonctionnent convenablement sans faute.

Par contre un souci dans pour l'appli check_mysql_query, vous voyez je dois évalué le retour d'une requete et j'obtien des fausses alarms du au faite que je n'ai pas compris le formattage des warning-critical. Ils disent dans le -h que format des seuiles est comme ceci: start:end

mais quand je teste ma commande :



./check_mysql_query -q "SELECT effRateIn FROM faisceaux WHERE name like '%T2_NAS_ANAG_FORF%'" -d cirpack-db -H localhost -P 3306 -u root -w 40,20 -c 19,10

QUERY CRITIQUE: 'SELECT effRateIn FROM faisceaux WHERE name like '%T2_NAS_ANAG_FORF%'' returned 100,000000

--------------------------------------------------------------------------------------


./check_mysql_query -q "SELECT effRateIn FROM faisceaux WHERE name like '%T2_NAS_ANAG_FORF%'" -d cirpack-db -H localhost -P 3306 -u root -w 40:20 -c 19:0

Range format incorrect !



Je comprend plus rien, je me suis cassé la tête là dessus et je comprend toujours pas. Lorsque le résulta = 100 cela veur dire qu'il est OK.

Je veux crée un seuil "warning" de 40 à 20 et un seuil "critique" de 19 à 0.

Alors dans la ligne 79 de lib/utils_base.c j'ai essayé de de changer l'opérateur de <= en >= pour qu'il accept les seuils en "start" plus petit que les seuils en "end". Toujour le même problem, il m'affiche critique là ou il ne faut pas je ne comprend plus rien !!!

SVP AIDEZ MOI, Comment doit-je procéder pour inverser la façon dont check_mysql_query éffectue son "if else" ?

Merci d'avance,

Uday MOORJANI

templuche
08-10-2006, 06:49 PM
Bonjour,

J'aimerais bien t'aider mais je ne sais pas où récupérer les plugins Nagios 1.4.4! Où as tu récupérer cette version? La dernière, à ma connaissance, est la 1.4.3.

umoorjani
08-10-2006, 06:50 PM
http://nagiosplug.sourceforge.net il vient tout juste de sortir 08/08/2006

templuche
08-10-2006, 06:59 PM
Oui ça bon ok! Je suis désolé mais si je suis (du verbe suivre) le lien Download du bas de page, je n'ai que la 1.4.3, pas la 1.4.4.

umoorjani
08-10-2006, 07:19 PM
xcuse moi c'est moi qui me suis trompé,

http://nagiosplug.sourceforge.net/snapshot/

templuche
08-10-2006, 07:23 PM
Ha ok! Je comprends mieux! Mais ceux là de plugins ne sont pas sensés être stables.

templuche
08-10-2006, 07:29 PM
Bon on reprends. Voici un exemple:
./check_mysql_query -H localhost -d oreon_1_3 -u root -q 'select 100+1' -w 0:101 -c 0:200
Là j'essaie de tester la valeur de la requète. Si le résultat est en dehors de l'intervalle 0:101 je suis en WARNING. Si le résultat est en dehors de l'intervalle 0:200 je suis en CRITICAL.

umoorjani
08-10-2006, 09:23 PM
Ce qui se passe, c'est que je dois crée des alertes pour des faisceaux sip (VOIP). Lorsque j'ai un taux d'ASR de 100, c'est OK par contre à partir de 40 ce la devien warning et a partir de 19 c'est critique.

Excuse moi sincerement, mais je ne comprend pas ton exemple. J'ai certainement pas pigé qque choses. Pourrai tu réexpliqué stp ?

Encore merci beaucoup pr ton aide.

templuche
08-11-2006, 10:01 AM
Bonjour,

Lorsque tu mets un interval pour le seuil warning, le warning va être généré lorsque la valeur est EN DEHORS de cet interval. Dans ton cas, essaye de mettre: ./check_mysql_query -q "SELECT effRateIn FROM faisceaux WHERE name like '%T2_NAS_ANAG_FORF%'" -d cirpack-db -H localhost -P 3306 -u root -w 41:100 -c 20:100

Par contre attention, la valeur 101 et toutes les valeurs au dessus de 100 vont remonter en critique...

templuche
08-11-2006, 04:39 PM
Est ce que cela correspond à ce que tu cherchais?

umoorjani
08-11-2006, 09:16 PM
Templuch, je me suis tapé le code j'ai changé les opérateurs de vérif j'ai ajouté des fonction dans la lib userbase.c.

Les modifs ont soient un commentaire "/* CIRPACK */" soit une fonction avec "_cirpack". Par contre je ferai un document sur la supervision des switch voix Cirpack. Les trap snmp c'est pas forcément pratique donc en faite j'extrait d'un fichier log sur le cirpack un relevé d'alarms que je map dans une base MySQL et que je QUERY avec check_mysql_query.

Ci joint le code des deux :

Check_MySQL_Query.c


/************************************************** ****************************
*
* CHECK_MYSQL_QUERY.C
*
* Program: Mysql plugin for Nagios
* License: GPL
* Copyright (c) 2006 Nagios Plugins Team, after Didi Rieder (check_mysql)
*
* $Id: check_mysql_query.c,v 1.4 2006/07/13 12:50:21 tonvoon Exp $
*
* Description:
* This plugin is for running arbitrary SQL and checking the results
*
************************************************** ****************************/

const char *progname = "check_mysql_query";
const char *revision = "$Revision: 1.4 $";
const char *copyright = "2006";
const char *email = "nagiosplug-devel@lists.sourceforge.net";

#include "common.h"
#include "utils.h"
#include "utils_base.h"
#include "netutils.h"

#include <mysql.h>
#include <errmsg.h>

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", value);

status = get_status_cirpack(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(_("%3.0f%% ASR"),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_cirpack(&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"));

printf ("\n\n");

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:"));
printf ("%s -q SQL_query [-w warn] [-c crit]\n",progname);
printf ("[-d database] [-H host] [-P port] [-u user] [-p password]\n");
}



utils_base.c



/************************************************** ***************************
*
* utils_base.c
*
* Library of useful functions for plugins
* These functions are tested with libtap. See tests/ directory
*
* Copyright (c) 2006 Nagios Plugin Development Team
* License: GPL
*
* $Revision: 1.2 $
* $Date: 2006/07/14 09:47:25 $
************************************************** **************************/

#include <stdarg.h>
#include "common.h"
#include "utils_base.h"

void
die (int result, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
vprintf (fmt, ap);
va_end (ap);
exit (result);
}

void set_range_start (range *this, double value) {
this->start = value;
this->start_infinity = FALSE;
}

void set_range_end (range *this, double value) {
this->end = value;
this->end_infinity = FALSE;
}

range
*parse_range_string (char *str) {
range *temp_range;
double start;
double end;
char *end_str;

temp_range = (range *) malloc(sizeof(range));

/* Set defaults */
temp_range->start = 0;
temp_range->start_infinity = FALSE;
temp_range->end = 0;
temp_range->end_infinity = TRUE;
temp_range->alert_on = OUTSIDE;

if (str[0] == '@') {
temp_range->alert_on = INSIDE;
str++;
}

end_str = index(str, ':');
if (end_str != NULL) {
if (str[0] == '~') {
temp_range->start_infinity = TRUE;
} else {
start = strtod(str, NULL); /* Will stop at the ':' */
set_range_start(temp_range, start);
}
end_str++; /* Move past the ':' */
} else {
end_str = str;
}
end = strtod(end_str, NULL);
if (strcmp(end_str, "") != 0) {
set_range_end(temp_range, end);
}

if (temp_range->start_infinity == TRUE ||
temp_range->end_infinity == TRUE ||
temp_range->start <= temp_range->end) {
return temp_range;
}
free(temp_range);
return NULL;
}

/* CIRPACK */
range
*parse_range_string_cirpack (char *str) {
range *temp_range;
double start;
double end;
char *end_str;

temp_range = (range *) malloc(sizeof(range));

/* Set defaults */
temp_range->start = 0;
temp_range->start_infinity = FALSE;
temp_range->end = 0;
temp_range->end_infinity = TRUE;
temp_range->alert_on = OUTSIDE;

if (str[0] == '@') {
temp_range->alert_on = INSIDE;
str++;
}

end_str = index(str, ':');
if (end_str != NULL) {
if (str[0] == '~') {
temp_range->start_infinity = TRUE;
} else {
start = strtod(str, NULL); /* Will stop at the ':' */
set_range_start(temp_range, start);
}
end_str++; /* Move past the ':' */
} else {
end_str = str;
}
end = strtod(end_str, NULL);
if (strcmp(end_str, "") != 0) {
set_range_end(temp_range, end);
}

if (temp_range->start_infinity == TRUE ||
temp_range->end_infinity == TRUE ||
temp_range->start >= temp_range->end) {
return temp_range;
}
free(temp_range);
return NULL;
}

/* returns 0 if okay, otherwise 1 */
int
_set_thresholds(thresholds **my_thresholds, char *warn_string, char *critical_string)
{
thresholds *temp_thresholds = NULL;

temp_thresholds = malloc(sizeof(temp_thresholds));

temp_thresholds->warning = NULL;
temp_thresholds->critical = NULL;

if (warn_string != NULL) {
if ((temp_thresholds->warning = parse_range_string(warn_string)) == NULL) {
return 1;
}
}
if (critical_string != NULL) {
if ((temp_thresholds->critical = parse_range_string(critical_string)) == NULL) {
return 1;
}
}

if (*my_thresholds > 0) { /* Not sure why, but sometimes could be -1 */
/* printf("Freeing here: %d\n", *my_thresholds); */
free(*my_thresholds);
}
*my_thresholds = temp_thresholds;

return 0;
}

/* CIRPACK */
int
_set_thresholds_cirpack(thresholds **my_thresholds, char *warn_string, char *critical_string)
{
thresholds *temp_thresholds = NULL;

temp_thresholds = malloc(sizeof(temp_thresholds));

temp_thresholds->warning = NULL;
temp_thresholds->critical = NULL;

if (warn_string != NULL) {
if ((temp_thresholds->warning = parse_range_string_cirpack(warn_string)) == NULL) {
return 1;
}
}
if (critical_string != NULL) {
if ((temp_thresholds->critical = parse_range_string_cirpack(critical_string)) == NULL) {
return 1;
}
}

if (*my_thresholds > 0) { /* Not sure why, but sometimes could be -1 */
/* printf("Freeing here: %d\n", *my_thresholds); */
free(*my_thresholds);
}
*my_thresholds = temp_thresholds;

return 0;
}

void
set_thresholds(thresholds **my_thresholds, char *warn_string, char *critical_string)
{
if (_set_thresholds(my_thresholds, warn_string, critical_string) == 0) {
return;
} else {
die(STATE_UNKNOWN, _("Range format incorrect"));
}
}

/* CIRPACK */
void
set_thresholds_cirpack(thresholds **my_thresholds, char *warn_string, char *critical_string)
{
if (_set_thresholds_cirpack(my_thresholds, warn_string, critical_string) == 0) {
return;
} else {
die(STATE_UNKNOWN, _("Range format incorrect"));
}
}

void print_thresholds(const char *threshold_name, thresholds *my_threshold) {
printf("%s - ", threshold_name);
if (! my_threshold) {
printf("Threshold not set");
} else {
if (my_threshold->warning) {
printf("Warning: start=%g end=%g; ", my_threshold->warning->start, my_threshold->warning->end);
} else {
printf("Warning not set; ");
}
if (my_threshold->critical) {
printf("Critical: start=%g end=%g", my_threshold->critical->start, my_threshold->critical->end);
} else {
printf("Critical not set");
}
}
printf("\n");
}

/* Returns TRUE if alert should be raised based on the range */
int
check_range(double value, range *my_range)
{
int false = FALSE;
int true = TRUE;

if (my_range->alert_on == INSIDE) {
false = TRUE;
true = FALSE;
}

if (my_range->end_infinity == FALSE && my_range->start_infinity == FALSE) {
if ((my_range->start <= value) && (value <= my_range->end)) {
return false;
} else {
return true;
}
} else if (my_range->start_infinity == FALSE && my_range->end_infinity == TRUE) {
if (my_range->start <= value) {
return false;
} else {
return true;
}
} else if (my_range->start_infinity == TRUE && my_range->end_infinity == FALSE) {
if (value <= my_range->end) {
return false;
} else {
return true;
}
} else {
return false;
}
}

/* CIRPACK */
int
check_range_cirpack(double value, range *my_range)
{
int false = FALSE;
int true = TRUE;

if (my_range->alert_on == INSIDE) {
false = TRUE;
true = FALSE;
}

if (my_range->end_infinity == FALSE && my_range->start_infinity == FALSE) {
if ((value >= my_range->start) && (value >= my_range->end)) {
return false;
} else {
return true;
}
} else if (my_range->start_infinity == FALSE && my_range->end_infinity == TRUE) {
if (value <= my_range->start) {
return false;
} else {
return true;
}
} else if (my_range->start_infinity == TRUE && my_range->end_infinity == FALSE) {
if (value <= my_range->end) {
return false;
} else {
return true;
}
} else {
return false;
}
}

/* CIRPACK */
int
get_status_cirpack(double value, thresholds *my_thresholds)
{
if (my_thresholds->critical != NULL) {
if (check_range_cirpack(value, my_thresholds->critical) == TRUE) {
return STATE_CRITICAL;
}
}
if (my_thresholds->warning != NULL) {
if (check_range_cirpack(value, my_thresholds->warning) == TRUE) {
return STATE_WARNING;
}
}
return STATE_OK;
}


/* Returns status */
int
get_status(double value, thresholds *my_thresholds)
{
if (my_thresholds->critical != NULL) {
if (check_range(value, my_thresholds->critical) == TRUE) {
return STATE_CRITICAL;
}
}
if (my_thresholds->warning != NULL) {
if (check_range(value, my_thresholds->warning) == TRUE) {
return STATE_WARNING;
}
}
return STATE_OK;
}

char *np_escaped_string (const char *string) {
char *data;
int i, j=0;
data = strdup(string);
for (i=0; data[i]; i++) {
if (data[i] == '\\') {
switch(data[++i]) {
case 'n':
data[j++] = '\n';
break;
case 'r':
data[j++] = '\r';
break;
case 't':
data[j++] = '\t';
break;
case '\\':
data[j++] = '\\';
break;
default:
data[j++] = data[i];
}
} else {
data[j++] = data[i];
}
}
data[j] = '\0';
return data;
}

templuche
08-12-2006, 10:04 AM
Templuch, je me suis tapé le code j'ai changé les opérateurs de vérif j'ai ajouté des fonction dans la lib userbase.c.
Heu... pourquoi avoir fait ça alors que le plugin fait EXACTEMENT ce que tu cherches? Soit je n'ai rien compris à ce que tu voulais faire soit c'est toi que je ne te comprends pas. :?