]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
add a control that lists all public ip addresses and which node that
authorRonnie Sahlberg <sahlberg@ronnie>
Mon, 4 Jun 2007 11:11:51 +0000 (21:11 +1000)
committerRonnie Sahlberg <sahlberg@ronnie>
Mon, 4 Jun 2007 11:11:51 +0000 (21:11 +1000)
currently serves it

(This used to be ctdb commit db9b89dc423b31079e5502323e5fd2bbaf82e1e9)

ctdb/common/ctdb_client.c
ctdb/common/ctdb_control.c
ctdb/include/ctdb_private.h
ctdb/takeover/ctdb_takeover.c
ctdb/tools/ctdb_control.c

index 61d5f2ee22d231e10833f9a669086e4e6fbe9ec4..eed404341486eae455dc7140d564031c4dc43691 100644 (file)
@@ -1920,3 +1920,27 @@ int ctdb_ctrl_list_tunables(struct ctdb_context *ctdb,
 
        return 0;
 }
+
+
+int ctdb_ctrl_get_public_ips(struct ctdb_context *ctdb, 
+                       struct timeval timeout, uint32_t destnode, 
+                       TALLOC_CTX *mem_ctx, struct ctdb_all_public_ips **ips)
+{
+       int ret;
+       TDB_DATA outdata;
+       int32_t res;
+
+       ret = ctdb_control(ctdb, destnode, 0, 
+                          CTDB_CONTROL_GET_PUBLIC_IPS, 0, tdb_null, 
+                          mem_ctx, &outdata, &res, &timeout, NULL);
+       if (ret != 0 || res != 0) {
+               DEBUG(0,(__location__ " ctdb_control for getpublicips failed\n"));
+               return -1;
+       }
+
+       *ips = (struct ctdb_all_public_ips *)talloc_memdup(mem_ctx, outdata.dptr, outdata.dsize);
+       talloc_free(outdata.dptr);
+                   
+       return 0;
+}
+
index 1f0ac933d6a328d854ad53a261e22610c14909b0..14ea6732fefd52a6089933e69320db1225ced3d3 100644 (file)
@@ -259,6 +259,10 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
                CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_public_ip));
                return ctdb_control_release_ip(ctdb, c, indata, async_reply);
 
+       case CTDB_CONTROL_GET_PUBLIC_IPS:
+               CHECK_CONTROL_DATA_SIZE(0);
+               return ctdb_control_get_public_ips(ctdb, c, outdata);
+
        case CTDB_CONTROL_DELETE_LOW_RSN: 
                CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_control_delete_low_rsn));
                return ctdb_control_delete_low_rsn(ctdb, indata, outdata);
index a2c8a94c99ec107640518d1ad31b8ab4b01719ff..1c6e19f982155abfa01e79ceb7be75c419a3b73e 100644 (file)
@@ -403,6 +403,7 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS          = 0,
                    CTDB_CONTROL_SET_TUNABLE             = 48,
                    CTDB_CONTROL_GET_TUNABLE             = 49,
                    CTDB_CONTROL_LIST_TUNABLES           = 50,
+                   CTDB_CONTROL_GET_PUBLIC_IPS          = 51,
 };
 
 /*
@@ -940,6 +941,16 @@ int ctdb_ctrl_takeover_ip(struct ctdb_context *ctdb, struct timeval timeout,
 int ctdb_ctrl_release_ip(struct ctdb_context *ctdb, struct timeval timeout, 
                         uint32_t destnode, struct ctdb_public_ip *ip);
 
+struct ctdb_all_public_ips {
+       uint32_t num;
+       struct ctdb_public_ip ips[1];
+};
+int32_t ctdb_control_get_public_ips(struct ctdb_context *ctdb, struct ctdb_req_control *c, TDB_DATA *outdata);
+int ctdb_ctrl_get_public_ips(struct ctdb_context *ctdb, 
+                       struct timeval timeout, uint32_t destnode, 
+                       TALLOC_CTX *mem_ctx, struct ctdb_all_public_ips **ips);
+
+
 /* from takeover/system.c */
 int ctdb_sys_send_arp(const struct sockaddr_in *saddr, const char *iface);
 bool ctdb_sys_have_ip(const char *ip);
index d4c51dcd5e0e92bf78877fa8809061cd5864b915..27f40eee1487036e5b9dffefecb333a8e9d27f78 100644 (file)
@@ -695,3 +695,34 @@ void ctdb_release_all_ips(struct ctdb_context *ctdb)
                }
        }
 }
+
+
+/*
+  
+ */
+int32_t ctdb_control_get_public_ips(struct ctdb_context *ctdb, struct ctdb_req_control *c, TDB_DATA *outdata)
+{
+       int i, len;
+       struct ctdb_all_public_ips *ips;
+
+       len = offsetof(struct ctdb_all_public_ips, ips) + ctdb->num_nodes*sizeof(struct ctdb_public_ip);
+
+       ips = talloc_size(outdata, len);
+       CTDB_NO_MEMORY(ctdb, ips);
+
+       outdata->dsize = len;
+       outdata->dptr  = (uint8_t *)ips;
+
+       ips->num = ctdb->num_nodes;
+       for(i=0;i<ctdb->num_nodes;i++){
+               ips->ips[i].vnn = i;
+               ips->ips[i].takeover_vnn = ctdb->nodes[i]->takeover_vnn;
+#ifdef HAVE_SOCK_SIN_LEN
+               ips->ips[i].sin.sin_len = sizeof(struct sockaddr_in);
+#endif
+               ips->ips[i].sin.sin_family = AF_INET;
+               inet_aton(ctdb->nodes[i]->public_address, &ips->ips[i].sin.sin_addr);
+       }
+
+       return 0;
+}
index e95ff3ea4dd8a30bd2c328bfca13ed3274c20d5d..800f707927c478b96deb434dc2d80b0b5ceaf3f9 100644 (file)
@@ -331,6 +331,33 @@ static int control_status(struct ctdb_context *ctdb, int argc, const char **argv
        return 0;
 }
 
+/*
+  display public ip status
+ */
+static int control_ip(struct ctdb_context *ctdb, int argc, const char **argv)
+{
+       int i, ret;
+       struct ctdb_all_public_ips *ips;
+       uint32_t myvnn;
+
+       myvnn = ctdb_ctrl_getvnn(ctdb, TIMELIMIT(), options.vnn);
+
+       ret = ctdb_ctrl_get_public_ips(ctdb, TIMELIMIT(), options.vnn, ctdb, &ips);
+       if (ret != 0) {
+               printf("Unable to get public ips from node %u\n", options.vnn);
+               return ret;
+       }
+
+       printf("Number of nodes:%d\n", ips->num);
+       for(i=0;i<ips->num;i++){
+               printf("%-16s %d\n",
+                       inet_ntoa(ips->ips[i].sin.sin_addr),
+                       ips->ips[i].takeover_vnn);
+       }
+
+       return 0;
+}
+
 /*
   display pid of a ctdb daemon
  */
@@ -779,6 +806,7 @@ static const struct {
        { "listvars",        control_listvars,          "list tunable variables"},
        { "statistics",      control_statistics,        "show statistics" },
        { "statisticsreset", control_statistics_reset,  "reset statistics"},
+       { "ip",              control_ip,                "show which public ip's that ctdb manages" },
        { "process-exists",  control_process_exists,    "check if a process exists on a node",  "<pid>"},
        { "getdbmap",        control_getdbmap,          "show the database map" },
        { "catdb",           control_catdb,             "dump a database" ,                     "<dbname>"},