All of lore.kernel.org
 help / color / mirror / Atom feed
From: rmccabe@sourceware.org <rmccabe@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga ./clustermon.spec.in.in ricci/modules/cl ...
Date: 9 Oct 2007 19:58:32 -0000	[thread overview]
Message-ID: <20071009195832.11139.qmail@sourceware.org> (raw)

CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	rmccabe at sourceware.org	2007-10-09 19:58:30

Modified files:
	.              : clustermon.spec.in.in 
	ricci/modules/cluster: ClusterStatus.cpp 
	ricci/modules/cluster/clumon/src/cim-provider: Makefile 
	ricci/modules/cluster/clumon/src/common: Cluster.cpp 
	ricci/modules/cluster/clumon/src/daemon: Makefile Monitor.cpp 
	                                         Monitor.h main.cpp 
	ricci/modules/cluster/clumon/src/snmp-agent: Makefile 

Log message:
	use libcman wherever possible instead of fork/exec and parsing stdout

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/clustermon.spec.in.in.diff?cvsroot=cluster&r1=1.32&r2=1.33
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/ClusterStatus.cpp.diff?cvsroot=cluster&r1=1.23&r2=1.24
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/cim-provider/Makefile.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/common/Cluster.cpp.diff?cvsroot=cluster&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/Makefile.diff?cvsroot=cluster&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp.diff?cvsroot=cluster&r1=1.18&r2=1.19
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/Monitor.h.diff?cvsroot=cluster&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/main.cpp.diff?cvsroot=cluster&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/Makefile.diff?cvsroot=cluster&r1=1.6&r2=1.7

--- conga/clustermon.spec.in.in	2007/09/20 05:36:13	1.32
+++ conga/clustermon.spec.in.in	2007/10/09 19:58:29	1.33
@@ -27,6 +27,7 @@
 Source0: %{name}-%{version}.tar.gz
 Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
+BuildRequires: cman-devel
 BuildRequires: glibc-devel gcc-c++ libxml2-devel
 BuildRequires: openssl-devel dbus-devel pam-devel pkgconfig
 BuildRequires: net-snmp-devel tog-pegasus-devel
--- conga/ricci/modules/cluster/ClusterStatus.cpp	2007/09/28 04:47:56	1.23
+++ conga/ricci/modules/cluster/ClusterStatus.cpp	2007/10/09 19:58:29	1.24
@@ -150,7 +150,8 @@
 	{
 		XMLObject s(*iter);
 		if (s.tag() == "service")
-			s.set_attr("vm", (is_service_vm(cluster_conf, s.get_attr("name"))) ? "true" : "false");
+			s.set_attr("vm", (is_service_vm(cluster_conf,
+								s.get_attr("name"))) ? "true" : "false");
 		status_new.add_child(s);
 	}
 	return status_new;
--- conga/ricci/modules/cluster/clumon/src/cim-provider/Makefile	2007/09/18 21:21:52	1.7
+++ conga/ricci/modules/cluster/clumon/src/cim-provider/Makefile	2007/10/09 19:58:30	1.8
@@ -57,7 +57,7 @@
 
 INCLUDE += -I ../include
 CXXFLAGS += $(PEGASUS_CXXFLAGS) -DPARANOIA=$(PARANOID)
-LDFLAGS += -shared -ldl -lcrypt
+LDFLAGS += -shared -ldl -lcrypt -lcman
 
 ifeq ($(PARANOID), 1)
 	LDFLAGS += ${top_srcdir}/common/paranoid/*.o
@@ -88,7 +88,7 @@
 rebuild: clean all
 
 $(TARGET): $(OBJECTS)
-	$(CXX) $(LDFLAGS) -o $@ $(OBJECTS)
+	$(CXX) -o $@ $(OBJECTS) $(LDFLAGS) 
 
 $(TARGET_TEST): clusterCIM_test.*
 	$(CXX) $(CXXFLAGS) -lpegcommon -lpegclient -lpthread -lcrypt -o $@ $@.cpp
--- conga/ricci/modules/cluster/clumon/src/common/Cluster.cpp	2007/09/18 20:16:26	1.8
+++ conga/ricci/modules/cluster/clumon/src/common/Cluster.cpp	2007/10/09 19:58:30	1.9
@@ -24,6 +24,10 @@
 
 #include <stdio.h>
 
+extern "C" {
+#	include <libcman.h>
+}
+
 using namespace std;
 using namespace ClusterMonitoring;
 
@@ -65,6 +69,19 @@
 unsigned int
 Cluster::votes()
 {
+	cman_handle_t ch = cman_init(NULL);
+	if (ch != NULL) {
+		char info[PIPE_BUF];
+		cman_extra_info_t *cman_ei = (cman_extra_info_t *) info;
+		unsigned int total_votes = 0;
+
+		if (cman_get_extra_info(ch, cman_ei, sizeof(info)) == 0)
+			total_votes = cman_ei->ei_total_votes;
+		cman_finish(ch);
+		if (total_votes > 0)
+			return (total_votes);
+	}
+
 	unsigned int votes = 0;
 	for (map<String, counting_auto_ptr<Node> >::iterator
 			iter = _nodes.begin() ;
@@ -81,6 +98,20 @@
 unsigned int
 Cluster::minQuorum()
 {
+	cman_handle_t ch = cman_init(NULL);
+	if (ch != NULL) {
+		char info[PIPE_BUF];
+		cman_extra_info_t *cman_ei = (cman_extra_info_t *) info;
+		int minq = -1;
+
+		if (cman_get_extra_info(ch, cman_ei, sizeof(info)) == 0)
+			minq = cman_ei->ei_quorum;
+		cman_finish(ch);
+
+		if (minq != -1)
+			return minq;
+	}
+
 	if (_minQuorum != 0)
 		return _minQuorum;
 	else {
@@ -101,6 +132,13 @@
 bool
 Cluster::quorate()
 {
+	cman_handle_t ch = cman_init(NULL);
+	if (ch != NULL) {
+		int quorate = cman_is_quorate(ch);
+		cman_finish(ch);
+		return quorate;
+	}
+
 	return votes() >= minQuorum();
 }
 
--- conga/ricci/modules/cluster/clumon/src/daemon/Makefile	2007/09/11 02:42:50	1.8
+++ conga/ricci/modules/cluster/clumon/src/daemon/Makefile	2007/10/09 19:58:30	1.9
@@ -20,7 +20,7 @@
 	Peer.o \
 	Communicator.o
 
-INCLUDE += -I ../include
+INCLUDE += -I../include
 CXXFLAGS += -DPARANOIA=$(PARANOID)
 LDFLAGS += ../common/*.o
 
@@ -30,6 +30,8 @@
 	LDFLAGS += ${top_srcdir}/common/*.o
 endif
 
+LDFLAGS += -lcman
+
 all: ${TARGET}
 
 install:
@@ -49,4 +51,4 @@
 *.o: *.h
 
 $(TARGET): $(OBJECTS)
-	$(CXX) -o $@ $(LDFLAGS) $(OBJECTS)
+	$(CXX) -o $@ $(OBJECTS) $(LDFLAGS)
--- conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp	2007/09/18 20:16:27	1.18
+++ conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp	2007/10/09 19:58:30	1.19
@@ -25,7 +25,6 @@
 #include "Logger.h"
 #include "Time.h"
 #include "utils.h"
-#include "Network.h"
 
 #include <sys/poll.h>
 #include <sys/sysinfo.h>
@@ -54,9 +53,9 @@
 static String cluster_version();
 static String get_cman_tool_path();
 
-Monitor::Monitor(unsigned short port) :
+Monitor::Monitor(unsigned short port, const String& ver) :
 	_comm(port, *this),
-	_cl_version(cluster_version()),
+	_cl_version(ver.size() ? ver : cluster_version()),
 	_cman_tool_path(get_cman_tool_path()),
 	_cman_locking(_cl_version == "5")
 {
@@ -550,44 +549,53 @@
 }
 */
 
-/*
-** FIXME: rewrite this to use libcman.
-*/
 vector<String>
 Monitor::clustered_nodes()
 {
 	vector<String> running;
 
 	if (_cman_locking) {
-		String out, err;
-		int status;
-		vector<String> args;
-		args.push_back("nodes");
-
-		if (execute(_cman_tool_path, args, out, err, status, EXECUTE_TIMEOUT))
-			throw String("clustered_nodes(): missing cman_tool");
-		if (status)
-			return vector<String>();
+		int ret_nodes = -1;
+		int ret;
+		cman_node_t *node_array;
+
+		cman_handle_t ch = cman_init(NULL);
+		if (ch == NULL)
+			throw String("Unable to communicate with cman");
+
+		ret = cman_get_node_count(ch);
+		if (ret <= 0) {
+			cman_finish(ch);
+			throw String("Unable to communicate with cman");
+		}
+	
+		node_array = (cman_node_t *) malloc(sizeof(*node_array) * ret);
+		if (node_array == NULL) {
+			cman_finish(ch);
+			throw String("Out of memory");
+		}
+
+		if (cman_get_nodes(ch, ret, &ret_nodes, node_array) != 0) {
+			cman_finish(ch);
+			free(node_array);
+			throw String("Unable to communicate with cman");
+		}
+		cman_finish(ch);
 
-		vector<String>::size_type Sts_idx = 0;
-		vector<String> lines = utils::split(out, "\n");
-		for (vector<String>::iterator
-				iter = lines.begin() ;
-				iter != lines.end() ;
-				iter++)
-		{
-			vector<String> words = utils::split(utils::strip(*iter));
-			if (words.size() < Sts_idx+1)
-				continue;
-			if (words[0] == "Node") {
-				// update Sts_idx
-				for (vector<String>::size_type i = 0 ; i < words.size() ; i++) {
-					if (words[i] == "Sts")
-						Sts_idx = i;
+		try {
+			for (int i = 0 ; i < ret_nodes ; i++) {
+				if (node_array[i].cn_nodeid == 0) {
+					/* qdisk */;
+					continue;
 				}
-			} else if (words[Sts_idx] == "M")
-				running.push_back(words.back());
+				if (node_array[i].cn_member)
+					running.push_back(String(node_array[i].cn_name));
+			}
+		} catch (...) {
+			free(node_array);
+			throw;
 		}
+		free(node_array);
 	} else if (_cl_version == "4") {
 		String out, err;
 		int status;
@@ -625,61 +633,56 @@
 String
 Monitor::nodename(const vector<String>& nodenames)
 {
-	if (_cman_locking) {
-		String out, err;
-		int status;
-
-		vector<String> args(1, "status");
-		if (execute(_cman_tool_path, args, out, err, status, EXECUTE_TIMEOUT))
-			throw String("nodename(): missing ") + _cman_tool_path;
-
-		if (status) {
-			// cman not running, match using address
-			out.clear();
-		}
+	struct ifaddrs *if_list = NULL;
+	struct addrinfo hints;
 
-		vector<String> lines = utils::split(utils::strip(out), "\n");
-		for (vector<String>::const_iterator
-				iter = lines.begin() ;
-				iter != lines.end() ;
-				iter++)
-		{
-			vector<String> words = utils::split(utils::strip(*iter));
-			if (words.size() != 3)
-				continue;
-
-			if (words[0] + " " + words[1] == "Node name:")
-				return words[2];
+	if (_cman_locking) {
+		cman_handle_t ch = cman_init(NULL);
+		if (ch != NULL) {
+			cman_node_t this_node;
+			if (cman_get_node(ch, CMAN_NODEID_US, &this_node) == 0) {
+				cman_finish(ch);
+				return String(this_node.cn_name);
+			}
+			cman_finish(ch);
 		}
 	}
 
-	/* FIXME: REWRITE THIS. */
-	String out, err;
-	int status;
-	if (execute("/sbin/ifconfig", vector<String>(), out, err,
-		status, EXECUTE_TIMEOUT))
-	{
-		throw String("nodename(): missing ifconfig");
-	}
-	if (status)
-		throw String("nodename(): ifconfig failed");
+	if (getifaddrs(&if_list) != 0) 
+		throw ("Unable to determine local node name");
+
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_family = AF_INET;
 
 	for (vector<String>::const_iterator
 			iter = nodenames.begin() ;
 			iter != nodenames.end() ;
 			iter++)
 	{
-		const String& nodename = *iter;
-		vector<String> ips = Network::name2IP(nodename);
-		for (vector<String>::iterator
-				iter_ip = ips.begin() ;
-				iter_ip != ips.end() ;
-				iter_ip++)
-		{
-			if (out.find(*iter_ip) != out.npos)
-				return nodename;
+		struct addrinfo *res;
+		if (getaddrinfo(iter->c_str(), NULL, &hints, &res) == 0) {
+			struct addrinfo *ai;
+			for (ai = res ; ai != NULL ; ai = ai->ai_next) {
+				struct ifaddrs *cur;
+
+				for (cur = if_list ; cur != NULL ; cur = cur->ifa_next) {
+					if (!cur->ifa_addr || !(cur->ifa_flags & IFF_UP))
+						continue;
+					if (cur->ifa_flags & IFF_LOOPBACK)
+						continue;
+					if (cur->ifa_addr->sa_family != AF_INET)
+						continue;
+					if (!memcmp(cur->ifa_addr, ai->ai_addr, ai->ai_addrlen)) {
+						freeaddrinfo(res);
+						freeifaddrs(if_list);
+						return *iter;
+					}
+				}
+			}
+			freeaddrinfo(res);
 		}
 	}
+	freeifaddrs(if_list);
 
 	return "";
 }
@@ -802,31 +805,24 @@
 }
 
 String
-Monitor::probe_quorum() const
+Monitor::probe_quorum()
 {
 	if (_cman_locking) {
-		int status;
-		String out, err;
-		vector<String> args;
-
-		args.push_back("status");
-		if (execute(_cman_tool_path, args, out, err, status, EXECUTE_TIMEOUT))
-			throw _cman_tool_path + " status failed";
-		if (status)
-			throw _cman_tool_path + " status failed";
+		String ret;
 
-		vector<String> lines = utils::split(out, "\n");
-		for (vector<String>::const_iterator
-			iter = lines.begin() ;
-			iter != lines.end() ;
-			iter++)
-		{
-			vector<String> words = utils::split(*iter);
-			if (words.size() < 2)
-				continue;
-			if (words[0] == "Quorum:")
-				return words[1];
+		cman_handle_t ch = cman_init(NULL);
+		if (ch == NULL) {
+			cman_finish(ch);
+			throw String("quorum not found");
 		}
+
+		if (cman_is_quorate(ch))
+			ret = "Quorate";
+		else
+			ret = "Not Quorate";
+
+		cman_finish(ch);
+		return ret;
 	} else {
 		// TODO: implement quorum detection on GULM clusters
 		throw String("GULM quorum detection not yet implemented");
@@ -837,6 +833,32 @@
 String
 cluster_version()
 {
+	cman_handle_t ch = cman_init(NULL);
+
+	if (ch != NULL) {
+		int ret;
+		cman_version_t cman_version;
+		char *clu_version = "";
+
+	    ret = cman_get_version(ch, &cman_version);
+		if (ret >= 0) {
+			if (cman_version.cv_major == 6)
+				clu_version = "5";
+			else if (cman_version.cv_major == 5)
+				clu_version = "4";
+			else {
+				char version[32];
+				snprintf(version, sizeof(version), "%d.%d.%d",
+					cman_version.cv_major, cman_version.cv_minor,
+					cman_version.cv_patch);
+				cman_finish(ch);
+				throw "unsupported cluster version: " + String(version);
+			}
+		}
+		cman_finish(ch);
+		return (clu_version);
+	}
+
 	int status;
 	String out, err;
 	vector<String> args;
--- conga/ricci/modules/cluster/clumon/src/daemon/Monitor.h	2007/09/18 20:16:27	1.8
+++ conga/ricci/modules/cluster/clumon/src/daemon/Monitor.h	2007/10/09 19:58:30	1.9
@@ -35,11 +35,19 @@
 namespace ClusterMonitoring
 {
 
+extern "C" {
+#	include <sys/socket.h>
+#	include <netdb.h>
+#	include <arpa/inet.h>
+#	include <net/if.h>
+#	include <ifaddrs.h>
+#	include <libcman.h>
+}
 
 class Monitor : public Thread, public CommDP
 {
 	public:
-		Monitor(unsigned short port);
+		Monitor(unsigned short port, const String& cluster_version);
 		virtual ~Monitor();
 
 		String request(const String&);
@@ -74,12 +82,12 @@
 		XMLObject parse_cluster_conf();
 		//bool clustered();
 		//bool quorate();
+		String probe_quorum();
 		String nodename(const std::vector<String>& nodenames);
 		std::vector<String> clustered_nodes();
 		std::vector<XMLObject> services_info();
 
 		String uptime() const;
-		String probe_quorum() const;
 };
 
 
--- conga/ricci/modules/cluster/clumon/src/daemon/main.cpp	2007/09/26 21:35:20	1.8
+++ conga/ricci/modules/cluster/clumon/src/daemon/main.cpp	2007/10/09 19:58:30	1.9
@@ -27,6 +27,8 @@
 
 #include <sys/poll.h>
 #include <errno.h>
+#include <libcman.h>
+
 typedef struct pollfd poll_fd;
 
 extern "C" {
@@ -71,9 +73,20 @@
 	bool debug = false, foreground = false;
 	int v_level = -1;
 	int rv;
+	String clu_version("");
 
-	while ((rv = getopt(argc, argv, "fdv:")) != EOF) {
+	while ((rv = getopt(argc, argv, "c:fdv:")) != EOF) {
 		switch (rv) {
+			case 'c': {
+				char *p;
+				long cv = strtol(optarg, &p, 10);
+				if (*p != '\0' || cv < 3 || cv > 5) {
+					fprintf(stderr, "Invalid cluster version: %s\n", optarg);
+					exit(-1);
+				}
+				clu_version = String(optarg);
+			}
+
 			case 'd':
 				debug = true;
 				break;
@@ -112,7 +125,8 @@
 	try {
 		ServerSocket server(MONITORING_CLIENT_SOCKET);
 		server.nonblocking(true);
-		Monitor monitor(COMMUNICATION_PORT);
+
+		Monitor monitor(COMMUNICATION_PORT, clu_version);
 
 		if (!foreground && (geteuid() == 0))
 			daemon_init(argv[0]);
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/Makefile	2007/09/11 02:42:50	1.6
+++ conga/ricci/modules/cluster/clumon/src/snmp-agent/Makefile	2007/10/09 19:58:30	1.7
@@ -27,6 +27,8 @@
 	LDFLAGS += ${top_srcdir}/common/*.o
 endif
 
+LDFLAGS += -lcman
+
 OBJECTS = clusterMonitorSnmp.o \
 	clusterMIB.o \
 	nodesMIB.o \



             reply	other threads:[~2007-10-09 19:58 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-09 19:58 rmccabe [this message]
  -- strict thread matches above, loose matches on Subject: below --
2008-03-31 17:23 [Cluster-devel] conga ./clustermon.spec.in.in ricci/modules/cl rmccabe
2008-03-24 18:13 rmccabe
2007-11-02  5:44 rmccabe
2006-12-13 19:14 kupcevic

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20071009195832.11139.qmail@sourceware.org \
    --to=rmccabe@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.