2007-04-16 08:12:50 +04:00
/*
common commandline code to ctdb test tools
Copyright ( C ) Andrew Tridgell 2007
2007-05-31 07:50:53 +04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-10 09:29:31 +04:00
the Free Software Foundation ; either version 3 of the License , or
2007-05-31 07:50:53 +04:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
2007-04-16 08:12:50 +04:00
but WITHOUT ANY WARRANTY ; without even the implied warranty of
2007-05-31 07:50:53 +04:00
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 09:29:31 +04:00
along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2007-04-16 08:12:50 +04:00
*/
2015-10-26 08:50:46 +03:00
# include "replace.h"
2007-04-16 08:12:50 +04:00
# include "system/filesys.h"
2015-10-26 08:50:46 +03:00
# include "system/network.h"
# include <popt.h>
# include <talloc.h>
# include <tevent.h>
2009-07-01 03:17:13 +04:00
# include <ctype.h>
2007-04-16 08:12:50 +04:00
2015-10-26 08:50:46 +03:00
# include "lib/util/debug.h"
# include "ctdb_private.h"
# include "ctdb_client.h"
# include "common/rb_tree.h"
2015-10-23 06:17:34 +03:00
# include "common/common.h"
2015-11-11 07:19:41 +03:00
# include "common/logging.h"
2015-10-13 07:19:59 +03:00
# include "common/cmdline.h"
2014-09-04 07:33:58 +04:00
2015-10-26 08:50:46 +03:00
2007-04-16 08:12:50 +04:00
/* Handle common command line options for ctdb test progs
*/
static struct {
2007-04-26 16:27:49 +04:00
const char * socketname ;
2009-07-01 03:17:13 +04:00
const char * debuglevel ;
2007-04-19 10:27:56 +04:00
int torture ;
2007-05-05 11:18:43 +04:00
const char * events ;
2007-04-16 08:12:50 +04:00
} ctdb_cmdline = {
2007-04-30 00:42:23 +04:00
. torture = 0 ,
2015-02-09 04:04:41 +03:00
. debuglevel = " NOTICE " ,
2007-04-16 08:12:50 +04:00
} ;
2007-05-05 11:18:43 +04:00
enum { OPT_EVENTSYSTEM = 1 } ;
static void ctdb_cmdline_callback ( poptContext con ,
enum poptCallbackReason reason ,
const struct poptOption * opt ,
const char * arg , const void * data )
{
switch ( opt - > val ) {
case OPT_EVENTSYSTEM :
2015-10-26 08:50:09 +03:00
tevent_set_default_backend ( arg ) ;
2007-05-05 11:18:43 +04:00
break ;
}
}
2007-04-16 08:12:50 +04:00
struct poptOption popt_ctdb_cmdline [ ] = {
2007-05-05 11:18:43 +04:00
{ NULL , 0 , POPT_ARG_CALLBACK , ( void * ) ctdb_cmdline_callback } ,
2007-04-26 16:27:49 +04:00
{ " socket " , 0 , POPT_ARG_STRING , & ctdb_cmdline . socketname , 0 , " local socket name " , " filename " } ,
2009-07-01 03:17:13 +04:00
{ " debug " , ' d ' , POPT_ARG_STRING , & ctdb_cmdline . debuglevel , 0 , " debug level " } ,
2007-04-19 10:27:56 +04:00
{ " torture " , 0 , POPT_ARG_NONE , & ctdb_cmdline . torture , 0 , " enable nastiness in library " , NULL } ,
2007-05-05 11:18:43 +04:00
{ " events " , 0 , POPT_ARG_STRING , NULL , OPT_EVENTSYSTEM , " event system " , NULL } ,
2007-04-16 08:12:50 +04:00
{ NULL }
} ;
/*
startup daemon side of ctdb according to command line options
*/
2015-10-26 08:50:09 +03:00
struct ctdb_context * ctdb_cmdline_init ( struct tevent_context * ev )
2007-04-16 08:12:50 +04:00
{
struct ctdb_context * ctdb ;
2015-11-11 07:19:41 +03:00
enum debug_level log_level ;
2007-05-10 01:55:46 +04:00
int ret ;
2007-04-16 08:12:50 +04:00
/* initialise ctdb */
ctdb = ctdb_init ( ev ) ;
if ( ctdb = = NULL ) {
printf ( " Failed to init ctdb \n " ) ;
exit ( 1 ) ;
}
2007-04-19 10:27:56 +04:00
if ( ctdb_cmdline . torture ) {
ctdb_set_flags ( ctdb , CTDB_FLAG_TORTURE ) ;
}
2007-04-16 08:12:50 +04:00
2008-11-11 06:49:30 +03:00
/* command line specified a socket name */
if ( ctdb_cmdline . socketname ! = NULL ) {
2008-12-08 09:29:17 +03:00
setenv ( " CTDB_SOCKET " , ctdb_cmdline . socketname , 1 ) ;
2008-11-11 06:49:30 +03:00
ret = ctdb_set_socketname ( ctdb , ctdb_cmdline . socketname ) ;
if ( ret = = - 1 ) {
printf ( " ctdb_set_socketname failed - %s \n " ,
ctdb_errstr ( ctdb ) ) ;
exit ( 1 ) ;
}
2007-04-26 16:27:49 +04:00
}
2009-07-01 03:17:13 +04:00
/* Set the debug level */
2015-11-11 07:19:41 +03:00
if ( debug_level_parse ( ctdb_cmdline . debuglevel , & log_level ) ) {
DEBUGLEVEL = debug_level_to_int ( log_level ) ;
} else {
DEBUGLEVEL = debug_level_to_int ( DEBUG_NOTICE ) ;
2009-07-01 03:17:13 +04:00
}
2007-04-16 08:12:50 +04:00
return ctdb ;
}
2007-04-20 14:07:47 +04:00
/*
startup a client only ctdb context
*/
2011-08-08 16:09:46 +04:00
struct ctdb_context * ctdb_cmdline_client ( struct tevent_context * ev ,
struct timeval req_timeout )
2007-04-20 14:07:47 +04:00
{
struct ctdb_context * ctdb ;
2015-11-11 07:19:41 +03:00
enum debug_level log_level ;
2008-11-11 06:49:30 +03:00
char * socket_name ;
2007-04-20 14:07:47 +04:00
int ret ;
/* initialise ctdb */
ctdb = ctdb_init ( ev ) ;
if ( ctdb = = NULL ) {
2007-08-07 06:51:25 +04:00
fprintf ( stderr , " Failed to init ctdb \n " ) ;
2007-04-20 14:07:47 +04:00
exit ( 1 ) ;
}
2007-04-26 16:27:49 +04:00
/* tell ctdb the socket address */
2008-11-11 06:49:30 +03:00
socket_name = getenv ( " CTDB_SOCKET " ) ;
if ( socket_name ! = NULL ) {
2009-05-20 14:08:13 +04:00
ret = ctdb_set_socketname ( ctdb , socket_name ) ;
if ( ret = = - 1 ) {
printf ( " ctdb_set_socketname failed - %s \n " ,
ctdb_errstr ( ctdb ) ) ;
exit ( 1 ) ;
}
2008-11-11 06:49:30 +03:00
}
if ( ctdb_cmdline . socketname ! = NULL ) {
ret = ctdb_set_socketname ( ctdb , ctdb_cmdline . socketname ) ;
if ( ret = = - 1 ) {
fprintf ( stderr , " ctdb_set_socketname failed - %s \n " ,
ctdb_errstr ( ctdb ) ) ;
exit ( 1 ) ;
}
2007-04-26 16:27:49 +04:00
}
2007-04-20 14:07:47 +04:00
2013-08-30 17:38:15 +04:00
/* Set the debug level */
2015-11-11 07:19:41 +03:00
if ( debug_level_parse ( ctdb_cmdline . debuglevel , & log_level ) ) {
DEBUGLEVEL = debug_level_to_int ( log_level ) ;
} else {
DEBUGLEVEL = debug_level_to_int ( DEBUG_NOTICE ) ;
2013-08-30 17:38:15 +04:00
}
2007-04-20 14:07:47 +04:00
ret = ctdb_socket_connect ( ctdb ) ;
if ( ret ! = 0 ) {
2007-08-07 06:51:25 +04:00
fprintf ( stderr , __location__ " Failed to connect to daemon \n " ) ;
2007-04-20 14:07:47 +04:00
talloc_free ( ctdb ) ;
return NULL ;
}
2007-09-04 04:06:36 +04:00
/* get our pnn */
2011-08-08 16:09:46 +04:00
ctdb - > pnn = ctdb_ctrl_getpnn ( ctdb , req_timeout , CTDB_CURRENT_NODE ) ;
2007-09-04 04:06:36 +04:00
if ( ctdb - > pnn = = ( uint32_t ) - 1 ) {
2008-02-04 12:07:15 +03:00
DEBUG ( DEBUG_CRIT , ( __location__ " Failed to get ctdb pnn \n " ) ) ;
2007-04-26 21:27:07 +04:00
talloc_free ( ctdb ) ;
return NULL ;
}
2007-04-20 14:07:47 +04:00
return ctdb ;
}