2008-01-30 05:53:47 -05:00
/*****************************************************************************
*
2014-01-19 21:12:50 -05:00
* Monitoring check_mysql plugin
2008-01-30 05:53:47 -05:00
*
2002-02-28 01:42:51 -05:00
* License : GPL
2008-01-30 05:53:47 -05:00
* Copyright ( c ) 1999 Didi Rieder ( adrieder @ sbox . tu - graz . ac . at )
* Copyright ( c ) 2000 Karl DeBisschop ( kdebisschop @ users . sourceforge . net )
2024-10-31 09:45:24 -04:00
* Copyright ( c ) 1999 - 2024 Monitoring Plugins Development Team
2008-01-30 05:53:47 -05:00
*
2002-02-28 01:42:51 -05:00
* Description :
2008-01-30 05:53:47 -05:00
*
2006-10-18 20:25:16 -04:00
* This file contains the check_mysql plugin
2008-01-30 05:53:47 -05:00
*
* This program tests connections to a mysql server
*
*
* This program is free software : you can redistribute it and / or modify
2006-10-18 20:25:16 -04:00
* it under the terms of the GNU General Public License as published by
2008-01-30 05:53:47 -05:00
* the Free Software Foundation , either version 3 of the License , or
2006-10-18 20:25:16 -04:00
* ( at your option ) any later version .
2008-01-30 05:53:47 -05:00
*
2006-10-18 20:25:16 -04:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2008-01-30 05:53:47 -05:00
*
2006-10-18 20:25:16 -04:00
* You should have received a copy of the GNU General Public License
2008-01-30 05:53:47 -05:00
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-02-28 01:42:51 -05:00
2003-01-16 01:42:24 -05:00
const char * progname = " check_mysql " ;
2024-10-31 09:45:24 -04:00
const char * copyright = " 1999-2024 " ;
2014-01-18 03:40:24 -05:00
const char * email = " devel@monitoring-plugins.org " ;
2002-02-28 01:42:51 -05:00
2021-10-31 08:37:55 -04:00
# define SLAVERESULTSIZE 96
2004-11-21 00:24:57 -05:00
2002-02-28 01:42:51 -05:00
# include "common.h"
# include "utils.h"
2006-07-13 08:50:23 -04:00
# include "utils_base.h"
2003-08-02 18:06:06 -04:00
# include "netutils.h"
2004-12-02 19:55:28 -05:00
2006-03-17 09:07:34 -05:00
# include <mysql.h>
2013-09-30 18:47:08 -04:00
# include <mysqld_error.h>
2006-03-17 09:07:34 -05:00
# include <errmsg.h>
2002-02-28 01:42:51 -05:00
2024-11-08 06:32:45 -05:00
static char * db_user = NULL ;
static char * db_host = NULL ;
static char * db_socket = NULL ;
static char * db_pass = NULL ;
static char * db = NULL ;
static char * ca_cert = NULL ;
static char * ca_dir = NULL ;
static char * cert = NULL ;
static char * key = NULL ;
static char * ciphers = NULL ;
static bool ssl = false ;
static char * opt_file = NULL ;
static char * opt_group = NULL ;
static unsigned int db_port = MYSQL_PORT ;
static bool check_slave = false ;
static bool ignore_auth = false ;
static int verbose = 0 ;
2006-03-15 14:54:32 -05:00
2012-08-03 16:12:55 -04:00
static double warning_time = 0 ;
static double critical_time = 0 ;
2012-11-20 14:13:16 -05:00
# define LENGTH_METRIC_UNIT 6
2012-08-06 12:15:35 -04:00
static const char * metric_unit [ LENGTH_METRIC_UNIT ] = {
" Open_files " ,
" Open_tables " ,
" Qcache_free_memory " ,
" Qcache_queries_in_cache " ,
" Threads_connected " ,
" Threads_running "
} ;
2012-11-20 14:13:16 -05:00
# define LENGTH_METRIC_COUNTER 9
2012-08-06 12:15:35 -04:00
static const char * metric_counter [ LENGTH_METRIC_COUNTER ] = {
2012-11-20 14:13:16 -05:00
" Connections " ,
2012-08-06 12:15:35 -04:00
" Qcache_hits " ,
" Qcache_inserts " ,
" Qcache_lowmem_prunes " ,
" Qcache_not_cached " ,
" Queries " ,
" Questions " ,
" Table_locks_waited " ,
" Uptime "
} ;
2021-10-31 08:37:55 -04:00
# define MYSQLDUMP_THREADS_QUERY "SELECT COUNT(1) mysqldumpThreads FROM information_schema.processlist WHERE info LIKE 'SELECT /*!40001 SQL_NO_CACHE */ %'"
2024-11-08 06:32:45 -05:00
static thresholds * my_threshold = NULL ;
2002-02-28 01:42:51 -05:00
2024-11-08 06:32:45 -05:00
static int process_arguments ( int , char * * ) ;
static int validate_arguments ( void ) ;
static void print_help ( void ) ;
2003-08-10 02:53:22 -04:00
void print_usage ( void ) ;
2002-02-28 01:42:51 -05:00
int
main ( int argc , char * * argv )
{
MYSQL mysql ;
2004-11-21 00:24:57 -05:00
MYSQL_RES * res ;
MYSQL_ROW row ;
2008-11-19 01:45:18 -05:00
2004-12-02 19:55:28 -05:00
/* should be status */
2008-11-19 01:45:18 -05:00
2003-08-10 02:53:22 -04:00
char * result = NULL ;
2005-12-15 12:06:55 -05:00
char * error = NULL ;
2023-09-18 16:58:34 -04:00
char slaveresult [ SLAVERESULTSIZE ] = { 0 } ;
2012-08-06 12:15:35 -04:00
char * perf ;
2023-10-18 10:40:51 -04:00
perf = strdup ( " " ) ;
2002-02-28 01:42:51 -05:00
2003-08-22 02:22:38 -04:00
setlocale ( LC_ALL , " " ) ;
bindtextdomain ( PACKAGE , LOCALEDIR ) ;
textdomain ( PACKAGE ) ;
2008-05-07 06:02:42 -04:00
/* Parse extra opts if any */
argv = np_extra_opts ( & argc , argv , progname ) ;
2004-12-03 18:55:29 -05:00
if ( process_arguments ( argc , argv ) = = ERROR )
2004-12-02 11:51:25 -05:00
usage4 ( _ ( " Could not parse arguments " ) ) ;
2002-02-28 01:42:51 -05:00
/* initialize mysql */
mysql_init ( & mysql ) ;
2012-12-28 12:40:23 -05:00
if ( opt_file ! = NULL )
mysql_options ( & mysql , MYSQL_READ_DEFAULT_FILE , opt_file ) ;
2002-02-28 01:42:51 -05:00
2012-12-28 12:40:23 -05:00
if ( opt_group ! = NULL )
mysql_options ( & mysql , MYSQL_READ_DEFAULT_GROUP , opt_group ) ;
else
mysql_options ( & mysql , MYSQL_READ_DEFAULT_GROUP , " client " ) ;
2005-10-13 05:55:31 -04:00
2013-05-22 12:35:17 -04:00
if ( ssl )
2013-08-17 19:47:32 -04:00
mysql_ssl_set ( & mysql , key , cert , ca_cert , ca_dir , ciphers ) ;
2002-02-28 01:42:51 -05:00
/* establish a connection to the server and error checking */
2008-04-30 08:50:52 -04:00
if ( ! mysql_real_connect ( & mysql , db_host , db_user , db_pass , db , db_port , db_socket , 0 ) ) {
2023-05-19 03:05:02 -04:00
/* Depending on internally-selected auth plugin MySQL might return */
/* ER_ACCESS_DENIED_NO_PASSWORD_ERROR or ER_ACCESS_DENIED_ERROR. */
/* Semantically these errors are the same. */
if ( ignore_auth & & ( mysql_errno ( & mysql ) = = ER_ACCESS_DENIED_ERROR | | mysql_errno ( & mysql ) = = ER_ACCESS_DENIED_NO_PASSWORD_ERROR ) )
2013-09-30 18:47:08 -04:00
{
printf ( " MySQL OK - Version: %s (protocol %d) \n " ,
mysql_get_server_info ( & mysql ) ,
mysql_get_proto_info ( & mysql )
) ;
mysql_close ( & mysql ) ;
return STATE_OK ;
}
else if ( mysql_errno ( & mysql ) = = CR_UNKNOWN_HOST )
2003-08-10 02:53:22 -04:00
die ( STATE_WARNING , " %s \n " , mysql_error ( & mysql ) ) ;
else if ( mysql_errno ( & mysql ) = = CR_VERSION_ERROR )
die ( STATE_WARNING , " %s \n " , mysql_error ( & mysql ) ) ;
else if ( mysql_errno ( & mysql ) = = CR_OUT_OF_MEMORY )
die ( STATE_WARNING , " %s \n " , mysql_error ( & mysql ) ) ;
else if ( mysql_errno ( & mysql ) = = CR_IPSOCK_ERROR )
die ( STATE_WARNING , " %s \n " , mysql_error ( & mysql ) ) ;
else if ( mysql_errno ( & mysql ) = = CR_SOCKET_CREATE_ERROR )
die ( STATE_WARNING , " %s \n " , mysql_error ( & mysql ) ) ;
else
die ( STATE_CRITICAL , " %s \n " , mysql_error ( & mysql ) ) ;
2002-02-28 01:42:51 -05:00
}
/* get the server stats */
2003-08-10 02:53:22 -04:00
result = strdup ( mysql_stat ( & mysql ) ) ;
2002-02-28 01:42:51 -05:00
/* error checking once more */
if ( mysql_error ( & mysql ) ) {
2003-08-10 02:53:22 -04:00
if ( mysql_errno ( & mysql ) = = CR_SERVER_GONE_ERROR )
die ( STATE_CRITICAL , " %s \n " , mysql_error ( & mysql ) ) ;
else if ( mysql_errno ( & mysql ) = = CR_SERVER_LOST )
die ( STATE_CRITICAL , " %s \n " , mysql_error ( & mysql ) ) ;
else if ( mysql_errno ( & mysql ) = = CR_UNKNOWN_ERROR )
die ( STATE_CRITICAL , " %s \n " , mysql_error ( & mysql ) ) ;
2002-02-28 01:42:51 -05:00
}
2012-08-06 12:15:35 -04:00
/* try to fetch some perf data */
if ( mysql_query ( & mysql , " show global status " ) = = 0 ) {
if ( ( res = mysql_store_result ( & mysql ) ) = = NULL ) {
error = strdup ( mysql_error ( & mysql ) ) ;
mysql_close ( & mysql ) ;
die ( STATE_CRITICAL , _ ( " status store_result error: %s \n " ) , error ) ;
}
while ( ( row = mysql_fetch_row ( res ) ) ! = NULL ) {
int i ;
2012-11-20 13:31:18 -05:00
for ( i = 0 ; i < LENGTH_METRIC_UNIT ; i + + ) {
2012-08-06 12:15:35 -04:00
if ( strcmp ( row [ 0 ] , metric_unit [ i ] ) = = 0 ) {
2012-11-20 13:31:18 -05:00
xasprintf ( & perf , " %s%s " , perf , perfdata ( metric_unit [ i ] ,
2023-10-18 10:40:51 -04:00
atol ( row [ 1 ] ) , " " , false , 0 , false , 0 , false , 0 , false , 0 ) ) ;
2012-08-06 12:15:35 -04:00
continue ;
}
}
2012-11-20 13:31:18 -05:00
for ( i = 0 ; i < LENGTH_METRIC_COUNTER ; i + + ) {
2012-08-06 12:15:35 -04:00
if ( strcmp ( row [ 0 ] , metric_counter [ i ] ) = = 0 ) {
2012-11-20 13:31:18 -05:00
xasprintf ( & perf , " %s%s " , perf , perfdata ( metric_counter [ i ] ,
2023-10-18 10:40:51 -04:00
atol ( row [ 1 ] ) , " c " , false , 0 , false , 0 , false , 0 , false , 0 ) ) ;
2012-08-06 12:15:35 -04:00
continue ;
}
}
}
2012-11-20 13:31:18 -05:00
/* remove trailing space */
if ( strlen ( perf ) > 0 )
perf [ strlen ( perf ) - 1 ] = ' \0 ' ;
2012-08-06 12:15:35 -04:00
}
2004-11-21 00:24:57 -05:00
if ( check_slave ) {
/* check the slave status */
if ( mysql_query ( & mysql , " show slave status " ) ! = 0 ) {
2005-12-15 12:06:55 -05:00
error = strdup ( mysql_error ( & mysql ) ) ;
2004-11-21 00:24:57 -05:00
mysql_close ( & mysql ) ;
2005-12-15 12:06:55 -05:00
die ( STATE_CRITICAL , _ ( " slave query error: %s \n " ) , error ) ;
2004-11-21 00:24:57 -05:00
}
/* store the result */
if ( ( res = mysql_store_result ( & mysql ) ) = = NULL ) {
2005-12-15 12:06:55 -05:00
error = strdup ( mysql_error ( & mysql ) ) ;
2004-11-21 00:24:57 -05:00
mysql_close ( & mysql ) ;
2005-12-15 12:06:55 -05:00
die ( STATE_CRITICAL , _ ( " slave store_result error: %s \n " ) , error ) ;
}
/* Check there is some data */
if ( mysql_num_rows ( res ) = = 0 ) {
mysql_close ( & mysql ) ;
die ( STATE_WARNING , " %s \n " , _ ( " No slaves defined " ) ) ;
2004-11-21 00:24:57 -05:00
}
/* fetch the first row */
if ( ( row = mysql_fetch_row ( res ) ) = = NULL ) {
2005-12-15 12:06:55 -05:00
error = strdup ( mysql_error ( & mysql ) ) ;
2004-11-21 00:24:57 -05:00
mysql_free_result ( res ) ;
mysql_close ( & mysql ) ;
2005-12-15 12:06:55 -05:00
die ( STATE_CRITICAL , _ ( " slave fetch row error: %s \n " ) , error ) ;
2004-11-21 00:24:57 -05:00
}
if ( mysql_field_count ( & mysql ) = = 12 ) {
/* mysql 3.23.x */
2004-12-25 18:17:46 -05:00
snprintf ( slaveresult , SLAVERESULTSIZE , _ ( " Slave running: %s " ) , row [ 6 ] ) ;
2004-11-21 00:24:57 -05:00
if ( strcmp ( row [ 6 ] , " Yes " ) ! = 0 ) {
mysql_free_result ( res ) ;
mysql_close ( & mysql ) ;
die ( STATE_CRITICAL , " %s \n " , slaveresult ) ;
}
2005-05-25 22:13:19 -04:00
} else {
2013-01-24 02:56:19 -05:00
/* mysql 4.x.x and mysql 5.x.x */
2006-03-15 14:54:32 -05:00
int slave_io_field = - 1 , slave_sql_field = - 1 , seconds_behind_field = - 1 , i , num_fields ;
2005-05-25 22:13:19 -04:00
MYSQL_FIELD * fields ;
num_fields = mysql_num_fields ( res ) ;
fields = mysql_fetch_fields ( res ) ;
2006-03-15 14:54:32 -05:00
for ( i = 0 ; i < num_fields ; i + + ) {
if ( strcmp ( fields [ i ] . name , " Slave_IO_Running " ) = = 0 ) {
2005-05-25 22:13:19 -04:00
slave_io_field = i ;
continue ;
}
2006-03-15 14:54:32 -05:00
if ( strcmp ( fields [ i ] . name , " Slave_SQL_Running " ) = = 0 ) {
2005-05-25 22:13:19 -04:00
slave_sql_field = i ;
continue ;
}
2006-03-15 14:54:32 -05:00
if ( strcmp ( fields [ i ] . name , " Seconds_Behind_Master " ) = = 0 ) {
seconds_behind_field = i ;
continue ;
}
2005-05-25 22:13:19 -04:00
}
2009-03-24 02:01:48 -04:00
2013-01-24 02:56:19 -05:00
/* Check if slave status is available */
2006-03-15 14:54:32 -05:00
if ( ( slave_io_field < 0 ) | | ( slave_sql_field < 0 ) | | ( num_fields = = 0 ) ) {
2005-03-17 22:14:03 -05:00
mysql_free_result ( res ) ;
mysql_close ( & mysql ) ;
2005-05-25 22:13:19 -04:00
die ( STATE_CRITICAL , " Slave status unavailable \n " ) ;
2005-03-17 22:14:03 -05:00
}
2008-11-19 01:45:18 -05:00
2013-01-24 02:56:19 -05:00
/* Save slave status in slaveresult */
2009-03-24 02:01:48 -04:00
snprintf ( slaveresult , SLAVERESULTSIZE , " Slave IO: %s Slave SQL: %s Seconds Behind Master: %s " , row [ slave_io_field ] , row [ slave_sql_field ] , seconds_behind_field ! = - 1 ? row [ seconds_behind_field ] : " Unknown " ) ;
2013-01-24 02:56:19 -05:00
2021-10-31 08:37:55 -04:00
/* Raise critical error if SQL THREAD or IO THREAD are stopped, but only if there are no mysqldump threads running */
2005-05-25 22:13:19 -04:00
if ( strcmp ( row [ slave_io_field ] , " Yes " ) ! = 0 | | strcmp ( row [ slave_sql_field ] , " Yes " ) ! = 0 ) {
2021-10-31 08:37:55 -04:00
MYSQL_RES * res_mysqldump ;
MYSQL_ROW row_mysqldump ;
unsigned int mysqldump_threads = 0 ;
if ( mysql_query ( & mysql , MYSQLDUMP_THREADS_QUERY ) = = 0 ) {
/* store the result */
if ( ( res_mysqldump = mysql_store_result ( & mysql ) ) ! = NULL ) {
if ( mysql_num_rows ( res_mysqldump ) = = 1 ) {
if ( ( row_mysqldump = mysql_fetch_row ( res_mysqldump ) ) ! = NULL ) {
mysqldump_threads = atoi ( row_mysqldump [ 0 ] ) ;
}
}
/* free the result */
mysql_free_result ( res_mysqldump ) ;
}
2023-09-18 13:18:35 -04:00
mysql_close ( & mysql ) ;
2021-10-31 08:37:55 -04:00
}
if ( mysqldump_threads = = 0 ) {
die ( STATE_CRITICAL , " %s \n " , slaveresult ) ;
} else {
2023-09-18 16:58:34 -04:00
strncat ( slaveresult , " Mysqldump: in progress " , SLAVERESULTSIZE - 1 ) ;
2021-10-31 08:37:55 -04:00
}
2004-11-21 00:24:57 -05:00
}
2006-03-15 14:54:32 -05:00
if ( verbose > = 3 ) {
if ( seconds_behind_field = = - 1 ) {
printf ( " seconds_behind_field not found \n " ) ;
} else {
printf ( " seconds_behind_field(index %d)=%s \n " , seconds_behind_field , row [ seconds_behind_field ] ) ;
}
}
2013-01-24 02:56:19 -05:00
/* Check Seconds Behind against threshold */
2021-10-31 08:37:55 -04:00
if ( ( seconds_behind_field ! = - 1 ) & & ( row [ seconds_behind_field ] ! = NULL & & strcmp ( row [ seconds_behind_field ] , " NULL " ) ! = 0 ) ) {
2006-03-15 14:54:32 -05:00
double value = atof ( row [ seconds_behind_field ] ) ;
int status ;
status = get_status ( value , my_threshold ) ;
2012-08-06 12:15:35 -04:00
xasprintf ( & perf , " %s %s " , perf , fperfdata ( " seconds behind master " , value , " s " ,
2023-10-18 10:40:51 -04:00
true , ( double ) warning_time ,
true , ( double ) critical_time ,
false , 0 ,
false , 0 ) ) ;
2012-08-03 16:12:55 -04:00
2006-03-15 14:54:32 -05:00
if ( status = = STATE_WARNING ) {
2012-08-06 12:15:35 -04:00
printf ( " SLOW_SLAVE %s: %s|%s \n " , _ ( " WARNING " ) , slaveresult , perf ) ;
2006-03-15 14:54:32 -05:00
exit ( STATE_WARNING ) ;
} else if ( status = = STATE_CRITICAL ) {
2012-08-06 12:15:35 -04:00
printf ( " SLOW_SLAVE %s: %s|%s \n " , _ ( " CRITICAL " ) , slaveresult , perf ) ;
2006-03-15 14:54:32 -05:00
exit ( STATE_CRITICAL ) ;
}
}
2004-11-21 00:24:57 -05:00
}
/* free the result */
mysql_free_result ( res ) ;
}
2002-02-28 01:42:51 -05:00
/* close the connection */
mysql_close ( & mysql ) ;
/* print out the result of stats */
2012-08-06 12:15:35 -04:00
if ( check_slave ) {
printf ( " %s %s|%s \n " , result , slaveresult , perf ) ;
2004-11-21 00:24:57 -05:00
} else {
2012-08-06 12:15:35 -04:00
printf ( " %s|%s \n " , result , perf ) ;
2004-11-21 00:24:57 -05:00
}
2002-02-28 01:42:51 -05:00
return STATE_OK ;
}
/* process command-line arguments */
int
process_arguments ( int argc , char * * argv )
{
int c ;
2006-03-15 14:54:32 -05:00
char * warning = NULL ;
char * critical = NULL ;
2002-02-28 01:42:51 -05:00
2003-08-10 02:53:22 -04:00
int option = 0 ;
static struct option longopts [ ] = {
2002-02-28 01:42:51 -05:00
{ " hostname " , required_argument , 0 , ' H ' } ,
2008-04-30 08:50:52 -04:00
{ " socket " , required_argument , 0 , ' s ' } ,
2002-02-28 01:42:51 -05:00
{ " database " , required_argument , 0 , ' d ' } ,
{ " username " , required_argument , 0 , ' u ' } ,
{ " password " , required_argument , 0 , ' p ' } ,
2012-12-28 12:40:23 -05:00
{ " file " , required_argument , 0 , ' f ' } ,
{ " group " , required_argument , 0 , ' g ' } ,
2002-02-28 01:42:51 -05:00
{ " port " , required_argument , 0 , ' P ' } ,
2006-03-15 14:54:32 -05:00
{ " critical " , required_argument , 0 , ' c ' } ,
{ " warning " , required_argument , 0 , ' w ' } ,
2004-11-21 00:24:57 -05:00
{ " check-slave " , no_argument , 0 , ' S ' } ,
2013-09-30 18:47:08 -04:00
{ " ignore-auth " , no_argument , 0 , ' n ' } ,
2002-02-28 01:42:51 -05:00
{ " verbose " , no_argument , 0 , ' v ' } ,
{ " version " , no_argument , 0 , ' V ' } ,
{ " help " , no_argument , 0 , ' h ' } ,
2013-05-22 12:35:17 -04:00
{ " ssl " , no_argument , 0 , ' l ' } ,
2013-08-17 19:47:32 -04:00
{ " ca-cert " , optional_argument , 0 , ' C ' } ,
2013-05-22 12:35:17 -04:00
{ " key " , required_argument , 0 , ' k ' } ,
{ " cert " , required_argument , 0 , ' a ' } ,
2013-08-17 19:47:32 -04:00
{ " ca-dir " , required_argument , 0 , ' D ' } ,
{ " ciphers " , required_argument , 0 , ' L ' } ,
2002-02-28 01:42:51 -05:00
{ 0 , 0 , 0 , 0 }
} ;
2002-11-12 06:26:01 -05:00
if ( argc < 1 )
return ERROR ;
2002-02-28 01:42:51 -05:00
while ( 1 ) {
2013-09-30 18:47:08 -04:00
c = getopt_long ( argc , argv , " hlvVnSP:p:u:d:H:s:c:w:a:k:C:D:L:f:g: " , longopts , & option ) ;
2002-02-28 01:42:51 -05:00
2002-11-12 06:26:01 -05:00
if ( c = = - 1 | | c = = EOF )
2002-02-28 01:42:51 -05:00
break ;
switch ( c ) {
case ' H ' : /* hostname */
if ( is_host ( optarg ) ) {
db_host = optarg ;
}
2013-05-10 11:21:34 -04:00
else if ( * optarg = = ' / ' ) {
db_socket = optarg ;
}
2002-02-28 01:42:51 -05:00
else {
2004-12-01 18:54:51 -05:00
usage2 ( _ ( " Invalid hostname/address " ) , optarg ) ;
2002-02-28 01:42:51 -05:00
}
break ;
2008-04-30 08:50:52 -04:00
case ' s ' : /* socket */
db_socket = optarg ;
break ;
case ' d ' : /* database */
2002-02-28 01:42:51 -05:00
db = optarg ;
break ;
2013-05-22 12:35:17 -04:00
case ' l ' :
ssl = true ;
break ;
2013-08-17 19:47:32 -04:00
case ' C ' :
2013-05-22 12:35:17 -04:00
ca_cert = optarg ;
break ;
case ' a ' :
cert = optarg ;
break ;
case ' k ' :
key = optarg ;
break ;
2013-08-17 19:47:32 -04:00
case ' D ' :
ca_dir = optarg ;
2013-05-22 12:35:17 -04:00
break ;
2013-08-17 19:47:32 -04:00
case ' L ' :
ciphers = optarg ;
2013-05-22 12:35:17 -04:00
break ;
2002-02-28 01:42:51 -05:00
case ' u ' : /* username */
db_user = optarg ;
break ;
case ' p ' : /* authentication information: password */
2008-04-30 08:50:52 -04:00
db_pass = strdup ( optarg ) ;
/* Delete the password from process list */
while ( * optarg ! = ' \0 ' ) {
* optarg = ' X ' ;
optarg + + ;
}
2002-02-28 01:42:51 -05:00
break ;
2013-08-18 16:28:18 -04:00
case ' f ' : /* client options file */
2012-12-28 12:40:23 -05:00
opt_file = optarg ;
break ;
2013-08-18 16:28:18 -04:00
case ' g ' : /* client options group */
2012-12-28 12:40:23 -05:00
opt_group = optarg ;
break ;
2002-02-28 01:42:51 -05:00
case ' P ' : /* critical time threshold */
db_port = atoi ( optarg ) ;
break ;
2004-11-21 00:24:57 -05:00
case ' S ' :
2024-08-28 13:20:31 -04:00
check_slave = true ; /* check-slave */
2004-11-21 00:24:57 -05:00
break ;
2013-09-30 18:47:08 -04:00
case ' n ' :
2024-08-28 13:20:31 -04:00
ignore_auth = true ; /* ignore-auth */
2013-09-30 18:47:08 -04:00
break ;
2006-03-15 14:54:32 -05:00
case ' w ' :
warning = optarg ;
2012-08-03 16:12:55 -04:00
warning_time = strtod ( warning , NULL ) ;
2006-03-15 14:54:32 -05:00
break ;
case ' c ' :
critical = optarg ;
2012-08-03 16:12:55 -04:00
critical_time = strtod ( critical , NULL ) ;
2006-03-15 14:54:32 -05:00
break ;
2002-02-28 01:42:51 -05:00
case ' V ' : /* version */
2008-11-23 00:38:47 -05:00
print_revision ( progname , NP_VERSION ) ;
2015-10-04 13:02:43 -04:00
exit ( STATE_UNKNOWN ) ;
2002-02-28 01:42:51 -05:00
case ' h ' : /* help */
print_help ( ) ;
2015-10-04 13:02:43 -04:00
exit ( STATE_UNKNOWN ) ;
2006-03-15 14:54:32 -05:00
case ' v ' :
verbose + + ;
break ;
2002-02-28 01:42:51 -05:00
case ' ? ' : /* help */
2007-01-28 16:46:41 -05:00
usage5 ( ) ;
2002-02-28 01:42:51 -05:00
}
}
2002-11-12 06:26:01 -05:00
c = optind ;
2006-03-15 14:54:32 -05:00
set_thresholds ( & my_threshold , warning , critical ) ;
2003-02-10 19:47:47 -05:00
while ( argc > c ) {
2002-11-12 06:26:01 -05:00
2007-03-29 13:58:28 -04:00
if ( db_host = = NULL )
2003-02-10 19:47:47 -05:00
if ( is_host ( argv [ c ] ) ) {
db_host = argv [ c + + ] ;
}
else {
2007-03-29 13:58:28 -04:00
usage2 ( _ ( " Invalid hostname/address " ) , argv [ c ] ) ;
2003-02-10 19:47:47 -05:00
}
2007-03-29 13:58:28 -04:00
else if ( db_user = = NULL )
2003-02-10 19:47:47 -05:00
db_user = argv [ c + + ] ;
2007-03-29 13:58:28 -04:00
else if ( db_pass = = NULL )
2003-02-10 19:47:47 -05:00
db_pass = argv [ c + + ] ;
2007-03-29 13:58:28 -04:00
else if ( db = = NULL )
2003-02-10 19:47:47 -05:00
db = argv [ c + + ] ;
else if ( is_intnonneg ( argv [ c ] ) )
db_port = atoi ( argv [ c + + ] ) ;
else
break ;
}
2002-11-12 06:26:01 -05:00
return validate_arguments ( ) ;
2002-02-28 01:42:51 -05:00
}
int
validate_arguments ( void )
{
2003-08-10 02:53:22 -04:00
if ( db_user = = NULL )
db_user = strdup ( " " ) ;
if ( db_host = = NULL )
db_host = strdup ( " " ) ;
if ( db = = NULL )
db = strdup ( " " ) ;
2002-02-28 01:42:51 -05:00
return OK ;
}
2003-08-10 02:53:22 -04:00
void
print_help ( void )
{
char * myport ;
2013-08-18 16:29:31 -04:00
xasprintf ( & myport , " %d " , MYSQL_PORT ) ;
2003-08-10 02:53:22 -04:00
2008-11-23 00:38:47 -05:00
print_revision ( progname , NP_VERSION ) ;
2003-08-10 02:53:22 -04:00
printf ( _ ( COPYRIGHT ) , copyright , email ) ;
2009-02-19 19:00:13 -05:00
printf ( " %s \n " , _ ( " This program tests connections to a MySQL server " ) ) ;
2003-08-10 02:53:22 -04:00
2006-06-15 08:52:25 -04:00
printf ( " \n \n " ) ;
2008-04-27 10:35:26 -04:00
2003-08-10 02:53:22 -04:00
print_usage ( ) ;
2010-04-14 06:11:45 -04:00
printf ( UT_HELP_VRSN ) ;
printf ( UT_EXTRA_OPTS ) ;
2003-08-10 02:53:22 -04:00
2010-04-14 06:11:45 -04:00
printf ( UT_HOST_PORT , ' P ' , myport ) ;
2013-09-30 18:47:08 -04:00
printf ( " %s \n " , " -n, --ignore-auth " ) ;
printf ( " %s \n " , _ ( " Ignore authentication failure and check for mysql connectivity only " ) ) ;
2008-04-30 08:50:52 -04:00
printf ( " %s \n " , " -s, --socket=STRING " ) ;
printf ( " %s \n " , _ ( " Use the specified socket (has no effect if -H is used) " ) ) ;
2003-08-10 02:53:22 -04:00
2008-04-30 08:50:52 -04:00
printf ( " %s \n " , " -d, --database=STRING " ) ;
2006-06-15 08:52:25 -04:00
printf ( " %s \n " , _ ( " Check database with indicated name " ) ) ;
2012-12-28 12:40:23 -05:00
printf ( " %s \n " , " -f, --file=STRING " ) ;
printf ( " %s \n " , _ ( " Read from the specified client options file " ) ) ;
printf ( " %s \n " , " -g, --group=STRING " ) ;
printf ( " %s \n " , _ ( " Use a client options group " ) ) ;
2006-06-15 08:52:25 -04:00
printf ( " %s \n " , " -u, --username=STRING " ) ;
printf ( " %s \n " , _ ( " Connect using the indicated username " ) ) ;
printf ( " %s \n " , " -p, --password=STRING " ) ;
printf ( " %s \n " , _ ( " Use the indicated password to authenticate the connection " ) ) ;
2008-04-30 08:50:52 -04:00
printf ( " ==> %s <== \n " , _ ( " IMPORTANT: THIS FORM OF AUTHENTICATION IS NOT SECURE!!! " ) ) ;
printf ( " %s \n " , _ ( " Your clear-text password could be visible as a process table entry " ) ) ;
2006-06-15 08:52:25 -04:00
printf ( " %s \n " , " -S, --check-slave " ) ;
printf ( " %s \n " , _ ( " Check if the slave thread is running properly. " ) ) ;
printf ( " %s \n " , " -w, --warning " ) ;
2008-04-30 08:50:52 -04:00
printf ( " %s \n " , _ ( " Exit with WARNING status if slave server is more than INTEGER seconds " ) ) ;
printf ( " %s \n " , _ ( " behind master " ) ) ;
2006-06-15 08:52:25 -04:00
printf ( " %s \n " , " -c, --critical " ) ;
2008-04-30 08:50:52 -04:00
printf ( " %s \n " , _ ( " Exit with CRITICAL status if slave server is more then INTEGER seconds " ) ) ;
printf ( " %s \n " , _ ( " behind master " ) ) ;
2013-05-22 12:35:17 -04:00
printf ( " %s \n " , " -l, --ssl " ) ;
2023-04-28 10:51:39 -04:00
printf ( " %s \n " , _ ( " Use ssl encryption " ) ) ;
2013-08-17 19:47:32 -04:00
printf ( " %s \n " , " -C, --ca-cert=STRING " ) ;
2013-05-22 12:35:17 -04:00
printf ( " %s \n " , _ ( " Path to CA signing the cert " ) ) ;
2013-08-17 19:47:32 -04:00
printf ( " %s \n " , " -a, --cert=STRING " ) ;
printf ( " %s \n " , _ ( " Path to SSL certificate " ) ) ;
printf ( " %s \n " , " -k, --key=STRING " ) ;
printf ( " %s \n " , _ ( " Path to private SSL key " ) ) ;
printf ( " %s \n " , " -D, --ca-dir=STRING " ) ;
printf ( " %s \n " , _ ( " Path to CA directory " ) ) ;
printf ( " %s \n " , " -L, --ciphers=STRING " ) ;
printf ( " %s \n " , _ ( " List of valid SSL ciphers " ) ) ;
2013-05-22 12:35:17 -04:00
2008-04-27 10:35:26 -04:00
2008-04-30 08:50:52 -04:00
printf ( " \n " ) ;
printf ( " %s \n " , _ ( " There are no required arguments. By default, the local database is checked " ) ) ;
printf ( " %s \n " , _ ( " using the default unix socket. You can force TCP on localhost by using an " ) ) ;
printf ( " %s \n " , _ ( " IP address or FQDN ('localhost' will use the socket as well). " ) ) ;
2003-08-10 02:53:22 -04:00
2008-05-07 06:02:42 -04:00
printf ( " \n " ) ;
printf ( " %s \n " , _ ( " Notes: " ) ) ;
2009-05-20 00:20:11 -04:00
printf ( " %s \n " , _ ( " You must specify -p with an empty string to force an empty password, " ) ) ;
printf ( " %s \n " , _ ( " overriding any my.cnf settings. " ) ) ;
2008-05-07 06:02:42 -04:00
2010-04-14 06:11:45 -04:00
printf ( UT_SUPPORT ) ;
2003-08-10 02:53:22 -04:00
}
void
print_usage ( void )
{
2010-04-22 08:57:14 -04:00
printf ( " %s \n " , _ ( " Usage: " ) ) ;
2008-04-30 08:50:52 -04:00
printf ( " %s [-d database] [-H host] [-P port] [-s socket] \n " , progname ) ;
2013-08-17 19:47:32 -04:00
printf ( " [-u user] [-p password] [-S] [-l] [-a cert] [-k key] \n " ) ;
2013-08-18 16:25:08 -04:00
printf ( " [-C ca-cert] [-D ca-dir] [-L ciphers] [-f optfile] [-g group] \n " ) ;
2003-08-10 02:53:22 -04:00
}