From: rohara@sourceware.org <rohara@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster/cman/cman_tool Makefile cman_tool.h main.c
Date: 12 Oct 2007 18:10:13 -0000 [thread overview]
Message-ID: <20071012181013.21730.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL4
Changes by: rohara at sourceware.org 2007-10-12 18:10:12
Modified files:
cman/cman_tool : Makefile cman_tool.h main.c
Log message:
Add ability to format output and filter based on node name.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/cman_tool/Makefile.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.4.2.1&r2=1.4.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/cman_tool/cman_tool.h.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.3.2.5&r2=1.3.2.6
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/cman_tool/main.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.12.2.9&r2=1.12.2.10
--- cluster/cman/cman_tool/Makefile 2005/03/08 16:42:49 1.4.2.1
+++ cluster/cman/cman_tool/Makefile 2007/10/12 18:10:12 1.4.2.2
@@ -37,7 +37,7 @@
cp ${TARGET} ${top_srcdir}/bin
cman_tool: main.o join.o join_ccs.o
- $(CC) $(LDFLAGS) -L$(libdir) -o $@ $^ -lccs
+ $(CC) $(LDFLAGS) -L$(libdir) -o $@ $^ -lccs -lcman
main.o: main.c cman_tool.h
$(CC) $(CFLAGS) -c -o $@ $<
--- cluster/cman/cman_tool/cman_tool.h 2006/12/18 13:37:55 1.3.2.5
+++ cluster/cman/cman_tool/cman_tool.h 2007/10/12 18:10:12 1.3.2.6
@@ -35,7 +35,6 @@
#include <limits.h>
#include <unistd.h>
-
extern char *prog_name;
#ifndef TRUE
@@ -50,14 +49,22 @@
exit(EXIT_FAILURE); \
} while (0)
-
#define DEFAULT_PORT 6809
#define DEFAULT_VOTES 1
#define MAX_INTERFACES 10
+#define MAX_FORMAT_OPTS 10
#define MAX_NODE_NAME_LEN 65
#define MAX_MCAST_NAME_LEN 256
#define MAX_PATH_LEN 256
+enum format_opt
+{
+ FMT_NONE,
+ FMT_ID,
+ FMT_NAME,
+ FMT_TYPE,
+ FMT_ADDR,
+};
struct commandline
{
@@ -68,6 +75,7 @@
char *multicast_names[MAX_INTERFACES];
char *nodenames[MAX_INTERFACES];
char *interfaces[MAX_INTERFACES];
+ char *format_opts;
int votes;
int expected_votes;
int two_node;
--- cluster/cman/cman_tool/main.c 2006/07/10 13:15:56 1.12.2.9
+++ cluster/cman/cman_tool/main.c 2007/10/12 18:10:12 1.12.2.10
@@ -14,11 +14,14 @@
#include <inttypes.h>
#include <unistd.h>
#include <signal.h>
+#include <time.h>
+#include <netinet/in.h>
#include "copyright.cf"
#include "cnxman-socket.h"
+#include "libcman.h"
#include "cman_tool.h"
-#define OPTION_STRING ("m:n:v:e:2p:c:r:i:N:t:XVwqh?d")
+#define OPTION_STRING ("m:n:v:e:2p:c:r:i:N:t:XF:Vwqh?d")
#define OP_JOIN 1
#define OP_LEAVE 2
#define OP_EXPECTED 3
@@ -88,6 +91,8 @@
printf("status Show local record of cluster status\n");
printf("\n");
printf("nodes Show local record of cluster nodes\n");
+ printf(" -n <nodename> Only show information for specific node\n");
+ printf(" -F <format> Specify output format (see man page)\n");
printf("\n");
printf("services Show local record of cluster services\n");
@@ -133,6 +138,128 @@
show_file("/proc/cluster/services");
}
+static int node_filter(commandline_t *comline, const char *node)
+{
+ int i;
+
+ for (i = 0; i < comline->num_nodenames; i++) {
+ if (strcmp(comline->nodenames[i], node) == 0) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static int get_format_opt(const char *opt)
+{
+ if (!opt)
+ return FMT_NONE;
+
+ if (!strcmp(opt, "id"))
+ return FMT_ID;
+ if (!strcmp(opt, "name"))
+ return FMT_NAME;
+ if (!strcmp(opt, "type"))
+ return FMT_TYPE;
+ if (!strcmp(opt, "addr"))
+ return FMT_ADDR;
+
+ return FMT_NONE;
+}
+
+static void show_nodes_opt(commandline_t *comline)
+{
+ cman_handle_t h;
+ int count;
+ int i;
+ int j;
+ int numnodes;
+ int format[MAX_FORMAT_OPTS];
+ cman_node_t *nodes;
+
+ h = cman_init(NULL);
+
+ count = cman_get_node_count(h);
+ if (count < 0)
+ die("cman_get_node_count failed: %s", cman_error(errno));
+
+ count += 2;
+
+ nodes = malloc(sizeof(cman_node_t) * count);
+ if (!nodes)
+ die("cannot allocate memory for nodes list\n");
+
+ if (comline->format_opts != NULL) {
+ char *format_str = comline->format_opts;
+ char *format_tmp;
+ for (i = 0; i < MAX_FORMAT_OPTS; i++) {
+ format_tmp = strtok(format_str, ",");
+ format_str = NULL;
+ format[i] = get_format_opt(format_tmp);
+ }
+ }
+
+ if (cman_get_nodes(h, count, &numnodes, nodes) < 0)
+ die("cman_get_nodes failed: %s", cman_error(errno));
+
+ if (!comline->format_opts) {
+ printf("Node Sts Inc Name\n");
+ }
+
+ for (i = 0; i < numnodes; i++) {
+ char member_type;
+
+ if (comline->num_nodenames > 0) {
+ if (node_filter(comline, nodes[i].cn_name) == 0) {
+ continue;
+ }
+ }
+
+ switch (nodes[i].cn_member) {
+ case 0:
+ member_type = 'X';
+ break;
+ case 1:
+ member_type = 'M';
+ break;
+ default:
+ member_type = '?';
+ break;
+ }
+
+ if (!comline->format_opts) {
+ printf("%4d %c %5d %s\n",
+ nodes[i].cn_nodeid, member_type,
+ nodes[i].cn_incarnation, nodes[i].cn_name);
+ } else {
+ for (j = 0; j < MAX_FORMAT_OPTS; j++) {
+ switch (format[j]) {
+ case FMT_NONE:
+ break;
+ case FMT_ID:
+ printf("%d ", nodes[i].cn_nodeid);
+ break;
+ case FMT_NAME:
+ printf("%s ", nodes[i].cn_name);
+ break;
+ case FMT_TYPE:
+ printf("%c ", member_type);
+ break;
+ case FMT_ADDR:
+ break;
+ default:
+ break;
+ }
+ }
+ printf("\n");
+ }
+ }
+
+ free(nodes);
+ cman_finish(h);
+}
+
static int open_cluster_socket()
{
int cluster_sock;
@@ -444,6 +571,10 @@
comline->no_ccs = TRUE;
break;
+ case 'F':
+ comline->format_opts = strdup(optarg);
+ break;
+
case 'V':
printf("cman_tool %s (built %s %s)\n",
CMAN_RELEASE_NAME, __DATE__, __TIME__);
@@ -678,7 +809,13 @@
break;
case OP_NODES:
- show_nodes();
+ if ((comline.num_nodenames != 0) ||
+ (comline.format_opts != NULL))
+ {
+ show_nodes_opt(&comline);
+ } else {
+ show_nodes();
+ }
break;
case OP_SERVICES:
reply other threads:[~2007-10-12 18:10 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=20071012181013.21730.qmail@sourceware.org \
--to=rohara@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.