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