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
*/
# include "includes.h"
2010-08-18 03:46:31 +04:00
# include "lib/tevent/tevent.h"
2007-04-16 08:12:50 +04:00
# include "system/filesys.h"
# include "popt.h"
2010-05-20 09:48:30 +04:00
# include "../include/ctdb_client.h"
2007-04-20 14:07:47 +04:00
# include "../include/ctdb_private.h"
2007-08-24 09:53:41 +04:00
# include "../common/rb_tree.h"
2009-07-01 03:17:13 +04:00
# include <ctype.h>
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 ,
2009-07-01 03:17:13 +04:00
. debuglevel = " ERR " ,
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 :
event_set_default_backend ( arg ) ;
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
*/
struct ctdb_context * ctdb_cmdline_init ( struct event_context * ev )
{
struct ctdb_context * ctdb ;
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 */
if ( isalpha ( ctdb_cmdline . debuglevel [ 0 ] ) | | ctdb_cmdline . debuglevel [ 0 ] = = ' - ' ) {
LogLevel = get_debug_by_desc ( ctdb_cmdline . debuglevel ) ;
} else {
LogLevel = strtol ( ctdb_cmdline . debuglevel , NULL , 0 ) ;
}
2007-08-24 09:53:41 +04:00
/* set up the tree to store server ids */
ctdb - > server_ids = trbt_create ( ctdb , 0 ) ;
2007-04-16 08:12:50 +04:00
return ctdb ;
}
2007-04-20 14:07:47 +04:00
/*
startup a client only ctdb context
*/
2007-04-26 16:27:49 +04:00
struct ctdb_context * ctdb_cmdline_client ( struct event_context * ev )
2007-04-20 14:07:47 +04:00
{
struct ctdb_context * ctdb ;
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
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 */
2007-09-04 04:38:48 +04:00
ctdb - > pnn = ctdb_ctrl_getpnn ( ctdb , timeval_current_ofs ( 3 , 0 ) , 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 ;
}