public inbox for cluster-cvs@sourceware.org
help / color / mirror / Atom feed
* cluster: master - config: ldap convertor should use CS_ codes rather than SA_AIS ones
@ 2009-01-07 14:04 Christine Caulfield
0 siblings, 0 replies; 2+ messages in thread
From: Christine Caulfield @ 2009-01-07 14:04 UTC (permalink / raw)
To: cluster-cvs-relay
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=1793c3e6f9b6971d1f1e7025304adf158e7b7d97
Commit: 1793c3e6f9b6971d1f1e7025304adf158e7b7d97
Parent: 04e717ba27ee1ca98095e2a59ea11b53142e458b
Author: Christine Caulfield <ccaulfie@redhat.com>
AuthorDate: Wed Jan 7 14:03:31 2009 +0000
Committer: Christine Caulfield <ccaulfie@redhat.com>
CommitterDate: Wed Jan 7 14:03:31 2009 +0000
config: ldap convertor should use CS_ codes rather than SA_AIS ones
... really this time ...
Signed-off-by: Christine Caulfield <ccaulfie@redhat.com>
---
config/tools/ldap/confdb2ldif.c | 20 ++++++++++----------
1 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/config/tools/ldap/confdb2ldif.c b/config/tools/ldap/confdb2ldif.c
index 0606d7e..f4bd7a9 100644
--- a/config/tools/ldap/confdb2ldif.c
+++ b/config/tools/ldap/confdb2ldif.c
@@ -7,7 +7,7 @@
#include <sys/types.h>
#include <sys/un.h>
-#include <openais/saAis.h>
+#include <corosync/corotypes.h>
#include <corosync/confdb.h>
confdb_callbacks_t callbacks = {
@@ -73,13 +73,13 @@ static void print_config_tree(confdb_handle_t handle, unsigned int parent_object
/* Show the keys */
res = confdb_key_iter_start(handle, parent_object_handle);
- if (res != SA_AIS_OK) {
+ if (res != CS_OK) {
printf( "error resetting key iterator for object %d: %d\n", parent_object_handle, res);
return;
}
while ( (res = confdb_key_iter(handle, parent_object_handle, key_name, &key_name_len,
- key_value, &key_value_len)) == SA_AIS_OK) {
+ key_value, &key_value_len)) == CS_OK) {
key_name[key_name_len] = '\0';
key_value[key_value_len] = '\0';
@@ -104,16 +104,16 @@ static void print_config_tree(confdb_handle_t handle, unsigned int parent_object
/* Show sub-objects */
res = confdb_object_iter_start(handle, parent_object_handle);
- if (res != SA_AIS_OK) {
+ if (res != CS_OK) {
printf( "error resetting object iterator for object %d: %d\n", parent_object_handle, res);
return;
}
- while ( (res = confdb_object_iter(handle, parent_object_handle, &object_handle, object_name, &object_name_len)) == SA_AIS_OK) {
+ while ( (res = confdb_object_iter(handle, parent_object_handle, &object_handle, object_name, &object_name_len)) == CS_OK) {
unsigned int parent;
res = confdb_object_parent_get(handle, object_handle, &parent);
- if (res != SA_AIS_OK) {
+ if (res != CS_OK) {
printf( "error getting parent for object %d: %d\n", object_handle, res);
return;
}
@@ -122,7 +122,7 @@ static void print_config_tree(confdb_handle_t handle, unsigned int parent_object
/* Check for "name", and create dummy parent object */
res = confdb_key_get(handle, object_handle, "name", strlen("name"), key_value, &key_value_len);
- if (res == SA_AIS_OK) {
+ if (res == CS_OK) {
sprintf(cumulative_dn, "cn=%s,%s", object_name, fulldn);
printf("\n");
printf("dn: %s\n", cumulative_dn);
@@ -167,7 +167,7 @@ int main(int argc, char *argv[])
}
result = confdb_initialize (&handle, &callbacks);
- if (result != SA_AIS_OK) {
+ if (result != CS_OK) {
printf ("Could not initialize Cluster Configuration Database API instance error %d\n", result);
exit (1);
}
@@ -175,13 +175,13 @@ int main(int argc, char *argv[])
/* Find the starting object ... this should be a param */
result = confdb_object_find_start(handle, OBJECT_PARENT_HANDLE);
- if (result != SA_AIS_OK) {
+ if (result != CS_OK) {
printf ("Could not start object_find %d\n", result);
exit (1);
}
result = confdb_object_find(handle, OBJECT_PARENT_HANDLE, clusterroot, strlen(clusterroot), &cluster_handle);
- if (result != SA_AIS_OK) {
+ if (result != CS_OK) {
printf ("Could not object_find \"cluster\": %d\n", result);
exit (1);
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* cluster: master - config: ldap convertor should use CS_ codes rather than SA_AIS ones
@ 2009-01-07 13:59 Christine Caulfield
0 siblings, 0 replies; 2+ messages in thread
From: Christine Caulfield @ 2009-01-07 13:59 UTC (permalink / raw)
To: cluster-cvs-relay
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=04e717ba27ee1ca98095e2a59ea11b53142e458b
Commit: 04e717ba27ee1ca98095e2a59ea11b53142e458b
Parent: 9c6978143cfd4dfee4421da3803536e471e9cc92
Author: Christine Caulfield <ccaulfie@redhat.com>
AuthorDate: Wed Jan 7 13:57:41 2009 +0000
Committer: Christine Caulfield <ccaulfie@redhat.com>
CommitterDate: Wed Jan 7 13:57:41 2009 +0000
config: ldap convertor should use CS_ codes rather than SA_AIS ones
Signed-off-by: Christine Caulfield <ccaulfie@redhat.com>
---
cman/config/Makefile | 29 +
cman/config/cman-preconfig.c | 1172 ++++++++++++++++++++++++++++++++++++++++++
cman/config/cman.h | 14 +
cman/config/nodelist.h | 93 ++++
4 files changed, 1308 insertions(+), 0 deletions(-)
diff --git a/cman/config/Makefile b/cman/config/Makefile
new file mode 100644
index 0000000..d4119bf
--- /dev/null
+++ b/cman/config/Makefile
@@ -0,0 +1,29 @@
+TARGET= config_cmanpre.lcrso
+
+LCRSOT=$(TARGET)
+
+all: depends ${TARGET}
+
+include ../../make/defines.mk
+include $(OBJDIR)/make/cobj.mk
+include $(OBJDIR)/make/clean.mk
+include $(OBJDIR)/make/install.mk
+include $(OBJDIR)/make/uninstall.mk
+
+CFLAGS += -fPIC
+CFLAGS += -I${openaisincdir} -I${corosyncincdir}
+CFLAGS += -I${incdir}
+
+LDFLAGS += -L${libdir}
+
+OBJS= cman-preconfig.o
+
+${TARGET}: ${OBJS}
+ $(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LDFLAGS)
+
+depends:
+ $(MAKE) -C ${cmanlibdir} all
+
+clean: generalclean
+
+-include $(OBJS:.o=.d)
diff --git a/cman/config/cman-preconfig.c b/cman/config/cman-preconfig.c
new file mode 100644
index 0000000..f9aaefd
--- /dev/null
+++ b/cman/config/cman-preconfig.c
@@ -0,0 +1,1172 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <sys/utsname.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/errno.h>
+#include <netdb.h>
+#define SYSLOG_NAMES
+#include <sys/syslog.h>
+#include <ifaddrs.h>
+#include <arpa/inet.h>
+
+/* corosync headers */
+#include <corosync/engine/logsys.h>
+#include <corosync/lcr/lcr_comp.h>
+#include <corosync/engine/objdb.h>
+#include <corosync/engine/config.h>
+
+#include "cman.h"
+#define OBJDB_API struct objdb_iface_ver0
+#include "nodelist.h"
+
+#define MAX_PATH_LEN PATH_MAX
+
+static unsigned int debug_mask;
+static int cmanpre_readconfig(struct objdb_iface_ver0 *objdb, char **error_string);
+static int cmanpre_reloadconfig(struct objdb_iface_ver0 *objdb, int flush, char **error_string);
+
+static char *nodename_env;
+static int expected_votes;
+static int node_votes=0;
+static int num_interfaces;
+static int startup_pipe;
+static unsigned int cluster_id;
+static char nodename[MAX_CLUSTER_MEMBER_NAME_LEN];
+static int nodeid;
+static int two_node;
+static unsigned int disable_openais;
+static unsigned int portnum;
+static int num_nodenames;
+static char *key_filename=NULL;
+static char *mcast_name;
+static char *cluster_name;
+static char error_reason[1024] = { '\0' };
+static unsigned int cluster_parent_handle;
+
+/*
+ * Exports the interface for the service
+ */
+static struct config_iface_ver0 cmanpreconfig_iface_ver0 = {
+ .config_readconfig = cmanpre_readconfig,
+ .config_reloadconfig = cmanpre_reloadconfig
+};
+
+static struct lcr_iface ifaces_ver0[2] = {
+ {
+ .name = "cmanpreconfig",
+ .version = 0,
+ .versions_replace = 0,
+ .versions_replace_count = 0,
+ .dependencies = 0,
+ .dependency_count = 0,
+ .constructor = NULL,
+ .destructor = NULL,
+ .interfaces = NULL,
+ }
+};
+
+static struct lcr_comp cmanpre_comp_ver0 = {
+ .iface_count = 1,
+ .ifaces = ifaces_ver0,
+};
+
+
+
+__attribute__ ((constructor)) static void cmanpre_comp_register(void) {
+ lcr_interfaces_set(&ifaces_ver0[0], &cmanpreconfig_iface_ver0);
+ lcr_component_register(&cmanpre_comp_ver0);
+}
+
+static char *facility_name_get (unsigned int facility)
+{
+ unsigned int i;
+
+ for (i = 0; facilitynames[i].c_name != NULL; i++) {
+ if (facility == facilitynames[i].c_val) {
+ return (facilitynames[i].c_name);
+ }
+ }
+ return (NULL);
+}
+
+static char *priority_name_get (unsigned int priority)
+{
+ unsigned int i;
+
+ for (i = 0; prioritynames[i].c_name != NULL; i++) {
+ if (priority == prioritynames[i].c_val) {
+ return (prioritynames[i].c_name);
+ }
+ }
+ return (NULL);
+}
+
+
+#define LOCALHOST_IPV4 "127.0.0.1"
+#define LOCALHOST_IPV6 "::1"
+
+/* Compare two addresses */
+static int ipaddr_equal(struct sockaddr_storage *addr1, struct sockaddr_storage *addr2)
+{
+ int addrlen = 0;
+ struct sockaddr *saddr1 = (struct sockaddr *)addr1;
+ struct sockaddr *saddr2 = (struct sockaddr *)addr2;
+
+ if (saddr1->sa_family != saddr2->sa_family)
+ return 0;
+
+ if (saddr1->sa_family == AF_INET) {
+ addrlen = sizeof(struct sockaddr_in);
+ }
+ if (saddr1->sa_family == AF_INET6) {
+ addrlen = sizeof(struct sockaddr_in6);
+ }
+ assert(addrlen);
+
+ if (memcmp(saddr1, saddr2, addrlen) == 0)
+ return 1;
+ else
+ return 0;
+
+}
+
+/* Build a localhost ip_address */
+static int get_localhost(int family, struct sockaddr_storage *localhost)
+{
+ char *addr_text;
+ struct addrinfo *ainfo;
+ struct addrinfo ahints;
+ int ret;
+
+ if (family == AF_INET) {
+ addr_text = LOCALHOST_IPV4;
+ } else {
+ addr_text = LOCALHOST_IPV6;
+ }
+
+ memset(&ahints, 0, sizeof(ahints));
+ ahints.ai_socktype = SOCK_DGRAM;
+ ahints.ai_protocol = IPPROTO_UDP;
+ ahints.ai_family = family;
+
+ /* Lookup the nodename address */
+ ret = getaddrinfo(addr_text, NULL, &ahints, &ainfo);
+ if (ret)
+ return -1;
+
+ memset(localhost, 0, sizeof(struct sockaddr_storage));
+ memcpy(localhost, ainfo->ai_addr, ainfo->ai_addrlen);
+
+ freeaddrinfo(ainfo);
+ return 0;
+}
+
+/* Return the address family of an IP[46] name */
+static int address_family(char *addr, struct sockaddr_storage *ssaddr)
+{
+ struct addrinfo *ainfo;
+ struct addrinfo ahints;
+ int family;
+ int ret;
+
+ memset(&ahints, 0, sizeof(ahints));
+ ahints.ai_socktype = SOCK_DGRAM;
+ ahints.ai_protocol = IPPROTO_UDP;
+
+ /* Lookup the nodename address */
+ ret = getaddrinfo(addr, NULL, &ahints, &ainfo);
+ if (ret)
+ return -1;
+
+ memset(ssaddr, 0, sizeof(struct sockaddr_storage));
+ memcpy(ssaddr, ainfo->ai_addr, ainfo->ai_addrlen);
+ family = ainfo->ai_family;
+
+ freeaddrinfo(ainfo);
+ return family;
+}
+
+
+/* Find the "CMAN" logger_subsys object. Or create one if it does not
+ exist
+*/
+static unsigned int find_cman_logger(struct objdb_iface_ver0 *objdb, unsigned int object_handle)
+{
+ unsigned int subsys_handle;
+ unsigned int find_handle;
+ char *str;
+
+ objdb->object_find_create(object_handle, "logger_subsys", strlen("logger_subsys"), &find_handle);
+ while (!objdb->object_find_next(object_handle, &subsys_handle)) {
+
+ if (objdb_get_string(objdb, subsys_handle, "subsys", &str)) {
+ continue;
+ }
+ if (strcmp(str, CMAN_NAME) == 0)
+ return subsys_handle;
+ }
+ objdb->object_find_destroy(find_handle);
+
+ /* We can't find it ... create one */
+ if (objdb->object_create(object_handle, &subsys_handle,
+ "logger_subsys", strlen("logger_subsys")) == 0) {
+
+ objdb->object_key_create(subsys_handle, "subsys", strlen("subsys"),
+ CMAN_NAME, strlen(CMAN_NAME)+1);
+ }
+
+ return subsys_handle;
+
+}
+
+static int sum_expected(struct objdb_iface_ver0 *objdb)
+{
+ int vote_sum = 0;
+ unsigned int nodes_handle;
+ unsigned int find_handle=0;
+
+ nodes_handle = nodeslist_init(objdb, cluster_parent_handle, &find_handle);
+ do {
+ int votes;
+
+ objdb_get_int(objdb, nodes_handle, "votes", (unsigned int *)&votes, 1);
+ if (votes < 0) {
+ votes = 1;
+ }
+ vote_sum += votes;
+ nodes_handle = nodeslist_next(objdb, find_handle);
+ } while (nodes_handle);
+ objdb->object_find_destroy(find_handle);
+
+ return vote_sum;
+}
+
+static int add_ifaddr(struct objdb_iface_ver0 *objdb, char *mcast, char *ifaddr, int portnum)
+{
+ unsigned int totem_object_handle;
+ unsigned int find_handle;
+ unsigned int interface_object_handle;
+ struct sockaddr_storage if_addr, localhost, mcast_addr;
+ char tmp[132];
+ int ret = 0;
+
+ /* Check the families match */
+ if (address_family(mcast, &mcast_addr) !=
+ address_family(ifaddr, &if_addr)) {
+ sprintf(error_reason, "Node address family does not match multicast address family");
+ return -1;
+ }
+
+ /* Check it's not bound to localhost, sigh */
+ get_localhost(if_addr.ss_family, &localhost);
+ if (ipaddr_equal(&localhost, &if_addr)) {
+ sprintf(error_reason, "Node address is localhost, please choose a real host address");
+ return -1;
+ }
+
+ objdb->object_find_create(OBJECT_PARENT_HANDLE, "totem", strlen("totem"), &find_handle);
+ if (objdb->object_find_next(find_handle, &totem_object_handle)) {
+
+ objdb->object_create(OBJECT_PARENT_HANDLE, &totem_object_handle,
+ "totem", strlen("totem"));
+ }
+ objdb->object_find_destroy(find_handle);
+
+ if (objdb->object_create(totem_object_handle, &interface_object_handle,
+ "interface", strlen("interface")) == 0) {
+
+ sprintf(tmp, "%d", num_interfaces);
+ objdb->object_key_create(interface_object_handle, "ringnumber", strlen("ringnumber"),
+ tmp, strlen(tmp)+1);
+
+ objdb->object_key_create(interface_object_handle, "bindnetaddr", strlen("bindnetaddr"),
+ ifaddr, strlen(ifaddr)+1);
+
+ objdb->object_key_create(interface_object_handle, "mcastaddr", strlen("mcastaddr"),
+ mcast, strlen(mcast)+1);
+
+ sprintf(tmp, "%d", portnum);
+ objdb->object_key_create(interface_object_handle, "mcastport", strlen("mcastport"),
+ tmp, strlen(tmp)+1);
+
+ num_interfaces++;
+ }
+ return ret;
+}
+
+static uint16_t generate_cluster_id(char *name)
+{
+ int i;
+ int value = 0;
+
+ for (i=0; i<strlen(name); i++) {
+ value <<= 1;
+ value += name[i];
+ }
+ sprintf(error_reason, "Generated cluster id for '%s' is %d\n", name, value & 0xFFFF);
+ return value & 0xFFFF;
+}
+
+static char *default_mcast(char *nodename, uint16_t cluster_id)
+{
+ struct addrinfo *ainfo;
+ struct addrinfo ahints;
+ int ret;
+ int family;
+ static char addr[132];
+
+ memset(&ahints, 0, sizeof(ahints));
+
+ /* Lookup the the nodename address and use it's IP type to
+ default a multicast address */
+ ret = getaddrinfo(nodename, NULL, &ahints, &ainfo);
+ if (ret) {
+ sprintf(error_reason, "Can't determine address family of nodename %s\n", nodename);
+ return NULL;
+ }
+
+ family = ainfo->ai_family;
+ freeaddrinfo(ainfo);
+
+ if (family == AF_INET) {
+ snprintf(addr, sizeof(addr), "239.192.%d.%d", cluster_id >> 8, cluster_id % 0xFF);
+ return addr;
+ }
+ if (family == AF_INET6) {
+ snprintf(addr, sizeof(addr), "ff15::%x", cluster_id);
+ return addr;
+ }
+
+ return NULL;
+}
+
+static int verify_nodename(struct objdb_iface_ver0 *objdb, char *nodename)
+{
+ char nodename2[MAX_CLUSTER_MEMBER_NAME_LEN+1];
+ char nodename3[MAX_CLUSTER_MEMBER_NAME_LEN+1];
+ char *str, *dot = NULL;
+ struct ifaddrs *ifa, *ifa_list;
+ struct sockaddr *sa;
+ unsigned int nodes_handle;
+ unsigned int find_handle = 0;
+ int error;
+
+ /* nodename is either from commandline or from uname */
+ if (nodelist_byname(objdb, cluster_parent_handle, nodename))
+ return 0;
+
+ /* If nodename was from uname, try a domain-less version of it */
+ strcpy(nodename2, nodename);
+ dot = strchr(nodename2, '.');
+ if (dot) {
+ *dot = '\0';
+
+ if (nodelist_byname(objdb, cluster_parent_handle, nodename2)) {
+ strcpy(nodename, nodename2);
+ return 0;
+ }
+ }
+
+ /* If nodename (from uname) is domain-less, try to match against
+ cluster.conf names which may have domainname specified */
+ nodes_handle = nodeslist_init(objdb, cluster_parent_handle, &find_handle);
+ do {
+ int len;
+
+ if (objdb_get_string(objdb, nodes_handle, "name", &str)) {
+ sprintf(error_reason, "Cannot get node name");
+ nodes_handle = nodeslist_next(objdb, find_handle);
+ continue;
+ }
+
+ strcpy(nodename3, str);
+ dot = strchr(nodename3, '.');
+ if (dot)
+ len = dot-nodename3;
+ else
+ len = strlen(nodename3);
+
+ if (strlen(nodename2) == len &&
+ !strncmp(nodename2, nodename3, len)) {
+ strcpy(nodename, str);
+ return 0;
+ }
+ nodes_handle = nodeslist_next(objdb, find_handle);
+ } while (nodes_handle);
+ objdb->object_find_destroy(find_handle);
+
+
+ /* The cluster.conf names may not be related to uname at all,
+ they may match a hostname on some network interface.
+ NOTE: This is IPv4 only */
+ error = getifaddrs(&ifa_list);
+ if (error)
+ return -1;
+
+ for (ifa = ifa_list; ifa; ifa = ifa->ifa_next) {
+ /* Restore this */
+ strcpy(nodename2, nodename);
+ sa = ifa->ifa_addr;
+ if (!sa || sa->sa_family != AF_INET)
+ continue;
+
+ error = getnameinfo(sa, sizeof(*sa), nodename2,
+ sizeof(nodename2), NULL, 0, 0);
+ if (error)
+ goto out;
+
+ if (nodelist_byname(objdb, cluster_parent_handle, nodename2)) {
+ strcpy(nodename, nodename2);
+ goto out;
+ }
+
+ /* truncate this name and try again */
+
+ dot = strchr(nodename2, '.');
+ if (!dot)
+ continue;
+ *dot = '\0';
+
+ if (nodelist_byname(objdb, cluster_parent_handle, nodename2)) {
+ strcpy(nodename, nodename2);
+ goto out;
+ }
+
+ /* See if it's the IP address that's in cluster.conf */
+ error = getnameinfo(sa, sizeof(*sa), nodename2,
+ sizeof(nodename2), NULL, 0, NI_NUMERICHOST);
+ if (error)
+ goto out;
+
+ if (nodelist_byname(objdb, cluster_parent_handle, nodename2)) {
+ strcpy(nodename, nodename2);
+ goto out;
+ }
+ }
+
+ error = -1;
+ out:
+ freeifaddrs(ifa_list);
+ return error;
+}
+
+/* Get any environment variable overrides */
+static int get_env_overrides()
+{
+ if (getenv("CMAN_CLUSTER_NAME")) {
+ cluster_name = strdup(getenv("CMAN_CLUSTER_NAME"));
+ }
+
+ nodename_env = getenv("CMAN_NODENAME");
+
+ expected_votes = 0;
+ if (getenv("CMAN_EXPECTEDVOTES")) {
+ expected_votes = atoi(getenv("CMAN_EXPECTEDVOTES"));
+ if (expected_votes < 1) {
+ expected_votes = 0;
+ }
+ }
+
+ /* optional port */
+ if (getenv("CMAN_IP_PORT")) {
+ portnum = atoi(getenv("CMAN_IP_PORT"));
+ }
+
+ /* optional security key filename */
+ if (getenv("CMAN_KEYFILE")) {
+ key_filename = strdup(getenv("CMAN_KEYFILE"));
+ if (key_filename == NULL) {
+ sprintf(error_reason, "Cannot allocate memory for key filename");
+ return -1;
+ }
+ }
+
+ /* find our own number of votes */
+ if (getenv("CMAN_VOTES")) {
+ node_votes = atoi(getenv("CMAN_VOTES"));
+ }
+
+ /* nodeid */
+ if (getenv("CMAN_NODEID")) {
+ nodeid = atoi(getenv("CMAN_NODEID"));
+ }
+
+ if (getenv("CMAN_MCAST_ADDR")) {
+ mcast_name = getenv("CMAN_MCAST_ADDR");
+ }
+
+ if (getenv("CMAN_2NODE")) {
+ two_node = 1;
+ expected_votes = 1;
+ node_votes = 1;
+ }
+ if (getenv("CMAN_DEBUGLOG")) {
+ debug_mask = atoi(getenv("CMAN_DEBUGLOG"));
+ }
+
+ return 0;
+}
+
+
+static int get_nodename(struct objdb_iface_ver0 *objdb)
+{
+ char *nodeid_str = NULL;
+ char *votes_str;
+ unsigned int object_handle;
+ unsigned int find_handle;
+ unsigned int node_object_handle;
+ unsigned int alt_object;
+ int error;
+
+ if (!getenv("CMAN_NOCONFIG")) {
+ /* our nodename */
+ if (nodename_env != NULL) {
+ if (strlen(nodename_env) >= sizeof(nodename)) {
+ sprintf(error_reason, "Overridden node name %s is too long", nodename);
+ error = -1;
+ goto out;
+ }
+
+ strcpy(nodename, nodename_env);
+
+ if (!(node_object_handle = nodelist_byname(objdb, cluster_parent_handle, nodename))) {
+ sprintf(error_reason, "Overridden node name %s is not in CCS", nodename);
+ error = -1;
+ goto out;
+ }
+
+ } else {
+ struct utsname utsname;
+
+ error = uname(&utsname);
+ if (error) {
+ sprintf(error_reason, "cannot get node name, uname failed");
+ error = -1;
+ goto out;
+ }
+
+ if (strlen(utsname.nodename) >= sizeof(nodename)) {
+ sprintf(error_reason, "node name from uname is too long");
+ error = -1;
+ goto out;
+ }
+
+ strcpy(nodename, utsname.nodename);
+ }
+ if (verify_nodename(objdb, nodename))
+ return -1;
+
+ }
+
+ /* Add <cman> bits to pass down to the main module*/
+ if ( (node_object_handle = nodelist_byname(objdb, cluster_parent_handle, nodename))) {
+ if (objdb_get_string(objdb, node_object_handle, "nodeid", &nodeid_str)) {
+ sprintf(error_reason, "This node has no nodeid in cluster.conf");
+ return -1;
+ }
+ if (!objdb_get_string(objdb, node_object_handle, "votes", &votes_str)) {
+ node_votes=atoi(votes_str);
+ }
+ }
+
+ objdb->object_find_create(cluster_parent_handle, "cman", strlen("cman"), &find_handle);
+
+ if (objdb->object_find_next(find_handle, &object_handle) == 0) {
+
+ unsigned int mcast_handle;
+ unsigned int find_handle2;
+
+ if (!mcast_name) {
+
+ objdb->object_find_create(object_handle, "multicast", strlen("multicast"), &find_handle2);
+ if (objdb->object_find_next(find_handle2, &mcast_handle) == 0) {
+
+ objdb_get_string(objdb, mcast_handle, "addr", &mcast_name);
+ }
+ objdb->object_find_destroy(find_handle2);
+ }
+
+ if (!mcast_name) {
+ mcast_name = default_mcast(nodename, cluster_id);
+ }
+
+ /* See if the user wants our default set of openais services (default=yes) */
+ objdb_get_int(objdb, object_handle, "disable_openais", &disable_openais, 0);
+
+ objdb->object_key_create(object_handle, "nodename", strlen("nodename"),
+ nodename, strlen(nodename)+1);
+ }
+ objdb->object_find_destroy(find_handle);
+
+ nodeid = atoi(nodeid_str);
+ error = 0;
+
+ /* optional port */
+ if (!portnum) {
+ objdb_get_int(objdb, object_handle, "port", &portnum, DEFAULT_PORT);
+ }
+
+ if (add_ifaddr(objdb, mcast_name, nodename, portnum))
+ return -1;
+
+ /* Get all alternative node names */
+ num_nodenames = 1;
+ objdb->object_find_create(node_object_handle,"altname", strlen("altname"), &find_handle);
+ while (objdb->object_find_next(find_handle, &alt_object) == 0) {
+ unsigned int port;
+ char *nodename;
+ char *mcast;
+
+ if (objdb_get_string(objdb, alt_object, "name", &nodename)) {
+ continue;
+ }
+
+ objdb_get_int(objdb, alt_object, "port", &port, portnum);
+
+ if (objdb_get_string(objdb, alt_object, "mcast", &mcast)) {
+ mcast = mcast_name;
+ }
+
+ if (add_ifaddr(objdb, mcast, nodename, portnum))
+ return -1;
+
+ num_nodenames++;
+ }
+ objdb->object_find_destroy(find_handle);
+
+out:
+ return error;
+}
+
+/* These are basically cman overrides to the totem config bits */
+static void add_cman_overrides(struct objdb_iface_ver0 *objdb)
+{
+ unsigned int logger_object_handle;
+ char *logstr;
+ char *logfacility;
+ unsigned int object_handle;
+ unsigned int find_handle;
+ char tmp[256];
+
+ /* "totem" key already exists, because we have added the interfaces by now */
+ objdb->object_find_create(OBJECT_PARENT_HANDLE,"totem", strlen("totem"), &find_handle);
+ if (objdb->object_find_next(find_handle, &object_handle) == 0)
+ {
+ char *value;
+
+ objdb->object_key_create(object_handle, "version", strlen("version"),
+ "2", 2);
+
+ sprintf(tmp, "%d", nodeid);
+ objdb->object_key_create(object_handle, "nodeid", strlen("nodeid"),
+ tmp, strlen(tmp)+1);
+
+ objdb->object_key_create(object_handle, "vsftype", strlen("vsftype"),
+ "none", strlen("none")+1);
+
+ /* Set the token timeout is 10 seconds, but don't overrride anything that
+ might be in cluster.conf */
+ if (objdb_get_string(objdb, object_handle, "token", &value)) {
+ objdb->object_key_create(object_handle, "token", strlen("token"),
+ "10000", strlen("10000")+1);
+ }
+ if (objdb_get_string(objdb, object_handle, "token_retransmits_before_loss_const", &value)) {
+ objdb->object_key_create(object_handle, "token_retransmits_before_loss_const",
+ strlen("token_retransmits_before_loss_const"),
+ "20", strlen("20")+1);
+ }
+
+ /* Extend consensus & join timeouts per bz#214290 */
+ if (objdb_get_string(objdb, object_handle, "join", &value)) {
+ objdb->object_key_create(object_handle, "join", strlen("join"),
+ "60", strlen("60")+1);
+ }
+ if (objdb_get_string(objdb, object_handle, "consensus", &value)) {
+ objdb->object_key_create(object_handle, "consensus", strlen("consensus"),
+ "4800", strlen("4800")+1);
+ }
+
+ /* Set RRP mode appropriately */
+ if (objdb_get_string(objdb, object_handle, "rrp_mode", &value)) {
+ if (num_interfaces > 1) {
+ objdb->object_key_create(object_handle, "rrp_mode", strlen("rrp_mode"),
+ "active", strlen("active")+1);
+ }
+ else {
+ objdb->object_key_create(object_handle, "rrp_mode", strlen("rrp_mode"),
+ "none", strlen("none")+1);
+ }
+ }
+
+ if (objdb_get_string(objdb, object_handle, "secauth", &value)) {
+ sprintf(tmp, "%d", 1);
+ objdb->object_key_create(object_handle, "secauth", strlen("secauth"),
+ tmp, strlen(tmp)+1);
+ }
+
+ /* optional security key filename */
+ if (!key_filename) {
+ objdb_get_string(objdb, object_handle, "keyfile", &key_filename);
+ }
+ else {
+ objdb->object_key_create(object_handle, "keyfile", strlen("keyfile"),
+ key_filename, strlen(key_filename)+1);
+ }
+ if (!key_filename) {
+ /* Use the cluster name as key,
+ * This isn't a good isolation strategy but it does make sure that
+ * clusters on the same port/multicast by mistake don't actually interfere
+ * and that we have some form of encryption going.
+ */
+
+ int keylen;
+ memset(tmp, 0, sizeof(tmp));
+
+ strcpy(tmp, cluster_name);
+
+ /* Key length must be a multiple of 4 */
+ keylen = (strlen(cluster_name)+4) & 0xFC;
+ objdb->object_key_create(object_handle, "key", strlen("key"),
+ tmp, keylen);
+ }
+ }
+ objdb->object_find_destroy(find_handle);
+
+ /* Make sure mainconfig doesn't stomp on our logging options */
+ objdb->object_find_create(OBJECT_PARENT_HANDLE, "logging", strlen("logging"), &find_handle);
+ if (objdb->object_find_next(find_handle, &object_handle)) {
+
+ objdb->object_create(OBJECT_PARENT_HANDLE, &object_handle,
+ "logging", strlen("logging"));
+ }
+ objdb->object_find_destroy(find_handle);
+
+ logfacility = facility_name_get(SYSLOGFACILITY);
+
+ logger_object_handle = find_cman_logger(objdb, object_handle);
+
+ if (objdb_get_string(objdb, object_handle, "syslog_facility", &logstr)) {
+ objdb->object_key_create(object_handle, "syslog_facility", strlen("syslog_facility"),
+ logfacility, strlen(logfacility)+1);
+ }
+
+ if (objdb_get_string(objdb, object_handle, "to_file", &logstr)) {
+ objdb->object_key_create(object_handle, "to_file", strlen("to_file"),
+ "yes", strlen("yes")+1);
+ }
+
+ if (objdb_get_string(objdb, object_handle, "logfile", &logstr)) {
+ objdb->object_key_create(object_handle, "logfile", strlen("logfile"),
+ LOGDIR "/cman.log", strlen(LOGDIR "/cman.log")+1);
+ }
+
+ if (debug_mask) {
+ objdb->object_key_create(object_handle, "to_stderr", strlen("to_stderr"),
+ "yes", strlen("yes")+1);
+ objdb->object_key_create(logger_object_handle, "debug", strlen("debug"),
+ "on", strlen("on")+1);
+ objdb->object_key_create(logger_object_handle, "syslog_level", strlen("syslog_level"),
+ "debug", strlen("debug")+1);
+
+ }
+ else {
+ char *loglevel;
+ loglevel = priority_name_get(SYSLOGLEVEL);
+ objdb->object_key_create(logger_object_handle, "syslog_level", strlen("syslog_level"),
+ loglevel, strlen(loglevel)+1);
+ }
+
+
+ /* Don't run under user "ais" */
+ objdb->object_find_create(OBJECT_PARENT_HANDLE, "aisexec", strlen("aisexec"), &find_handle);
+ if (objdb->object_find_next(find_handle, &object_handle) != 0) {
+ objdb->object_create(OBJECT_PARENT_HANDLE, &object_handle,
+ "aisexec", strlen("aisexec"));
+
+ }
+ objdb->object_find_destroy(find_handle);
+ objdb->object_key_create(object_handle, "user", strlen("user"),
+ "root", strlen("root") + 1);
+ objdb->object_key_create(object_handle, "group", strlen("group"),
+ "root", strlen("root") + 1);
+
+ objdb->object_find_create(cluster_parent_handle, "cman", strlen("cman"), &find_handle);
+ if (objdb->object_find_next(find_handle, &object_handle) == 0)
+ {
+ char str[255];
+
+ sprintf(str, "%d", cluster_id);
+
+ objdb->object_key_create(object_handle, "cluster_id", strlen("cluster_id"),
+ str, strlen(str) + 1);
+
+ if (two_node) {
+ sprintf(str, "%d", 1);
+ objdb->object_key_create(object_handle, "two_node", strlen("two_node"),
+ str, strlen(str) + 1);
+ }
+ if (debug_mask) {
+ sprintf(str, "%d", debug_mask);
+ objdb->object_key_create(object_handle, "debug_mask", strlen("debug_mask"),
+ str, strlen(str) + 1);
+ }
+ }
+ objdb->object_find_destroy(find_handle);
+
+ /* Make sure we load our alter-ego - the main cman module */
+ objdb->object_create(OBJECT_PARENT_HANDLE, &object_handle,
+ "service", strlen("service"));
+ objdb->object_key_create(object_handle, "name", strlen("name"),
+ "corosync_cman", strlen("corosync_cman") + 1);
+ objdb->object_key_create(object_handle, "ver", strlen("ver"),
+ "0", 2);
+
+ /* Define cman as the quorum provider for corosync */
+ objdb->object_find_create(OBJECT_PARENT_HANDLE, "quorum", strlen("quorum"), &find_handle);
+ if (objdb->object_find_next(find_handle, &object_handle) != 0) {
+ objdb->object_create(OBJECT_PARENT_HANDLE, &object_handle,
+ "quorum", strlen("quorum"));
+ }
+ objdb->object_find_destroy(find_handle);
+
+ objdb->object_key_create(object_handle, "provider", strlen("provider"),
+ "corosync_cmanquorum", strlen("corosync_cmanquorum") + 1);
+
+ if (!expected_votes)
+ expected_votes = sum_expected(objdb);
+
+ sprintf(tmp, "%d", expected_votes);
+ objdb->object_key_create(object_handle, "expected_votes", strlen("expected_votes"),
+ tmp, strlen(tmp)+1);
+
+ sprintf(tmp, "%d", node_votes);
+ objdb->object_key_create(object_handle, "votes", strlen("votes"),
+ tmp, strlen(tmp)+1);
+
+}
+
+/* If ccs is not available then use some defaults */
+static int set_noccs_defaults(struct objdb_iface_ver0 *objdb)
+{
+ char tmp[255];
+ unsigned int object_handle;
+
+ /* Enforce key */
+ key_filename = NOCCS_KEY_FILENAME;
+
+ if (!cluster_name)
+ cluster_name = DEFAULT_CLUSTER_NAME;
+
+ if (!cluster_id)
+ cluster_id = generate_cluster_id(cluster_name);
+
+ if (!nodename_env) {
+ int error;
+ struct utsname utsname;
+
+ error = uname(&utsname);
+ if (error) {
+ sprintf(error_reason, "cannot get node name, uname failed");
+ return -1;
+ }
+
+ nodename_env = (char *)&utsname.nodename;
+ }
+ strcpy(nodename, nodename_env);
+ num_nodenames = 1;
+
+ if (!mcast_name) {
+ mcast_name = default_mcast(nodename, cluster_id);
+ }
+
+ /* This will increase as nodes join the cluster */
+ if (!expected_votes)
+ expected_votes = 1;
+ if (!node_votes)
+ node_votes = 1;
+
+ if (!portnum)
+ portnum = DEFAULT_PORT;
+
+ /* Invent a node ID */
+ if (!nodeid) {
+ struct addrinfo *ainfo;
+ struct addrinfo ahints;
+ int ret;
+
+ memset(&ahints, 0, sizeof(ahints));
+ ret = getaddrinfo(nodename, NULL, &ahints, &ainfo);
+ if (ret) {
+ sprintf(error_reason, "Can't determine address family of nodename %s\n", nodename);
+ return -1;
+ }
+
+ if (ainfo->ai_family == AF_INET) {
+ struct sockaddr_in *addr = (struct sockaddr_in *)ainfo->ai_addr;
+ memcpy(&nodeid, &addr->sin_addr, sizeof(int));
+ }
+ if (ainfo->ai_family == AF_INET6) {
+ struct sockaddr_in6 *addr = (struct sockaddr_in6 *)ainfo->ai_addr;
+ memcpy(&nodeid, &addr->sin6_addr.s6_addr32[3], sizeof(int));
+ }
+ freeaddrinfo(ainfo);
+ }
+
+ /* Write a local <clusternode> entry to keep the rest of the code happy */
+ objdb->object_create(cluster_parent_handle, &object_handle,
+ "clusternodes", strlen("clusternodes"));
+ objdb->object_create(object_handle, &object_handle,
+ "clusternode", strlen("clusternode"));
+ objdb->object_key_create(object_handle, "name", strlen("name"),
+ nodename, strlen(nodename)+1);
+
+ sprintf(tmp, "%d", node_votes);
+ objdb->object_key_create(object_handle, "votes", strlen("votes"),
+ tmp, strlen(tmp)+1);
+
+ sprintf(tmp, "%d", nodeid);
+ objdb->object_key_create(object_handle, "nodeid", strlen("nodeid"),
+ tmp, strlen(tmp)+1);
+
+ /* Write the default cluster name & ID in here too */
+ objdb->object_key_create(cluster_parent_handle, "name", strlen("name"),
+ cluster_name, strlen(cluster_name)+1);
+
+
+ return 0;
+}
+
+/* Move an object/key tree */
+static int copy_config_tree(struct objdb_iface_ver0 *objdb, unsigned int source_object, unsigned int target_parent_object, int always_create)
+{
+ unsigned int object_handle;
+ unsigned int new_object;
+ unsigned int find_handle;
+ char object_name[1024];
+ int object_name_len;
+ void *key_name;
+ int key_name_len;
+ void *key_value;
+ int key_value_len;
+ int res;
+
+ /* Create new parent object if necessary */
+ objdb->object_name_get(source_object, object_name, &object_name_len);
+
+ objdb->object_find_create(target_parent_object, object_name, strlen(object_name), &find_handle);
+ if (always_create || objdb->object_find_next(find_handle, &object_handle))
+ objdb->object_create(target_parent_object, &new_object, object_name, object_name_len);
+ objdb->object_find_destroy(find_handle);
+
+ /* Copy the keys */
+ objdb->object_key_iter_reset(new_object);
+
+ while (!objdb->object_key_iter(source_object, &key_name, &key_name_len,
+ &key_value, &key_value_len)) {
+
+ objdb->object_key_create(new_object, key_name, key_name_len,
+ key_value, key_value_len);
+ }
+
+ /* Create sub-objects */
+ res = objdb->object_find_create(source_object, NULL, 0, &find_handle);
+ if (res) {
+ sprintf(error_reason, "error resetting object iterator for object %d: %d\n", source_object, res);
+ return -1;
+ }
+
+ while ( (res = objdb->object_find_next(find_handle, &object_handle) == 0)) {
+
+ /* Down we go ... */
+ copy_config_tree(objdb, object_handle, new_object, 0);
+ }
+ objdb->object_find_destroy(find_handle);
+
+ return 0;
+}
+
+/*
+ * Copy trees from /cluster where they live in cluster.conf, into the root
+ * of the config tree where corosync expects to find them.
+ */
+static int copy_tree_to_root(struct objdb_iface_ver0 *objdb, char *name, int always_create)
+{
+ unsigned int find_handle;
+ unsigned int object_handle;
+ int res=0;
+
+ objdb->object_find_create(cluster_parent_handle, name, strlen(name), &find_handle);
+ while (objdb->object_find_next(find_handle, &object_handle) == 0) {
+ res = copy_config_tree(objdb, object_handle, OBJECT_PARENT_HANDLE, always_create);
+ }
+ objdb->object_find_destroy(find_handle);
+
+ return res;
+}
+
+static int get_cman_globals(struct objdb_iface_ver0 *objdb)
+{
+ unsigned int object_handle;
+ unsigned int find_handle;
+
+ objdb_get_string(objdb, cluster_parent_handle, "name", &cluster_name);
+
+ /* Get the <cman> bits that override <totem> bits */
+ objdb->object_find_create(cluster_parent_handle, "cman", strlen("cman"), &find_handle);
+ if (objdb->object_find_next(find_handle, &object_handle) == 0) {
+ if (!portnum)
+ objdb_get_int(objdb, object_handle, "port", &portnum, DEFAULT_PORT);
+
+ if (!key_filename)
+ objdb_get_string(objdb, object_handle, "keyfile", &key_filename);
+
+ if (!cluster_id)
+ objdb_get_int(objdb, object_handle, "cluster_id", &cluster_id, 0);
+
+ if (!cluster_id)
+ cluster_id = generate_cluster_id(cluster_name);
+ }
+ objdb->object_find_destroy(find_handle);
+ return 0;
+}
+
+static int cmanpre_reloadconfig(struct objdb_iface_ver0 *objdb, int flush, char **error_string)
+{
+ int ret = -1;
+ unsigned int object_handle;
+ unsigned int find_handle;
+ unsigned int cluster_parent_handle_new;
+
+ /* don't reload if we've been told to run configless */
+ if (getenv("CMAN_NOCONFIG")) {
+ sprintf(error_reason, "Config not updated because we were run with cman_tool -X");
+ ret = 0;
+ goto err;
+ }
+
+ /* find both /cluster entries */
+ objdb->object_find_create(OBJECT_PARENT_HANDLE, "cluster", strlen("cluster"), &find_handle);
+ objdb->object_find_next(find_handle, &cluster_parent_handle);
+ if (!cluster_parent_handle) {
+ sprintf (error_reason, "%s", "Cannot find old /cluster/ key in configuration\n");
+ goto err;
+ }
+ objdb->object_find_next(find_handle, &cluster_parent_handle_new);
+ if (!cluster_parent_handle_new) {
+ sprintf (error_reason, "%s", "Cannot find new /cluster/ key in configuration\n");
+ goto err;
+ }
+ objdb->object_find_destroy(find_handle);
+
+ /* destroy the old one */
+ objdb->object_destroy(cluster_parent_handle);
+
+ /* update the reference to the new config */
+ cluster_parent_handle = cluster_parent_handle_new;
+
+ /* destroy top level /logging */
+ objdb->object_find_create(OBJECT_PARENT_HANDLE, "logging", strlen("logging"), &find_handle);
+ objdb->object_find_next(find_handle, &object_handle);
+ objdb->object_find_destroy(find_handle);
+ if (object_handle) {
+ objdb->object_destroy(object_handle);
+ }
+
+ /* copy /cluster/logging to /logging */
+ ret = copy_tree_to_root(objdb, "logging", 0);
+
+ /* destroy top level /totem */
+ objdb->object_find_create(OBJECT_PARENT_HANDLE, "totem", strlen("totem"), &find_handle);
+ objdb->object_find_next(find_handle, &object_handle);
+ objdb->object_find_destroy(find_handle);
+ if (object_handle) {
+ objdb->object_destroy(object_handle);
+ }
+
+ /* copy /cluster/totem to /totem */
+ ret = copy_tree_to_root(objdb, "totem", 0);
+
+ return 0;
+
+err:
+ *error_string = error_reason;
+ return ret;
+}
+
+static int cmanpre_readconfig(struct objdb_iface_ver0 *objdb, char **error_string)
+{
+ int ret = 0;
+ unsigned int object_handle;
+ unsigned int find_handle;
+
+ if (getenv("CMAN_PIPE"))
+ startup_pipe = atoi(getenv("CMAN_PIPE"));
+
+ objdb->object_find_create(OBJECT_PARENT_HANDLE, "cluster", strlen("cluster"), &find_handle);
+ objdb->object_find_next(find_handle, &cluster_parent_handle);
+ objdb->object_find_destroy(find_handle);
+ if (!cluster_parent_handle) {
+ objdb->object_create(OBJECT_PARENT_HANDLE, &cluster_parent_handle,
+ "cluster", strlen("cluster"));
+ }
+ else {
+ /* Move these to a place where corosync expects to find them */
+ ret = copy_tree_to_root(objdb, "totem", 0);
+ ret = copy_tree_to_root(objdb, "logging", 0);
+ ret = copy_tree_to_root(objdb, "event", 0);
+ ret = copy_tree_to_root(objdb, "amf", 0);
+ ret = copy_tree_to_root(objdb, "aisexec", 0);
+ ret = copy_tree_to_root(objdb, "service", 1);
+ }
+
+ objdb->object_find_create(cluster_parent_handle, "cman", strlen("cman"), &find_handle);
+ if (objdb->object_find_next(find_handle, &object_handle)) {
+ objdb->object_create(cluster_parent_handle, &object_handle,
+ "cman", strlen("cman"));
+ }
+ objdb->object_find_destroy(find_handle);
+
+ /* This will create /libccs/@next_handle.
+ * next_handle will be atomically incremented by corosync to return ccs_handle down the pipe.
+ * We create it in cman-preconfig to avoid an "init" race in libccs.
+ */
+
+ objdb->object_find_create(OBJECT_PARENT_HANDLE, "libccs", strlen("libccs"), &find_handle);
+ if (objdb->object_find_next(find_handle, &object_handle)) {
+ int next_handle = 0;
+
+ objdb->object_create(OBJECT_PARENT_HANDLE, &object_handle,
+ "libccs", strlen("libccs"));
+
+ objdb->object_key_create(object_handle, "next_handle", strlen("next_handle"),
+ &next_handle, sizeof(int));
+ }
+ objdb->object_find_destroy(find_handle);
+
+ get_env_overrides();
+ if (getenv("CMAN_NOCONFIG"))
+ ret = set_noccs_defaults(objdb);
+ else
+ ret = get_cman_globals(objdb);
+
+ if (!ret) {
+ ret = get_nodename(objdb);
+ add_cman_overrides(objdb);
+ }
+
+ if (!ret) {
+ sprintf (error_reason, "%s", "Successfully parsed cman config\n");
+ }
+ else {
+ if (error_reason[0] == '\0')
+ sprintf (error_reason, "%s", "Error parsing cman config\n");
+ }
+ *error_string = error_reason;
+
+ return ret;
+}
diff --git a/cman/config/cman.h b/cman/config/cman.h
new file mode 100644
index 0000000..40e0b69
--- /dev/null
+++ b/cman/config/cman.h
@@ -0,0 +1,14 @@
+
+/* How we announce ourself in syslog */
+#define CMAN_NAME "CMAN"
+
+#define MAX_CLUSTER_MEMBER_NAME_LEN 255
+
+/* Defaults for configuration variables */
+#define NOCCS_KEY_FILENAME "/etc/cluster/cman_authkey"
+#define DEFAULT_PORT 5405
+#define DEFAULT_CLUSTER_NAME "RHCluster"
+#define DEFAULT_MAX_QUEUED 128
+#define DEFAULT_QUORUMDEV_POLL 10000
+#define DEFAULT_SHUTDOWN_TIMEOUT 5000
+#define DEFAULT_CCSD_POLL 1000
diff --git a/cman/config/nodelist.h b/cman/config/nodelist.h
new file mode 100644
index 0000000..02dfe17
--- /dev/null
+++ b/cman/config/nodelist.h
@@ -0,0 +1,93 @@
+/* These just make the access a little neater */
+static inline int objdb_get_string(OBJDB_API *corosync, unsigned int object_service_handle,
+ char *key, char **value)
+{
+ int res;
+
+ *value = NULL;
+ if ( !(res = corosync->object_key_get(object_service_handle,
+ key,
+ strlen(key),
+ (void *)value,
+ NULL))) {
+ if (*value)
+ return 0;
+ }
+ return -1;
+}
+
+static inline void objdb_get_int(OBJDB_API *corosync, unsigned int object_service_handle,
+ char *key, unsigned int *intvalue, unsigned int default_value)
+{
+ char *value = NULL;
+
+ *intvalue = default_value;
+
+ if (!corosync->object_key_get(object_service_handle, key, strlen(key),
+ (void *)&value, NULL)) {
+ if (value) {
+ *intvalue = atoi(value);
+ }
+ }
+}
+
+
+/* Helper functions for navigating the nodes list */
+static inline unsigned int nodeslist_init(OBJDB_API *corosync,
+ unsigned int cluster_parent_handle,
+ unsigned int *find_handle)
+{
+ unsigned int object_handle;
+ unsigned int find_handle1;
+ unsigned int find_handle2;
+
+ corosync->object_find_create(cluster_parent_handle,"clusternodes", strlen("clusternodes"), &find_handle1);
+ if (corosync->object_find_next(find_handle1, &object_handle) == 0)
+ {
+ unsigned int nodes_handle;
+ corosync->object_find_destroy(find_handle1);
+
+ corosync->object_find_create(object_handle,"clusternode", strlen("clusternode"), &find_handle2);
+
+ if (corosync->object_find_next(find_handle2, &nodes_handle) == 0)
+ {
+ *find_handle = find_handle2;
+ return nodes_handle;
+ }
+ }
+ return 0;
+}
+
+static inline unsigned int nodeslist_next(OBJDB_API *corosync, unsigned int find_handle)
+{
+ unsigned int nodes_handle;
+
+ if (corosync->object_find_next(find_handle, &nodes_handle) == 0)
+ return nodes_handle;
+ else
+ return 0;
+}
+
+static inline unsigned int nodelist_byname(OBJDB_API *corosync,
+ unsigned int cluster_parent_handle,
+ char *name)
+{
+ char *nodename;
+ unsigned int nodes_handle;
+ unsigned int find_handle = 0;
+
+ nodes_handle = nodeslist_init(corosync, cluster_parent_handle, &find_handle);
+ while (nodes_handle) {
+ if (objdb_get_string(corosync, nodes_handle, "name", &nodename)) {
+ nodes_handle = nodeslist_next(corosync, find_handle);
+ continue;
+ }
+ if (strcmp(nodename, name) == 0)
+ return nodes_handle;
+
+ nodes_handle = nodeslist_next(corosync, find_handle);
+ }
+ corosync->object_find_destroy(find_handle);
+
+ return 0;
+}
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-01-07 14:04 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-01-07 14:04 cluster: master - config: ldap convertor should use CS_ codes rather than SA_AIS ones Christine Caulfield
-- strict thread matches above, loose matches on Subject: below --
2009-01-07 13:59 Christine Caulfield
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).