fence-agents: master - fence_rps10: Removed RPS-10 agent

Jan Friesse honzaf@fedoraproject.org
Thu Mar 5 13:19:00 GMT 2009


Gitweb:        http://git.fedorahosted.org/git/fence-agents.git?p=fence-agents.git;a=commitdiff;h=aa905c0bf7a717648b44069e4a192f7afe0cda61
Commit:        aa905c0bf7a717648b44069e4a192f7afe0cda61
Parent:        21a0c39b079dd529c75267b2cf465305b0471c7b
Author:        Jan Friesse <jfriesse@redhat.com>
AuthorDate:    Thu Mar 5 14:17:50 2009 +0100
Committer:     Jan Friesse <jfriesse@redhat.com>
CommitterDate: Thu Mar 5 14:17:50 2009 +0100

fence_rps10: Removed RPS-10 agent

WTI RPS-10 was serial port communication based PDU.
It was able serve for only 2 nodes cluster and
WTI don't longer sell it.

So rest in piece RPS-10.
---
 fence/agents/rps10/Makefile |   26 ---
 fence/agents/rps10/rps10.c  |  521 -------------------------------------------
 2 files changed, 0 insertions(+), 547 deletions(-)

diff --git a/fence/agents/rps10/Makefile b/fence/agents/rps10/Makefile
deleted file mode 100644
index dd69478..0000000
--- a/fence/agents/rps10/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-TARGET= fence_rps10
-
-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
-
-TARGET= fence_rps10
-
-OBJS=	rps10.o
-
-CFLAGS += -I${incdir}
-
-LDFLAGS += -L${libdir}
-
-${TARGET}: ${OBJS}
-	$(CC) -o $@ $^ $(LDFLAGS)
-
-clean: generalclean
-
--include $(OBJS:.o=.d)
diff --git a/fence/agents/rps10/rps10.c b/fence/agents/rps10/rps10.c
deleted file mode 100644
index dea02d8..0000000
--- a/fence/agents/rps10/rps10.c
+++ /dev/null
@@ -1,521 +0,0 @@
-/** @file
- * Fencing agent for WTI RPS-10 (serial) power devices.  Based on
- * the fence_apc agent from linux-cluster, and the prb utility (which
- * controls RPS-10s and PRB-5 rev 1 remote power switches).
- *
- * Only works in 2-node clusters because of the requirement that each node
- * be able to fence each other node.  This driver does not support using the
- * 'all ports' directive; cluster machines with multiple power supplies will
- * need to have their configuration updated accordingly if they are upgrading
- * from clumanager 1.0.x or 1.2.x.
- */
-#include <stdio.h>
-#include <termios.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/select.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <libgen.h>
-#include "copyright.cf"
-
-/*
- * Salt to taste.
- */
-#define DEFAULT_DEVICE "/dev/ttyS0"
-#define DEFAULT_SPEED  B9600
-#define RPS10_CMD_STR   "\x02\x18\x18\x02\x18\x18%d%c\r"
-
-
-/**
-  Open a serial port and lock it.
- */
-int
-open_port(char *file, int speed)
-{
-	struct termios  ti;
-	int fd;
-	struct flock lock;
-
-	if ((fd = open(file, O_RDWR | O_EXCL)) == -1) {
-		perror("open");
-		return -1;
-	}
-
-	memset(&lock,0,sizeof(lock));
-	lock.l_type = F_WRLCK;
-	if (fcntl(fd, F_SETLK, &lock) == -1) {
-		perror("Failed to lock serial port");
-		close(fd);
-		return -1;
-	}
-		
-	memset(&ti, 0, sizeof(ti));
-	ti.c_cflag = (speed | CLOCAL | CRTSCTS | CREAD | CS8);
-
-	if (tcsetattr(fd, TCSANOW, &ti) < 0) {
-		perror("tcsetattr");
-		close(fd);
-		return -1;
-	}                             
-
-	tcflush(fd, TCIOFLUSH);
-
-	return fd;
-}
-
-
-/**
-  Toggle data terminal ready (basically, hangup).  This will cause the RPS-10
-  to print a "RPS-10 Ready" message.
- */
-void
-hangup(int fd, int delay)
-{
-	unsigned int bits;
-
-	if (ioctl(fd, TIOCMGET, &bits)) {
-		perror("ioctl1");
-		return;
-	}
-
-	bits &= ~(TIOCM_DTR | TIOCM_CTS | TIOCM_RTS | TIOCM_DSR | TIOCM_CD);
-
-	if (ioctl(fd, TIOCMSET, &bits)) {
-		perror("ioctl2");
-		return;
-	}
-	
-	usleep(delay);
-
-	bits |= (TIOCM_DTR | TIOCM_CTS | TIOCM_RTS | TIOCM_DSR | TIOCM_CD);
-
-	if (ioctl(fd, TIOCMSET, &bits)) {
-		perror("ioctl3");
-		return;
-	}
-}
-
-
-int
-char_to_speed(char *speed)
-{
-	if (!strcmp(speed, "300"))
-		return B300;
-	if (!strcmp(speed, "1200"))
-		return B1200;
-	if (!strcmp(speed, "2400"))
-		return B2400;
-	if (!strcmp(speed, "9600"))
-		return B9600;
-	return -1;
-}
-
-
-void
-usage_exit(char *pname)
-{
-printf("usage: %s <options>\n", pname);
-printf("   -n <#>         Specify RPS-10 port number <#>.  Default=0\n"
-       "                  Valid ports: 0-9\n");
-printf("   -d <device>    Use serial device <dev>.  Default=%s\n",
-       DEFAULT_DEVICE);
-printf("   -s <speed>     Use speed <speed>. Default=9600\n"
-       "                  Valid speeds: 300, 1200, 2400, 9600\n");
-printf("   -o <op>        Operation to perform.\n");
-printf("                  Valid operations: on, off, [reboot]\n");
-printf("   -V             Print version and exit\n");
-printf("   -v             Verbose mode\n\n");
-printf("If no options are specified, the following options will be read\n");
-printf("from standard input (one per line):\n\n");
-printf("   port=<#>       Same as -n\n");
-printf("   device=<dev>   Same as -d\n");
-printf("   speed=<speed>  Same as -s\n");
-printf("   option=<op>    Same as -o\n");
-printf("   operation=<op> Same as -o\n");
-printf("   action=<op>    Same as -o\n");
-printf("   verbose        Same as -v\n\n");
-	exit(1);
-}
-
-
-/**
-  Perform an operation on an RPS-10.
- */
-int
-rps10_port_op(int fd, int port, char cmd)
-{
-	char buf[30];
-
-	snprintf(buf, sizeof(buf), RPS10_CMD_STR, port, cmd);
-	if (write(fd, buf, strlen(buf)) != strlen(buf))
-		return -1;
-
-	return 0;
-}
-
-
-/**
-  Toggle = ^B^X^X^B^X^X<port>T^M
- */
-int
-rps10_toggle_port(int fd, int port)
-{
-	return rps10_port_op(fd, port, 'T');
-}
-
-
-/**
-  Power-off = ^B^X^X^B^X^X<port>0^M
- */
-int
-rps10_port_off(int fd, int port)
-{
-	return rps10_port_op(fd, port, '0');
-}
-
-
-/**
-  Power-on = ^B^X^X^B^X^X<port>1^M
- */
-int
-rps10_port_on(int fd, int port)
-{
-	return rps10_port_op(fd, port, '1');
-}
-
-
-/**
-  Super-simple expect code.
- */
-int
-wait_for(int fd, char *what, int timeout)
-{
-	char *wp, *wend, c;
-	struct timeval tv;
-	fd_set rfds;
-	int l;
-       
-	if (!what)
-		return -1;
-
-	l = strlen(what);
-
-	if (!l)
-		return -1;
-
-	tv.tv_sec = timeout;
-	tv.tv_usec = 0;
-
-	wp = what;
-	wend = what + l;
-
-	while (wp != wend) {
-		FD_ZERO(&rfds);
-		FD_SET(fd, &rfds);
-
-		switch(select(fd+1, &rfds, NULL, NULL, &tv)) {
-		case -1:
-			return -1;
-		case 0:
-			errno = ETIMEDOUT;
-			return -1;
-		}
-
-		if (read(fd, &c, 1) == -1)
-			return -1;
-
-		if (*wp == c)
-			wp++;
-		else
-			wp = what;
-	}
-
-	return 0;
-}
-
-
-/**
-   Remove leading and trailing whitespace from a line of text.
- */
-int
-cleanup(char *line, size_t linelen)
-{
-	char *p;
-	int x;
-
-	/* Remove leading whitespace. */
-	p = line;
-	for (x = 0; x <= linelen; x++) {
-		switch (line[x]) {
-		case '\t':
-		case ' ':
-			break;
-		case '\n':
-		case '\r':
-			return -1;
-		default:
-			goto eol;
-		}
-	}
-eol:
-	/* Move the remainder down by as many whitespace chars as we
-	   chewed up */
-	if (x)
-		memmove(p, &line[x], linelen-x);
-
-	/* Remove trailing whitespace. */
-	for (x=0; x <= linelen; x++) {
-		switch(line[x]) {
-		case '\t':
-		case ' ':
-		case '\r':
-		case '\n':
-			line[x] = 0;
-		case 0:
-		/* End of line */
-			return 0;
-		}
-	}
-
-	return -1;
-}
-
-
-/**
-   Parse args from stdin.  Dev + devlen + op + oplen must be valid.
- */
-int
-get_options_stdin(char *dev, size_t devlen, int *speed, int *port,
-		  char *op, size_t oplen, int *verbose)
-{
-	char in[256];
-	int line = 0;
-	char *name, *val;
-
-	while (fgets(in, sizeof(in), stdin)) {
-		++line;
-
-		if (in[0] == '#')
-			continue;
-
-		if (cleanup(in, sizeof(in)) == -1)
-			continue;
-
-		name = in;
-		if ((val = strchr(in, '='))) {
-			*val = 0;
-			++val;
-		}
-
-		if (!strcasecmp(name, "agent")) {
-			/* Used by fenced? */
-		} else if (!strcasecmp(name, "verbose")) {
-			*verbose = 1;
-		} else if (!strcasecmp(name, "device")) {
-			/* Character device to use.  E.g. /dev/ttyS0 */
-			if (val)
-				strncpy(dev, val, devlen);
-			else
-				dev[0] = 0;
-
-		} else if (!strcasecmp(name, "port")) {
-			/* Port number */
-			if (val)
-				*port = atoi(val);
-			else
-				*port = -1;
-
-		} else if (!strcasecmp(name, "speed")) {
-			/* Speed in bits per second */
-			if (val)
-				*speed = char_to_speed(val);
-			else
-				*speed = -1;
-		} else if (!strcasecmp(name, "option") ||
-			   !strcasecmp(name, "operation") ||
-			   !strcasecmp(name, "action")) {
-			if (val)
-				strncpy(op, val, oplen);
-			else
-				op[0] = 0;
-		} else {
-			fprintf(stderr,
-				"parse error: illegal name on line %d\n",
-				line);
-			return 1;
-		}
-	}
-
-	return 0;
-}
-
-
-/**
-   Print a message to stderr and call exit(1).
- */
-void
-fail_exit(char *msg)
-{
-	fprintf(stderr, "failed: %s\n", msg);
-	exit(1);
-}
-
-
-int
-main(int argc, char **argv)
-{
-	int fd, speed = DEFAULT_SPEED, opt, ret = 1;
-	extern char *optarg;
-	char dev[256];
-	char op[256];
-	int port = 0, verbose=0;
-	char *pname = basename(argv[0]);
-
-	strncpy(dev, DEFAULT_DEVICE, sizeof(dev));
-	strncpy(op, "reboot", sizeof(op));
-
-	if (argc > 1) {
-		/*
-		   Parse command line options if any were specified
-		 */
-		while ((opt = getopt(argc, argv, "s:d:n:ro:vV?hH")) != EOF) {
-			switch(opt) {
-			case 's':
-				/* Speed */
-				speed = char_to_speed(optarg);
-				if (speed == -1)
-					usage_exit(pname);
-	
-				break;
-			case 'd':
-				/* Device to open */
-				strncpy(dev, optarg, sizeof(dev));
-				break;
-			case 'n':
-				port = atoi(optarg);
-				break;
-			case 'o':
-				/* Operation */
-				strncpy(op, optarg, sizeof(op));
-				break;
-			case 'v':
-				verbose++;
-				break;
-			case 'V':
-        			printf("%s %s (built %s %s)\n", pname,
-				       RELEASE_VERSION,
-               				__DATE__, __TIME__);
-        			printf("%s\n",
-				       REDHAT_COPYRIGHT);
-				return 0;
-			default:
-				usage_exit(pname);
-			}
-		}
-	} else {
-		/*
-		   No command line args?  Get stuff from stdin
-		 */
-		if (get_options_stdin(dev, sizeof(dev), &speed, &port,
-				      op, sizeof(op), &verbose) != 0)
-			return 1;
-	}
-
-	/*
-	   Validate the operating parameters
-	 */
-	if (strlen(dev) == 0)
-		fail_exit("no device specified");
-
-	if (speed == -1)
-		fail_exit("invalid serial port speed");
-
-	if (strcasecmp(op, "off") && strcasecmp(op, "on") &&
-	    strcasecmp(op, "reboot")) {
-		fail_exit("operation must be 'on', 'off', or 'reboot'");
-	}
-
-	if ((port < 0) && (port != 9))
-		fail_exit("port must be between 0 and 9, inclusive");
-
-	/*
-	   Open the serial port up
-	 */
-	fd = open_port(dev, speed);
-	if (fd == -1)
-		exit(1);
-
-	if (verbose) {
-		printf("Toggling DTR...");
-		fflush(stdout);
-	}
-	hangup(fd, 500000);
-	if (verbose)
-		printf("Done\n");
-
-	/*
-	   Some misc. RPS-10s return PRS for some reason...
-	 */
-	if (verbose) {
-		printf("Waiting for Ready signal...");
-		fflush(stdout);
-	}
-	if (wait_for(fd, "S-10 Ready", 10) == -1) {
-		perror("wait_for");
-		return -1;
-	}
-	if (verbose)
-		printf("Done\n");
-
-	/*
-	   Perform the requested operation
-	 */
-	if (!strcasecmp(op, "reboot")) {
-		printf("Rebooting port %d...", port);
-		fflush(stdout);
-		if (rps10_toggle_port(fd, port) < 0)
-			goto out;
-
-		if (wait_for(fd, " Off", 10) < 0)
-			goto out;
-
-		/* turning on doesn't require a failure check */
-		if (wait_for(fd, " On", 10) != 0)
-			printf("<warn: "
-			       "Plug %d might still be off>", port);
-
-		ret = 0;
-
-	} else if (!strcasecmp(op, "on")) {
-		printf("Powering on port %d...", port);
-		fflush(stdout);
-		if (rps10_port_on(fd, port) < 0)
-			goto out;
-
-		if (wait_for(fd, " On", 10) < 0)
-	       		goto out;
-
-		ret = 0;
-
-	} else if (!strcasecmp(op, "off")) {
-		printf("Powering off port %d...", port);
-		fflush(stdout);
-		if (rps10_port_off(fd, port) < 0)
-			goto out;
-
-		if (wait_for(fd, " Off", 10) < 0)
-			goto out;
-
-		ret = 0;
-	}
-
-out:
-	if (ret == 0)
-		printf("Done\n");
-	else
-		printf("Failed\n");
-	return ret;
-}



More information about the Cluster-cvs mailing list