ctdb: Remove <file> parameter from pfetch usage info
[amitay/samba.git] / ctdb / tools / ctdb.c
index af341951eec3e097b26b82fe094a848e7541d404..b598a866c9bd3ab6c090182608e33310fcffe09d 100644 (file)
 
 #include "common/db_hash.h"
 #include "common/logging.h"
+#include "common/path.h"
 #include "protocol/protocol.h"
 #include "protocol/protocol_api.h"
 #include "protocol/protocol_util.h"
-#include "common/system.h"
+#include "common/system_socket.h"
 #include "client/client.h"
 #include "client/client_sync.h"
 
@@ -50,7 +51,6 @@
 #define SRVID_CTDB_PUSHDB  (CTDB_SRVID_TOOL_RANGE | 0x0002000000000000LL)
 
 static struct {
-       const char *socket;
        const char *debuglevelstr;
        int timelimit;
        int pnn;
@@ -382,8 +382,10 @@ static bool node_map_add(struct ctdb_node_map *nodemap,
        ctdb_sock_addr addr;
        uint32_t num;
        struct ctdb_node_and_flags *n;
+       int ret;
 
-       if (! parse_ip(nstr, NULL, 0, &addr)) {
+       ret = ctdb_sock_addr_from_string(nstr, &addr, false);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", nstr);
                return false;
        }
@@ -476,28 +478,16 @@ static struct ctdb_node_map *ctdb_read_nodes_file(TALLOC_CTX *mem_ctx,
 static struct ctdb_node_map *read_nodes_file(TALLOC_CTX *mem_ctx, uint32_t pnn)
 {
        struct ctdb_node_map *nodemap;
-       char *nodepath;
        const char *nodes_list = NULL;
 
-       if (pnn != CTDB_UNKNOWN_PNN) {
-               nodepath = talloc_asprintf(mem_ctx, "CTDB_NODES_%u", pnn);
-               if (nodepath != NULL) {
-                       nodes_list = getenv(nodepath);
-               }
+       const char *basedir = getenv("CTDB_BASE");
+       if (basedir == NULL) {
+               basedir = CTDB_ETCDIR;
        }
+       nodes_list = talloc_asprintf(mem_ctx, "%s/nodes", basedir);
        if (nodes_list == NULL) {
-               nodes_list = getenv("CTDB_NODES");
-       }
-       if (nodes_list == NULL) {
-               const char *basedir = getenv("CTDB_BASE");
-               if (basedir == NULL) {
-                       basedir = CTDB_ETCDIR;
-               }
-               nodes_list = talloc_asprintf(mem_ctx, "%s/nodes", basedir);
-               if (nodes_list == NULL) {
-                       fprintf(stderr, "Memory allocation error\n");
-                       return NULL;
-               }
+               fprintf(stderr, "Memory allocation error\n");
+               return NULL;
        }
 
        nodemap = ctdb_read_nodes_file(mem_ctx, nodes_list);
@@ -597,7 +587,7 @@ static int h2i(char h)
                return h - 'a' + 10;
        }
        if (h >= 'A' && h <= 'F') {
-               return h - 'f' + 10;
+               return h - 'A' + 10;
        }
        return h - '0';
 }
@@ -1158,9 +1148,11 @@ const struct {
        STATISTICS_FIELD(node.req_message),
        STATISTICS_FIELD(node.req_control),
        STATISTICS_FIELD(node.reply_control),
+       STATISTICS_FIELD(node.req_tunnel),
        STATISTICS_FIELD(client.req_call),
        STATISTICS_FIELD(client.req_message),
        STATISTICS_FIELD(client.req_control),
+       STATISTICS_FIELD(client.req_tunnel),
        STATISTICS_FIELD(timeouts.call),
        STATISTICS_FIELD(timeouts.control),
        STATISTICS_FIELD(timeouts.traverse),
@@ -1714,7 +1706,8 @@ static int control_ipinfo(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                usage("ipinfo");
        }
 
-       if (! parse_ip(argv[0], NULL, 0, &addr)) {
+       ret = ctdb_sock_addr_from_string(argv[0], &addr, false);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", argv[0]);
                return 1;
        }
@@ -2828,15 +2821,29 @@ static int control_unban(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
 
 }
 
+static void wait_for_shutdown(void *private_data)
+{
+       bool *done = (bool *)private_data;
+
+       *done = true;
+}
+
 static int control_shutdown(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                            int argc, const char **argv)
 {
        int ret;
+       bool done = false;
 
        if (argc != 0) {
                usage("shutdown");
        }
 
+       if (ctdb->pnn == ctdb->cmd_pnn) {
+               ctdb_client_set_disconnect_callback(ctdb->client,
+                                                   wait_for_shutdown,
+                                                   &done);
+       }
+
        ret = ctdb_ctrl_shutdown(mem_ctx, ctdb->ev, ctdb->client,
                                 ctdb->cmd_pnn, TIMEOUT());
        if (ret != 0) {
@@ -2844,6 +2851,10 @@ static int control_shutdown(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                return ret;
        }
 
+       if (ctdb->pnn == ctdb->cmd_pnn) {
+               ctdb_client_wait(ctdb->ev, &done);
+       }
+
        return 0;
 }
 
@@ -2984,7 +2995,8 @@ static int control_gratarp(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                usage("gratarp");
        }
 
-       if (! parse_ip(argv[0], NULL, 0, &addr_info.addr)) {
+       ret = ctdb_sock_addr_from_string(argv[0], &addr_info.addr, false);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", argv[0]);
                return 1;
        }
@@ -3014,10 +3026,11 @@ static int control_tickle(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
 
        if (argc == 0) {
                struct ctdb_connection_list *clist;
-               int i, num_failed;
+               int i;
+               unsigned int num_failed;
 
                /* Client first but the src/dst logic is confused */
-               ret = ctdb_connection_list_read(mem_ctx, false, &clist);
+               ret = ctdb_connection_list_read(mem_ctx, 0, false, &clist);
                if (ret != 0) {
                        return ret;
                }
@@ -3044,12 +3057,14 @@ static int control_tickle(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
        }
 
 
-       if (! parse_ip_port(argv[0], &src)) {
+       ret = ctdb_sock_addr_from_string(argv[0], &src, true);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", argv[0]);
                return 1;
        }
 
-       if (! parse_ip_port(argv[1], &dst)) {
+       ret = ctdb_sock_addr_from_string(argv[1], &dst, true);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", argv[1]);
                return 1;
        }
@@ -3079,10 +3094,12 @@ static int control_gettickles(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                port = strtoul(argv[1], NULL, 10);
        }
 
-       if (! parse_ip(argv[0], NULL, port, &addr)) {
+       ret = ctdb_sock_addr_from_string(argv[0], &addr, false);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", argv[0]);
                return 1;
        }
+       ctdb_sock_addr_set_port(&addr, port);
 
        ret = ctdb_ctrl_get_tcp_tickle_list(mem_ctx, ctdb->ev, ctdb->client,
                                            ctdb->cmd_pnn, TIMEOUT(), &addr,
@@ -3231,7 +3248,7 @@ static int control_addtickle(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                struct tevent_req *req;
 
                /* Client first but the src/dst logic is confused */
-               ret = ctdb_connection_list_read(mem_ctx, false, &clist);
+               ret = ctdb_connection_list_read(mem_ctx, 0, false, &clist);
                if (ret != 0) {
                        return ret;
                }
@@ -3259,11 +3276,13 @@ static int control_addtickle(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                return 0;
        }
 
-       if (! parse_ip_port(argv[0], &conn.src)) {
+       ret = ctdb_sock_addr_from_string(argv[0], &conn.src, true);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", argv[0]);
                return 1;
        }
-       if (! parse_ip_port(argv[1], &conn.dst)) {
+       ret = ctdb_sock_addr_from_string(argv[1], &conn.dst, true);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", argv[1]);
                return 1;
        }
@@ -3294,7 +3313,7 @@ static int control_deltickle(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                struct tevent_req *req;
 
                /* Client first but the src/dst logic is confused */
-               ret = ctdb_connection_list_read(mem_ctx, false, &clist);
+               ret = ctdb_connection_list_read(mem_ctx, 0, false, &clist);
                if (ret != 0) {
                        return ret;
                }
@@ -3322,11 +3341,13 @@ static int control_deltickle(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                return 0;
        }
 
-       if (! parse_ip_port(argv[0], &conn.src)) {
+       ret = ctdb_sock_addr_from_string(argv[0], &conn.src, true);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", argv[0]);
                return 1;
        }
-       if (! parse_ip_port(argv[1], &conn.dst)) {
+       ret = ctdb_sock_addr_from_string(argv[1], &conn.dst, true);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", argv[1]);
                return 1;
        }
@@ -3769,7 +3790,8 @@ static int control_moveip(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                usage("moveip");
        }
 
-       if (! parse_ip(argv[0], NULL, 0, &addr)) {
+       ret = ctdb_sock_addr_from_string(argv[0], &addr, false);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", argv[0]);
                return 1;
        }
@@ -3828,7 +3850,8 @@ static int control_addip(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                usage("addip");
        }
 
-       if (! parse_ip_mask(argv[0], argv[1], &addr, &mask)) {
+       ret = ctdb_sock_addr_mask_from_string(argv[0], &addr, &mask);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP/Mask %s\n", argv[0]);
                return 1;
        }
@@ -3893,7 +3916,8 @@ static int control_delip(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                usage("delip");
        }
 
-       if (! parse_ip(argv[0], NULL, 0, &addr)) {
+       ret = ctdb_sock_addr_from_string(argv[0], &addr, false);
+       if (ret != 0) {
                fprintf(stderr, "Invalid IP address %s\n", argv[0]);
                return 1;
        }
@@ -4536,15 +4560,12 @@ static int control_event(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                         int argc, const char **argv)
 {
        char *t, *event_helper = NULL;
-       char *eventd_socket = NULL;
-       const char **new_argv;
-       int i;
 
        t = getenv("CTDB_EVENT_HELPER");
        if (t != NULL) {
                event_helper = talloc_strdup(mem_ctx, t);
        } else {
-               event_helper = talloc_asprintf(mem_ctx, "%s/ctdb_event",
+               event_helper = talloc_asprintf(mem_ctx, "%s/ctdb-event",
                                               CTDB_HELPER_BINDIR);
        }
 
@@ -4553,49 +4574,25 @@ static int control_event(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                return 1;
        }
 
-       t = getenv("CTDB_SOCKET");
-       if (t != NULL) {
-               eventd_socket = talloc_asprintf(mem_ctx, "%s/eventd.sock",
-                                               dirname(t));
-       } else {
-               eventd_socket = talloc_asprintf(mem_ctx, "%s/eventd.sock",
-                                               CTDB_RUNDIR);
-       }
-
-       if (eventd_socket == NULL) {
-               fprintf(stderr, "Unable to set event daemon socket\n");
-               return 1;
-       }
-
-       new_argv = talloc_array(mem_ctx, const char *, argc + 1);
-       if (new_argv == NULL) {
-               fprintf(stderr, "Memory allocation error\n");
-               return 1;
-       }
-
-       new_argv[0] = eventd_socket;
-       for (i=0; i<argc; i++) {
-               new_argv[i+1] = argv[i];
-       }
-
        return run_helper(mem_ctx, "event daemon helper", event_helper,
-                         argc+1, new_argv);
+                         argcargv);
 }
 
 static int control_scriptstatus(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                                int argc, const char **argv)
 {
-       const char *new_argv[3];
+       const char *new_argv[4];
 
        if (argc > 1) {
                usage("scriptstatus");
        }
 
        new_argv[0] = "status";
-       new_argv[1] = (argc == 0) ? "monitor" : argv[0];
-       new_argv[2] = NULL;
+       new_argv[1] = "legacy";
+       new_argv[2] = (argc == 0) ? "monitor" : argv[0];
+       new_argv[3] = NULL;
 
-       (void) control_event(mem_ctx, ctdb, 2, new_argv);
+       (void) control_event(mem_ctx, ctdb, 3, new_argv);
        return 0;
 }
 
@@ -4807,7 +4804,7 @@ static int control_pfetch(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
        TDB_DATA key, data;
        int ret;
 
-       if (argc < 2 || argc > 3) {
+       if (argc != 2) {
                usage("pfetch");
        }
 
@@ -5572,7 +5569,6 @@ const struct {
        DBSTATISTICS_FIELD(locks.num_current),
        DBSTATISTICS_FIELD(locks.num_pending),
        DBSTATISTICS_FIELD(locks.num_failed),
-       DBSTATISTICS_FIELD(db_ro_delegations),
 };
 
 static void print_dbstatistics(const char *db_name,
@@ -5837,32 +5833,6 @@ static int control_reloadips(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
        return ipreallocate(mem_ctx, ctdb);
 }
 
-static int control_ipiface(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
-                          int argc, const char **argv)
-{
-       ctdb_sock_addr addr;
-       char *iface;
-
-       if (argc != 1) {
-               usage("ipiface");
-       }
-
-       if (! parse_ip(argv[0], NULL, 0, &addr)) {
-               fprintf(stderr, "Failed to Parse IP %s\n", argv[0]);
-               return 1;
-       }
-
-       iface = ctdb_sys_find_ifname(&addr);
-       if (iface == NULL) {
-               fprintf(stderr, "Failed to find interface for IP %s\n",
-                       argv[0]);
-               return 1;
-       }
-       free(iface);
-
-       return 0;
-}
-
 
 static const struct ctdb_cmd {
        const char *name;
@@ -5879,7 +5849,7 @@ static const struct ctdb_cmd {
        { "uptime", control_uptime, false, true,
                "show node uptime", NULL },
        { "ping", control_ping, false, true,
-               "ping all nodes", NULL },
+               "ping a node", NULL },
        { "runstate", control_runstate, false, true,
                "get/check runstate of a node",
                "[setup|first_recovery|startup|running]" },
@@ -6003,7 +5973,7 @@ static const struct ctdb_cmd {
        { "setdbsticky", control_setdbsticky, false, true,
                "enable sticky records", "<dbname|dbid>"},
        { "pfetch", control_pfetch, false, false,
-               "fetch record from persistent database", "<dbname|dbid> <key> [<file>]" },
+               "fetch record from persistent database", "<dbname|dbid> <key>" },
        { "pstore", control_pstore, false, false,
                "write record to persistent database", "<dbname|dbid> <key> <value>" },
        { "pdelete", control_pdelete, false, false,
@@ -6030,8 +6000,6 @@ static const struct ctdb_cmd {
                "show database statistics", "<dbname|dbid>" },
        { "reloadips", control_reloadips, false, false,
                "reload the public addresses file", "[all|<pnn-list>]" },
-       { "ipiface", control_ipiface, true, false,
-               "Find the interface an ip address is hosted on", "<ip>" },
 };
 
 static const struct ctdb_cmd *match_command(const char *command)
@@ -6092,8 +6060,6 @@ static void usage(const char *command)
 
 struct poptOption cmdline_options[] = {
        POPT_AUTOHELP
-       { "socket", 's', POPT_ARG_STRING, &options.socket, 0,
-               "CTDB socket path", "filename" },
        { "debug", 'd', POPT_ARG_STRING, &options.debuglevelstr, 0,
                "debug level"},
        { "timelimit", 't', POPT_ARG_INT, &options.timelimit, 0,
@@ -6118,6 +6084,7 @@ static int process_command(const struct ctdb_cmd *cmd, int argc,
 {
        TALLOC_CTX *tmp_ctx;
        struct ctdb_context *ctdb;
+       const char *ctdb_socket;
        int ret;
        bool status;
        uint64_t srvid_offset;
@@ -6153,10 +6120,16 @@ static int process_command(const struct ctdb_cmd *cmd, int argc,
                goto fail;
        }
 
-       ret = ctdb_client_init(ctdb, ctdb->ev, options.socket, &ctdb->client);
+       ctdb_socket = path_socket(ctdb, "ctdbd");
+       if (ctdb_socket == NULL) {
+               fprintf(stderr, "Memory allocation error\n");
+               goto fail;
+       }
+
+       ret = ctdb_client_init(ctdb, ctdb->ev, ctdb_socket, &ctdb->client);
        if (ret != 0) {
                fprintf(stderr, "Failed to connect to CTDB daemon (%s)\n",
-                       options.socket);
+                       ctdb_socket);
 
                if (!find_node_xpnn(ctdb, NULL)) {
                        fprintf(stderr, "Is this node part of CTDB cluster?\n");
@@ -6214,25 +6187,19 @@ int main(int argc, const char *argv[])
        const char **extra_argv;
        int extra_argc;
        const struct ctdb_cmd *cmd;
-       const char *ctdb_socket;
        int loglevel;
+       bool ok;
        int ret;
 
        setlinebuf(stdout);
 
        /* Set default options */
-       options.socket = CTDB_SOCKET;
        options.debuglevelstr = NULL;
        options.timelimit = 10;
        options.sep = "|";
        options.maxruntime = 0;
        options.pnn = -1;
 
-       ctdb_socket = getenv("CTDB_SOCKET");
-       if (ctdb_socket != NULL) {
-               options.socket = ctdb_socket;
-       }
-
        pc = poptGetContext(argv[0], argc, argv, cmdline_options,
                            POPT_CONTEXT_KEEP_FIRST);
        while ((opt = poptGetNextOpt(pc)) != -1) {
@@ -6280,11 +6247,11 @@ int main(int argc, const char *argv[])
 
        /* Enable logging */
        setup_logging("ctdb", DEBUG_STDERR);
-       if (debug_level_parse(options.debuglevelstr, &loglevel)) {
-               DEBUGLEVEL = loglevel;
-       } else {
-               DEBUGLEVEL = DEBUG_ERR;
+       ok = debug_level_parse(options.debuglevelstr, &loglevel);
+       if (!ok) {
+               loglevel = DEBUG_ERR;
        }
+       debuglevel_set(loglevel);
 
        signal(SIGALRM, alarm_handler);
        alarm(options.maxruntime);