Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: f71c978b9e467b40abf4cf692a636956c827e60f
Parent: 2d4b69c5caab8afe96d35506da9829a6f921cb94
Author: Marek 'marx' Grac <mgrac(a)redhat.com>
AuthorDate: Thu Jan 13 14:07:50 2011 +0100
Committer: Marek 'marx' Grac <mgrac(a)redhat.com>
CommitterDate: Fri Feb 25 10:11:16 2011 +0100
fence_ipmilan: Add "diag" option to support "ipmitool chassis power
diag"
Resolves: rhbz#678061
---
fence/agents/ipmilan/ipmilan.c | 31 +++++++++++++++++++++++++++----
1 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/fence/agents/ipmilan/ipmilan.c b/fence/agents/ipmilan/ipmilan.c
index 2f46078..4371143 100644
--- a/fence/agents/ipmilan/ipmilan.c
+++ b/fence/agents/ipmilan/ipmilan.c
@@ -52,6 +52,7 @@ do { \
#define ST_POWEROFF 2
#define ST_GENERIC_RESET 3
#define ST_CYCLE 4
+#define ST_DIAG 5
#define DEFAULT_TIMEOUT 20
#define DEFAULT_POWER_WAIT 2
@@ -198,7 +199,7 @@ struct xml_parameter_s xml_parameters[]={
{"passwd_script","-S",0,"string",NULL,"Script to
retrieve password (if required)"},
{"lanplus","-P",0,"boolean",NULL,"Use
Lanplus"},
{"login","-l",0,"string",NULL,"Username/Login (if
required) to control power on IPMI device"},
-
{"action","-o",0,"string","reboot","Operation
to perform. Valid operations: on, off, reboot, status, list, monitor or metadata"},
+
{"action","-o",0,"string","reboot","Operation
to perform. Valid operations: on, off, reboot, status, list, diag, monitor or
metadata"},
{"timeout","-t",0,"string",NULL,"Timeout (sec) for
IPMI operation"},
{"cipher","-C",0,"string",NULL,"Ciphersuite to use
(same as ipmitool -C parameter)"},
{"method","-M",0,"string",DEFAULT_METHOD,"Method to
fence (onoff or cycle)"},
@@ -337,6 +338,10 @@ build_cmd(char *command, size_t cmdlen, struct ipmi *ipmi, int op)
snprintf(arg, sizeof(arg),
"%s chassis power cycle", cmd);
break;
+ case ST_DIAG:
+ snprintf(arg, sizeof(arg),
+ "%s chassis power diag", cmd);
+ break;
}
strncpy(command, arg, cmdlen);
@@ -554,6 +559,16 @@ ipmi_cycle(struct ipmi *ipmi)
return ret;
}
+static int
+ipmi_diag(struct ipmi *ipmi)
+{
+ int ret;
+
+ ret = ipmi_op(ipmi, ST_DIAG, power_off_complete);
+
+ return ret;
+}
+
/**
Squash all our private data
@@ -1068,7 +1083,8 @@ printf(" -S <path> Script to retrieve password (if
required)\n");
printf(" -l <login> Username/Login (if required) to control
power\n"
" on IPMI device\n");
printf(" -o <op> Operation to perform.\n");
-printf(" Valid operations: on, off, reboot, status, list or
monitor\n");
+printf(" Valid operations: on, off, reboot, status,\n");
+printf(" diag, list or monitor\n");
printf(" -t <timeout> Timeout (sec) for IPMI operation (default
%d)\n",DEFAULT_TIMEOUT);
printf(" -T <timeout> Wait X seconds after on/off operation\n");
printf(" -f <timeout> Wait X seconds before fencing is started\n");
@@ -1136,6 +1152,7 @@ void print_xml_metadata(char *pname) {
printf("\t<action name=\"%s\" />\n", "off");
printf("\t<action name=\"%s\" />\n", "reboot");
printf("\t<action name=\"%s\" />\n", "status");
+ printf("\t<action name=\"%s\" />\n", "diag");
printf("\t<action name=\"%s\" />\n", "list");
printf("\t<action name=\"%s\" />\n", "monitor");
printf("\t<action name=\"%s\" />\n", "metadata");
@@ -1308,9 +1325,9 @@ main(int argc, char **argv)
if (strcasecmp(op, "off") && strcasecmp(op, "on")
&&
strcasecmp(op, "status") && strcasecmp(op, "reboot")
&&
strcasecmp(op, "monitor") && strcasecmp(op, "list")
&&
- strcasecmp(op, "metadata")) {
+ strcasecmp(op, "metadata") && strcasecmp(op, "diag")) {
fail_exit("operation must be 'on', 'off', 'status',
"
- "'reboot', 'list', 'monitor' or
'metadata'");
+ "'reboot', 'diag', 'list', 'monitor' or
'metadata'");
}
if (strlen(authtype) &&
@@ -1408,6 +1425,12 @@ main(int argc, char **argv)
ret=0;
translated_ret = ERR_OK;
print_final_status=0;
+ } else if (!strcasecmp(op, "diag")) {
+ printf("Pulsing diagnostic interrupt to machine @ IPMI:%s...", ip);
+ fflush(stdout);
+ ret = ipmi_diag(i);
+ translated_ret = (ret==0?ERR_ON_SUCCESSFUL:ERR_ON_FAIL);
+ ret = 0;
}