/* * This resolves the first address assigned to a node * and returns the name or IP address. Use cfgtool if you need more information. */ static const char *node_name(corosync_cfg_handle_t c_handle, uint32_t nodeid, name_format_t name_format) { int ret; int numaddrs; corosync_cfg_node_address_t addrs[INTERFACE_MAX]; if (corosync_cfg_get_node_addrs(c_handle, nodeid, INTERFACE_MAX, &numaddrs, addrs) == CS_OK) { static char buf[INET6_ADDRSTRLEN]; socklen_t addrlen; struct sockaddr_storage *ss = (struct sockaddr_storage *)addrs[0].address; if (ss->ss_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); else addrlen = sizeof(struct sockaddr_in); ret = getnameinfo((struct sockaddr *)addrs[0].address, addrlen, buf, sizeof(buf), NULL, 0, (name_format == ADDRESS_FORMAT_IP)?NI_NUMERICHOST:0); if (!ret) return buf; } return ""; }
static void fprint_addrs(FILE *f, int nodeid) { int numaddrs; int i; corosync_cfg_node_address_t addrs[INTERFACE_MAX]; if (corosync_cfg_get_node_addrs(cfg_handle, nodeid, INTERFACE_MAX, &numaddrs, addrs) == CS_OK) { for (i=0; i<numaddrs; i++) { char buf[INET6_ADDRSTRLEN]; struct sockaddr_storage *ss = (struct sockaddr_storage *)addrs[i].address; struct sockaddr_in *sin = (struct sockaddr_in *)addrs[i].address; struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addrs[i].address; void *saddr; if (ss->ss_family == AF_INET6) saddr = &sin6->sin6_addr; else saddr = &sin->sin_addr; inet_ntop(ss->ss_family, saddr, buf, sizeof(buf)); if (i != 0) { fprintf(f, " "); } fprintf(f, "%s", buf); } } }
static void quorum_callback(quorum_handle_t h, uint32_t quorate, uint64_t ring_seq, uint32_t node_list_entries, uint32_t *node_list) { corosync_cfg_node_address_t addrs[MAX_NODE_ADDRESSES]; corosync_cfg_node_address_t *addrptr = addrs; cs_error_t err; int i, j, num_addrs; cluster_quorate = quorate; old_node_count = quorum_node_count; memcpy(&old_nodes, &quorum_nodes, sizeof(old_nodes)); quorum_node_count = 0; memset(&quorum_nodes, 0, sizeof(quorum_nodes)); for (i = 0; i < node_list_entries; i++) quorum_nodes[quorum_node_count++] = node_list[i]; for (i = 0; i < old_node_count; i++) { if (!is_cluster_member(old_nodes[i])) { log_debug("cluster node %u removed", old_nodes[i]); node_history_cluster_remove(old_nodes[i]); del_configfs_node(old_nodes[i]); } } for (i = 0; i < quorum_node_count; i++) { if (!is_old_member(quorum_nodes[i])) { log_debug("cluster node %u added", quorum_nodes[i]); node_history_cluster_add(quorum_nodes[i]); err = corosync_cfg_get_node_addrs(ch, quorum_nodes[i], MAX_NODE_ADDRESSES, &num_addrs, addrs); if (err != CS_OK) { log_error("corosync_cfg_get_node_addrs failed " "nodeid %u", quorum_nodes[i]); continue; } for (j = 0; j < num_addrs; j++) { add_configfs_node(quorum_nodes[i], addrptr[j].address, addrptr[j].address_length, (quorum_nodes[i] == our_nodeid)); } } } }
static void showaddrs_do(unsigned int nodeid) { cs_error_t result; corosync_cfg_handle_t handle; corosync_cfg_callbacks_t callbacks; int numaddrs; int i; corosync_cfg_node_address_t addrs[INTERFACE_MAX]; result = corosync_cfg_initialize (&handle, &callbacks); if (result != CS_OK) { printf ("Could not initialize corosync configuration API error %d\n", result); exit (1); } if (corosync_cfg_get_node_addrs(handle, nodeid, INTERFACE_MAX, &numaddrs, addrs) == CS_OK) { for (i=0; i<numaddrs; i++) { char buf[INET6_ADDRSTRLEN]; struct sockaddr_storage *ss = (struct sockaddr_storage *)addrs[i].address; struct sockaddr_in *sin = (struct sockaddr_in *)addrs[i].address; struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addrs[i].address; void *saddr; if (!ss->ss_family) { continue; } if (ss->ss_family == AF_INET6) { saddr = &sin6->sin6_addr; } else { saddr = &sin->sin_addr; } inet_ntop(ss->ss_family, saddr, buf, sizeof(buf)); if (i != 0) { printf(" "); } printf("%s", buf); } printf("\n"); } (void)corosync_cfg_finalize (handle); }
/*! \brief Informs the cluster of our EID and our IP addresses */ static void send_cluster_notify(void) { struct ast_event *event; unsigned int node_id; cs_error_t cs_err; corosync_cfg_node_address_t corosync_addr; int num_addrs = 0; struct sockaddr *sa; size_t sa_len; char buf[128]; int res; if ((cs_err = corosync_cfg_local_get(cfg_handle, &node_id)) != CS_OK) { ast_log(LOG_WARNING, "Failed to extract Corosync node ID for this node. Not informing cluster of existance.\n"); return; } if (((cs_err = corosync_cfg_get_node_addrs(cfg_handle, node_id, 1, &num_addrs, &corosync_addr)) != CS_OK) || (num_addrs < 1)) { ast_log(LOG_WARNING, "Failed to get local Corosync address. Not informing cluster of existance.\n"); return; } sa = (struct sockaddr *)corosync_addr.address; sa_len = (size_t)corosync_addr.address_length; if ((res = getnameinfo(sa, sa_len, buf, sizeof(buf), NULL, 0, NI_NUMERICHOST))) { ast_log(LOG_WARNING, "Failed to determine name of local Corosync address: %s (%d). Not informing cluster of existance.\n", gai_strerror(res), res); return; } event = ast_event_new(AST_EVENT_CLUSTER_DISCOVERY, AST_EVENT_IE_NODE_ID, AST_EVENT_IE_PLTYPE_UINT, node_id, AST_EVENT_IE_LOCAL_ADDR, AST_EVENT_IE_PLTYPE_STR, buf, AST_EVENT_IE_END); publish_event_to_corosync(event); ast_free(event); }
/* * This resolves the first address assigned to a node * and returns the name or IP address. Use cfgtool if you need more information. */ static const char *node_name(uint32_t nodeid, name_format_t name_format) { int err; int numaddrs; corosync_cfg_node_address_t addrs[INTERFACE_MAX]; static char buf[(INET6_ADDRSTRLEN + 1) * KNET_MAX_LINK]; const char *nodelist_name = NULL; socklen_t addrlen; struct sockaddr_storage *ss; int start_addr = 0; int i; int bufptr = 0; buf[0] = '\0'; /* If a name is required, always look for the nodelist node0_addr name first */ if (name_format == ADDRESS_FORMAT_NAME) { nodelist_name = node_name_by_nodelist(nodeid); } if ((nodelist_name) && (strlen(nodelist_name) > 0)) { start_addr = 1; strcpy(buf, nodelist_name); bufptr = strlen(buf); } err = corosync_cfg_get_node_addrs(c_handle, nodeid, INTERFACE_MAX, &numaddrs, addrs); if (err != CS_OK) { fprintf(stderr, "Unable to get node address for nodeid %u: %s\n", nodeid, cs_strerror(err)); return ""; } /* Don't show all addressess */ if (!g_show_all_addrs) { numaddrs = 1; } for (i=start_addr; i<numaddrs; i++) { ss = (struct sockaddr_storage *)addrs[i].address; if (!ss->ss_family) { continue; } if (ss->ss_family == AF_INET6) { addrlen = sizeof(struct sockaddr_in6); } else { addrlen = sizeof(struct sockaddr_in); } if (i) { buf[bufptr++] = ','; buf[bufptr++] = ' '; } if (!getnameinfo( (struct sockaddr *)addrs[i].address, addrlen, buf+bufptr, sizeof(buf)-bufptr, NULL, 0, (name_format == ADDRESS_FORMAT_IP)?NI_NUMERICHOST:0)) { bufptr += strlen(buf+bufptr); } } return buf; }