From: Ronnie Sahlberg Date: Mon, 4 Jun 2007 11:11:51 +0000 (+1000) Subject: add a control that lists all public ip addresses and which node that X-Git-Tag: tevent-0.9.20~348^2~2571^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4be9a44ba770701c34bbc26c5f5eee1dd359cab5;p=thirdparty%2Fsamba.git add a control that lists all public ip addresses and which node that currently serves it (This used to be ctdb commit db9b89dc423b31079e5502323e5fd2bbaf82e1e9) --- diff --git a/ctdb/common/ctdb_client.c b/ctdb/common/ctdb_client.c index 61d5f2ee22d..eed40434148 100644 --- a/ctdb/common/ctdb_client.c +++ b/ctdb/common/ctdb_client.c @@ -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; +} + diff --git a/ctdb/common/ctdb_control.c b/ctdb/common/ctdb_control.c index 1f0ac933d6a..14ea6732fef 100644 --- a/ctdb/common/ctdb_control.c +++ b/ctdb/common/ctdb_control.c @@ -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); diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index a2c8a94c99e..1c6e19f9821 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -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); diff --git a/ctdb/takeover/ctdb_takeover.c b/ctdb/takeover/ctdb_takeover.c index d4c51dcd5e0..27f40eee148 100644 --- a/ctdb/takeover/ctdb_takeover.c +++ b/ctdb/takeover/ctdb_takeover.c @@ -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;inum_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; +} diff --git a/ctdb/tools/ctdb_control.c b/ctdb/tools/ctdb_control.c index e95ff3ea4dd..800f707927c 100644 --- a/ctdb/tools/ctdb_control.c +++ b/ctdb/tools/ctdb_control.c @@ -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;inum;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", ""}, { "getdbmap", control_getdbmap, "show the database map" }, { "catdb", control_catdb, "dump a database" , ""},