From: rohara@sourceware.org <rohara@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster/cman/cman_tool cman_tool.h main.c
Date: 12 Oct 2007 18:50:48 -0000 [thread overview]
Message-ID: <20071012185048.6389.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL5
Changes by: rohara at sourceware.org 2007-10-12 18:50:48
Modified files:
cman/cman_tool : 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/cman_tool.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.12&r2=1.12.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/cman_tool/main.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.51.2.4&r2=1.51.2.5
--- cluster/cman/cman_tool/cman_tool.h 2006/05/10 14:20:06 1.12
+++ cluster/cman/cman_tool/cman_tool.h 2007/10/12 18:50:48 1.12.2.1
@@ -35,7 +35,6 @@
#include <limits.h>
#include <unistd.h>
-
extern char *prog_name;
#ifndef TRUE
@@ -50,13 +49,21 @@
exit(EXIT_FAILURE); \
} while (0)
-
#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
{
@@ -67,6 +74,7 @@
char *interfaces[MAX_INTERFACES];
char *override_nodename;
char *key_filename;
+ char *format_opts;
int votes;
int expected_votes;
int two_node;
--- cluster/cman/cman_tool/main.c 2007/09/28 13:26:14 1.51.2.4
+++ cluster/cman/cman_tool/main.c 2007/10/12 18:50:48 1.51.2.5
@@ -20,7 +20,7 @@
#include "libcman.h"
#include "cman_tool.h"
-#define OPTION_STRING ("m:n:v:e:2p:c:r:i:N:t:o:k:Vwfqah?d::")
+#define OPTION_STRING ("m:n:v:e:2p:c:r:i:N:t:o:k:F:Vwfqah?d::")
#define OP_JOIN 1
#define OP_LEAVE 2
#define OP_EXPECTED 3
@@ -110,6 +110,8 @@
printf("nodes Show local record of cluster nodes\n");
printf(" -f Also show when node was last fenced\n");
printf(" -a Also show node address(es)\n");
+ printf(" -n <nodename> Only show information for specific node\n");
+ printf(" -F <format> Specify output format (see man page)\n");
printf("\n");
}
@@ -300,13 +302,46 @@
return a->cn_nodeid - b->cn_nodeid;
}
+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(commandline_t *comline)
{
cman_handle_t h;
int count;
int i;
+ int j;
+ int k;
int numnodes;
int dis_count;
+ int format[MAX_FORMAT_OPTS];
cman_node_t *dis_nodes;
cman_node_t *nodes;
struct tm *jtime;
@@ -325,6 +360,16 @@
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));
@@ -333,9 +378,8 @@
dis_nodes = malloc(sizeof(cman_node_t) * count);
if (cman_get_disallowed_nodes(h, count, &dis_count, dis_nodes) == 0) {
- int i,j;
- for (i=0; i<numnodes; i++) {
- for (j=0; j<dis_count; j++) {
+ for (i = 0; i < numnodes; i++) {
+ for (j = 0; j < dis_count; j++) {
if (dis_nodes[j].cn_nodeid == nodes[i].cn_nodeid)
nodes[i].cn_member = 2;
}
@@ -350,10 +394,19 @@
printf(" members list may seem inconsistent across the cluster\n");
}
- printf("Node Sts Inc Joined Name\n");
- for (i=0; i<numnodes; i++) {
+ if (!comline->format_opts) {
+ printf("Node Sts Inc Joined 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';
@@ -375,11 +428,13 @@
else
strcpy(jstring, " ");
- printf("%4d %c %5d %s %s\n",
- nodes[i].cn_nodeid, member_type,
- nodes[i].cn_incarnation, jstring, nodes[i].cn_name);
+ if (!comline->format_opts) {
+ printf("%4d %c %5d %s %s\n",
+ nodes[i].cn_nodeid, member_type,
+ nodes[i].cn_incarnation, jstring, nodes[i].cn_name);
+ }
- if (comline->fence_opt) {
+ if (comline->fence_opt && !comline->format_opts) {
char agent[255];
uint64_t fence_time;
int fenced;
@@ -397,24 +452,56 @@
}
}
- if (comline->addresses_opt)
- {
- int numaddrs;
- struct cman_node_address addrs[MAX_INTERFACES];
+ int numaddrs;
+ struct cman_node_address addrs[MAX_INTERFACES];
+
+ if (comline->addresses_opt || comline->format_opts) {
if (!cman_get_node_addrs(h, nodes[i].cn_nodeid, MAX_INTERFACES, &numaddrs, addrs) &&
numaddrs)
{
- int i;
- printf(" Addresses: ");
- for (i=0; i<numaddrs; i++)
- {
- print_address(addrs[i].cna_address);
+ if (!comline->format_opts) {
+ printf(" Addresses: ");
+ for (i = 0; i < numaddrs; i++)
+ {
+ print_address(addrs[i].cna_address);
+ printf(" ");
+ }
+ printf("\n");
+ }
+ }
+ }
+
+ if (comline->format_opts) {
+ 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:
+ for (k = 0; k < numaddrs; k++) {
+ print_address(addrs[k].cna_address);
+ if (k != (numaddrs - 1)) {
+ printf(",");
+ }
+ }
printf(" ");
+ break;
+ default:
+ break;
}
- printf("\n");
}
+ printf("\n");
}
}
+
free(nodes);
free(dis_nodes);
cman_finish(h);
@@ -701,6 +788,10 @@
comline->clustername_opt = 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__);
reply other threads:[~2007-10-12 18:50 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=20071012185048.6389.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.