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;
+}
+
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);
CTDB_CONTROL_SET_TUNABLE = 48,
CTDB_CONTROL_GET_TUNABLE = 49,
CTDB_CONTROL_LIST_TUNABLES = 50,
+ CTDB_CONTROL_GET_PUBLIC_IPS = 51,
};
/*
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);
}
}
}
+
+
+/*
+
+ */
+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;
+}
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
*/
{ "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>"},