tools/ctdb: display interfaces in "ctdb ip" and "ctdb ip -Y" outputs
authorStefan Metzmacher <metze@samba.org>
Sat, 16 Jan 2010 09:36:35 +0000 (10:36 +0100)
committerStefan Metzmacher <metze@samba.org>
Wed, 20 Jan 2010 10:11:00 +0000 (11:11 +0100)
metze

tests/simple/11_ctdb_ip.sh
tools/ctdb.c

index 6ea1f956c31aaf7f92656bc0b062fed43520bd39..59c5d52eac40f956260481ee9b247f11eaaf40eb 100755 (executable)
@@ -34,13 +34,18 @@ cluster_is_healthy
 echo "Getting list of public IPs..."
 try_command_on_node -v 1 $CTDB ip -n all
 ips=$(echo "$out" | sed \
-       -e '1d')
-machineout1=":Public IP:Node:"
+       -e '1d' \
+       -e 's@ node\[@ @' \
+       -e 's@\].*$@:@')
+machineout1=":Public IP:Node:ActiveInterface:AvailableInterfaces:ConfiguredInterfaces:"
 machineout2=$(echo "$out" | sed \
        -e '1d' \
        -e 's@^@:@' \
-       -e 's@ @:@' \
-       -e 's@$@:@')
+       -e 's@ node\[@:@' \
+       -e 's@\] active\[@:@' \
+       -e 's@\] available\[@:@' \
+       -e 's@\] configured\[@:@' \
+       -e 's@\]$@:@')
 machineout=`echo -e "$machineout1\n$machineout2"`
 
 while read ip pnn ; do
index 5c49dbaa77790eea9f6861c7f28fdef805aad392..0aac3946e8596e451345a48099146ef1d2619f00 100644 (file)
@@ -1658,7 +1658,7 @@ static int control_ip(struct ctdb_context *ctdb, int argc, const char **argv)
        }
 
        if (options.machinereadable){
-               printf(":Public IP:Node:\n");
+               printf(":Public IP:Node:ActiveInterface:AvailableInterfaces:ConfiguredInterfaces:\n");
        } else {
                if (options.pnn == CTDB_BROADCAST_ALL) {
                        printf("Public IPs on ALL nodes\n");
@@ -1668,11 +1668,71 @@ static int control_ip(struct ctdb_context *ctdb, int argc, const char **argv)
        }
 
        for (i=1;i<=ips->num;i++) {
+               struct ctdb_control_public_ip_info *info = NULL;
+               int32_t pnn;
+               char *aciface = NULL;
+               char *avifaces = NULL;
+               char *cifaces = NULL;
+
+               if (options.pnn == CTDB_BROADCAST_ALL) {
+                       pnn = ips->ips[ips->num-i].pnn;
+               } else {
+                       pnn = options.pnn;
+               }
+
+               if (pnn != -1) {
+                       ret = ctdb_ctrl_get_public_ip_info(ctdb, TIMELIMIT(), pnn, ctdb,
+                                                  &ips->ips[ips->num-i].addr, &info);
+               } else {
+                       ret = -1;
+               }
+
+               if (ret == 0) {
+                       int j;
+                       for (j=0; j < info->num; j++) {
+                               if (cifaces == NULL) {
+                                       cifaces = talloc_strdup(info,
+                                                               info->ifaces[j].name);
+                               } else {
+                                       cifaces = talloc_asprintf_append(cifaces,
+                                                                        ",%s",
+                                                                        info->ifaces[j].name);
+                               }
+
+                               if (info->active_idx == j) {
+                                       aciface = info->ifaces[j].name;
+                               }
+
+                               if (info->ifaces[j].link_state == 0) {
+                                       continue;
+                               }
+
+                               if (avifaces == NULL) {
+                                       avifaces = talloc_strdup(info, info->ifaces[j].name);
+                               } else {
+                                       avifaces = talloc_asprintf_append(avifaces,
+                                                                         ",%s",
+                                                                         info->ifaces[j].name);
+                               }
+                       }
+               }
+
                if (options.machinereadable){
-                       printf(":%s:%d:\n", ctdb_addr_to_str(&ips->ips[ips->num-i].addr), ips->ips[ips->num-i].pnn);
+                       printf(":%s:%d:%s:%s:%s:\n",
+                              ctdb_addr_to_str(&ips->ips[ips->num-i].addr),
+                              ips->ips[ips->num-i].pnn,
+                              aciface?aciface:"",
+                              avifaces?avifaces:"",
+                              cifaces?cifaces:"");
                } else {
-                       printf("%s %d\n", ctdb_addr_to_str(&ips->ips[ips->num-i].addr), ips->ips[ips->num-i].pnn);
+                       printf("%s node[%d] active[%s] available[%s] configured[%s]\n",
+                              ctdb_addr_to_str(&ips->ips[ips->num-i].addr),
+                              ips->ips[ips->num-i].pnn,
+                              aciface?aciface:"",
+                              avifaces?avifaces:"",
+                              cifaces?cifaces:"");
                }
+               talloc_free(info);
        }
 
        talloc_free(tmp_ctx);