cluster: master - config: Add cman-mkconf

Christine Caulfield chrissie@fedoraproject.org
Thu Feb 5 15:34:00 GMT 2009


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=71fd5650faa08a94aed6f2824b231e1d05b4b883
Commit:        71fd5650faa08a94aed6f2824b231e1d05b4b883
Parent:        c469ea22e6170760ca74a77f61bd2f6b13e90e92
Author:        Christine Caulfield <christine@christine-ubuntu.(none)>
AuthorDate:    Thu Feb 5 15:30:28 2009 +0000
Committer:     Christine Caulfield <christine@christine-ubuntu.(none)>
CommitterDate: Thu Feb 5 15:30:28 2009 +0000

config: Add cman-mkconf

cman-mkconf is a little program to generate very basic cluster.conf
file from a running system.

Signed-off-by: Christine Caulfield <christine@christine-ubuntu.(none)>
---
 config/tools/Makefile        |    2 +-
 config/tools/mkconf/Makefile |   27 ++++++
 config/tools/mkconf/mkconf.c |  211 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 239 insertions(+), 1 deletions(-)

diff --git a/config/tools/Makefile b/config/tools/Makefile
index 04cc742..8feab10 100644
--- a/config/tools/Makefile
+++ b/config/tools/Makefile
@@ -1,4 +1,4 @@
 include ../../make/defines.mk
 include $(OBJDIR)/make/passthrough.mk
 
-SUBDIRS=ccs_tool ldap man
+SUBDIRS=ccs_tool ldap mkconf man
diff --git a/config/tools/mkconf/Makefile b/config/tools/mkconf/Makefile
new file mode 100644
index 0000000..4741c31
--- /dev/null
+++ b/config/tools/mkconf/Makefile
@@ -0,0 +1,27 @@
+TARGET= cman-mkconf
+
+SBINDIRT=$(TARGET)
+
+all: ${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
+
+OBJS=	mkconf.o
+
+CFLAGS += -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
+CFLAGS += -I${corosyncincdir}
+CFLAGS += -I${incdir}
+
+LDFLAGS += -L${corosynclibdir} -lconfdb -lquorum -lcfg -lccs
+LDFLAGS += -L${libdir}
+
+${TARGET}: ${OBJS}
+	$(CC) -o $@ $^ $(LDFLAGS)
+
+clean: generalclean
+
+-include $(OBJS:.o=.d)
diff --git a/config/tools/mkconf/mkconf.c b/config/tools/mkconf/mkconf.c
new file mode 100644
index 0000000..a4cc71b
--- /dev/null
+++ b/config/tools/mkconf/mkconf.c
@@ -0,0 +1,211 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <netdb.h>
+#include <errno.h>
+
+#include <corosync/corotypes.h>
+#include <corosync/quorum.h>
+#include <corosync/confdb.h>
+#include <corosync/cfg.h>
+#include <ccs.h>
+
+struct node_info {
+	uint32_t nodeid;
+	char name[256];
+};
+
+static uint32_t node_list_size;
+static struct node_info *node_list;
+
+
+static char *node_name(corosync_cfg_node_address_t *addr)
+{
+	static char name[256];
+
+	if (getnameinfo((struct sockaddr *)addr->address, addr->address_length, name, sizeof(name),
+			NULL, 0, NI_NAMEREQD))
+		return NULL;
+	else
+		return name;
+}
+
+static void quorum_notification_callback(
+	quorum_handle_t handle,
+        uint32_t quorate,
+        uint64_t ring_seq,
+	uint32_t view_list_entries,
+	uint32_t *view_list)
+{
+	int i;
+
+	node_list = malloc(sizeof(struct node_info) * view_list_entries);
+	if (node_list) {
+		for (i=0; i<view_list_entries; i++) {
+			node_list[i].nodeid = view_list[i];
+		}
+		node_list_size = view_list_entries;
+	}
+}
+
+
+static int refresh_node_list(void)
+{
+	int error;
+	int i;
+	quorum_handle_t quorum_handle;
+	corosync_cfg_handle_t cfg_handle;
+	quorum_callbacks_t quorum_callbacks = {.quorum_notify_fn = quorum_notification_callback};
+	int max_addrs = 4;
+	corosync_cfg_node_address_t addrs[max_addrs];
+	int num_addrs;
+	char *name = NULL;
+
+	if (quorum_initialize(&quorum_handle, &quorum_callbacks) != CS_OK) {
+		errno = ENOMEM;
+		return -1;
+	}
+	if (corosync_cfg_initialize(&cfg_handle, NULL) != CS_OK) {
+		quorum_finalize(quorum_handle);
+		errno = ENOMEM;
+		return -1;
+	}
+
+	quorum_trackstart(quorum_handle, CS_TRACK_CURRENT);
+
+	error = quorum_dispatch(quorum_handle, CS_DISPATCH_ONE);
+	if (error != CS_OK)
+		return -1;
+
+	quorum_finalize(quorum_handle);
+
+	for (i=0; i < node_list_size; i++) {
+
+
+		error = corosync_cfg_get_node_addrs(cfg_handle, node_list[i].nodeid, max_addrs, &num_addrs, addrs);
+		if (error == CS_OK) {
+			name = node_name(&addrs[0]);
+		}
+		if (name) {
+			sprintf(node_list[i].name, "%s", name);
+		}
+		else {
+			sprintf(node_list[i].name, "Node-%x", node_list[i].nodeid);
+		}
+
+	}
+	corosync_cfg_finalize(cfg_handle);
+	return 0;
+}
+
+static void usage(char *prog)
+{
+	printf("Usage:\n\n");
+	printf("  %s [options]\n", prog);
+	printf("\n");
+
+	printf("    -N          Generate sequential nodeids\n");
+	printf("    -n <name>   Use this cluster name\n");
+	printf("    -i          Use IP Addresses rather than resolved node names\n");
+	printf("    -f <name>   Fence agent name (default: 'default')\n");
+	printf("    -F <name>   Fence agent parameter name (default: 'ipaddr'\n");
+	printf("    -v <num>    Config version number (default: 0)\n");
+
+	printf("\n");
+
+	printf("NOTE: It is stringly recommended that the existing cluster is shut down\n");
+	printf("      completely before restarting any nodes using the generated file\n");
+
+	printf("\n");
+}
+
+int main(int argc, char *argv[])
+{
+	unsigned int ccs_handle;
+	char *value;
+	int optchar;
+	int nodeid = 0;
+	int i;
+
+	int seq_nodeids=0;
+	int use_ip_addrs=0;
+	int config_version = 0;
+	char *cluster_name = NULL;
+	char *fence_type = "default";
+	char *fence_param = "ipaddr";
+
+	/* Parse options... */
+	do {
+		optchar = getopt(argc, argv, "?hNn:if:F:v:");
+		switch (optchar) {
+		case 'N':
+			seq_nodeids=1;
+			break;
+		case 'n':
+			cluster_name = strdup(optarg);
+			break;
+		case 'i':
+			use_ip_addrs=1;
+			break;
+		case 'f':
+			fence_type = strdup(optarg);
+			break;
+		case 'F':
+			fence_param = strdup(optarg);
+			break;
+		case 'v':
+			config_version = atoi(optarg);
+			break;
+		case '?':
+		case 'h':
+			usage(argv[0]);
+			exit(0);
+		case EOF:
+			break;
+
+		}
+	} while (optchar != EOF);
+
+
+	/* Get the list of nodes and names */
+	if (refresh_node_list()){
+		fprintf(stderr, "Unable to get node information from corosync\n");
+		return 1;
+	}
+
+	ccs_handle = ccs_connect();
+
+	if (!cluster_name) {
+		if (!ccs_get(ccs_handle, "/cluster/@name", &value)) {
+			cluster_name = strdup(value);
+			free(value);
+		}
+	}
+
+	/* TODO more ccs keys as a filled in by NOCONFIG ... */
+
+	/* Print config file header */
+	printf("<?xml version=\"1.0\" ?>\n");
+	printf("<cluster name=\"%s\" config_version=\"0\">\n", cluster_name);
+	printf("  <clusternodes>\n");
+	for (i=0; i<node_list_size; i++) {
+		printf("    <clusternode name=\"%s\" nodeid=\"%u\">\n", node_list[i].name,
+		       seq_nodeids?++nodeid:node_list[i].nodeid);
+		printf("      <fence>\n");
+		printf("        <method name=\"single\">\n");
+		printf("          <device name=\"%s\" %s=\"%s\"/>\n", fence_type, fence_param,node_list[i].name);
+		printf("        </method>\n");
+		printf("      </fence>\n");
+		printf("    </clusternode>\n");
+		printf("\n");
+	}
+	printf("  </clusternodes>\n");
+
+	printf("</cluster>\n");
+
+	ccs_disconnect(ccs_handle);
+	return 0;
+}



More information about the Cluster-cvs mailing list