new version 1.3.2
[sahlberg/ctdb.git] / common / cmdline.c
index 07a19cedc57c7501a09c72e1cb382e87e5eaf5c4..145a13a81b7be3b2b97dc3b2d2e5fa8e02793650 100644 (file)
@@ -3,51 +3,63 @@
 
    Copyright (C) Andrew Tridgell  2007
 
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2 of the License, or (at your option) any later version.
-
-   This library is distributed in the hope that it will be useful,
+   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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+   
+   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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+   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
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
-#include "lib/events/events.h"
+#include "lib/tevent/tevent.h"
 #include "system/filesys.h"
 #include "popt.h"
+#include "../include/ctdb_client.h"
+#include "../include/ctdb_private.h"
+#include "../common/rb_tree.h"
+#include <ctype.h>
 
 /* Handle common command line options for ctdb test progs
  */
 
 static struct {
-       const char *nlist;
-       const char *transport;
-       const char *myaddress;
-       int self_connect;
-       const char *db_dir;
+       const char *socketname;
+       const char *debuglevel;
+       int torture;
+       const char *events;
 } ctdb_cmdline = {
-       .nlist = NULL,
-       .transport = "tcp",
-       .myaddress = NULL,
-       .self_connect = 0,
-       .db_dir = NULL
+       .torture = 0,
+       .debuglevel = "ERR",
 };
 
+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;
+       }
+}
+
 
 struct poptOption popt_ctdb_cmdline[] = {
-       { "nlist", 0, POPT_ARG_STRING, &ctdb_cmdline.nlist, 0, "node list file", "filename" },
-       { "listen", 0, POPT_ARG_STRING, &ctdb_cmdline.myaddress, 0, "address to listen on", "address" },
-       { "transport", 0, POPT_ARG_STRING, &ctdb_cmdline.transport, 0, "protocol transport", NULL },
-       { "self-connect", 0, POPT_ARG_NONE, &ctdb_cmdline.self_connect, 0, "enable self connect", "boolean" },
-       { "debug", 'd', POPT_ARG_INT, &LogLevel, 0, "debug level"},
-       { "dbdir", 0, POPT_ARG_STRING, &ctdb_cmdline.db_dir, 0, "directory for the tdb files", NULL },
+       { NULL, 0, POPT_ARG_CALLBACK, (void *)ctdb_cmdline_callback },  
+       { "socket", 0, POPT_ARG_STRING, &ctdb_cmdline.socketname, 0, "local socket name", "filename" },
+       { "debug", 'd', POPT_ARG_STRING, &ctdb_cmdline.debuglevel, 0, "debug level"},
+       { "torture", 0, POPT_ARG_NONE, &ctdb_cmdline.torture, 0, "enable nastiness in library", NULL },
+       { "events", 0, POPT_ARG_STRING, NULL, OPT_EVENTSYSTEM, "event system", NULL },
        { NULL }
 };
 
@@ -60,11 +72,6 @@ struct ctdb_context *ctdb_cmdline_init(struct event_context *ev)
        struct ctdb_context *ctdb;
        int ret;
 
-       if (ctdb_cmdline.nlist == NULL || ctdb_cmdline.myaddress == NULL) {
-               printf("You must provide a node list with --nlist and an address with --listen\n");
-               exit(1);
-       }
-
        /* initialise ctdb */
        ctdb = ctdb_init(ev);
        if (ctdb == NULL) {
@@ -72,34 +79,84 @@ struct ctdb_context *ctdb_cmdline_init(struct event_context *ev)
                exit(1);
        }
 
-       if (ctdb_cmdline.self_connect) {
-               ctdb_set_flags(ctdb, CTDB_FLAG_SELF_CONNECT);
+       if (ctdb_cmdline.torture) {
+               ctdb_set_flags(ctdb, CTDB_FLAG_TORTURE);
        }
 
-       ret = ctdb_set_transport(ctdb, ctdb_cmdline.transport);
-       if (ret == -1) {
-               printf("ctdb_set_transport failed - %s\n", ctdb_errstr(ctdb));
-               exit(1);
+       /* command line specified a socket name */
+       if (ctdb_cmdline.socketname != NULL) {
+               setenv("CTDB_SOCKET", ctdb_cmdline.socketname, 1);
+               ret = ctdb_set_socketname(ctdb, ctdb_cmdline.socketname);
+               if (ret == -1) {
+                       printf("ctdb_set_socketname failed - %s\n",
+                                                   ctdb_errstr(ctdb));
+                       exit(1);
+               }
        }
 
-       /* tell ctdb what address to listen on */
-       ret = ctdb_set_address(ctdb, ctdb_cmdline.myaddress);
-       if (ret == -1) {
-               printf("ctdb_set_address failed - %s\n", ctdb_errstr(ctdb));
-               exit(1);
+       /* 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);
        }
 
-       /* tell ctdb what nodes are available */
-       ret = ctdb_set_nlist(ctdb, ctdb_cmdline.nlist);
-       if (ret == -1) {
-               printf("ctdb_set_nlist failed - %s\n", ctdb_errstr(ctdb));
+       /* set up the tree to store server ids */
+       ctdb->server_ids = trbt_create(ctdb, 0);
+
+       return ctdb;
+}
+
+
+/*
+  startup a client only ctdb context
+ */
+struct ctdb_context *ctdb_cmdline_client(struct event_context *ev)
+{
+       struct ctdb_context *ctdb;
+       char *socket_name;
+       int ret;
+
+       /* initialise ctdb */
+       ctdb = ctdb_init(ev);
+       if (ctdb == NULL) {
+               fprintf(stderr, "Failed to init ctdb\n");
                exit(1);
        }
 
-       ret = ctdb_set_tdb_dir(ctdb, ctdb_cmdline.db_dir);
-       if (ret == -1) {
-               printf("ctdb_set_tdb_dir failed - %s\n", ctdb_errstr(ctdb));
-               exit(1);
+       /* tell ctdb the socket address */
+       socket_name = getenv("CTDB_SOCKET");
+       if (socket_name != NULL) {
+               ret = ctdb_set_socketname(ctdb, socket_name);
+               if (ret == -1) {
+                       printf("ctdb_set_socketname failed - %s\n",
+                                                   ctdb_errstr(ctdb));
+                       exit(1);
+               }
+       }
+
+       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);
+               }
+       }
+
+       ret = ctdb_socket_connect(ctdb);
+       if (ret != 0) {
+               fprintf(stderr, __location__ " Failed to connect to daemon\n");
+               talloc_free(ctdb);
+               return NULL;
+       }
+
+       /* get our pnn */
+       ctdb->pnn = ctdb_ctrl_getpnn(ctdb, timeval_current_ofs(3, 0), CTDB_CURRENT_NODE);
+       if (ctdb->pnn == (uint32_t)-1) {
+               DEBUG(DEBUG_CRIT,(__location__ " Failed to get ctdb pnn\n"));
+               talloc_free(ctdb);
+               return NULL;
        }
 
        return ctdb;