[Cluster-devel] cluster/fence/agents drac/fence_drac.pl ilo/fe ...
rmccabe at sourceware.org
rmccabe at sourceware.org
Thu May 10 19:42:26 UTC 2007
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL5
Changes by: rmccabe at sourceware.org 2007-05-10 19:42:24
Modified files:
fence/agents/drac: fence_drac.pl
fence/agents/ilo: fence_ilo.pl
Log message:
RHEL5 fence_drac and fence_ilo are out of sync with RHEL50 (and HEAD). sync them up.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/agents/drac/fence_drac.pl.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.8&r2=1.8.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/agents/ilo/fence_ilo.pl.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.5&r2=1.5.2.1
--- cluster/fence/agents/drac/fence_drac.pl 2006/09/06 15:34:03 1.8
+++ cluster/fence/agents/drac/fence_drac.pl 2007/05/10 19:42:24 1.8.2.1
@@ -3,7 +3,7 @@
###############################################################################
###############################################################################
##
-## Copyright (C) 2005 Red Hat, Inc. All rights reserved.
+## Copyright (C) 2006 Red Hat, Inc. All rights reserved.
##
## This copyrighted material is made available to anyone wishing to use,
## modify, copy, or redistribute it subject to the terms and conditions
@@ -21,7 +21,10 @@
#
# PowerEdge 1855 DRAC/MC 1.1 (Build 03.03)
# PowerEdge 1855 DRAC/MC 1.2 (Build 03.03)
+# PowerEdge 1855 DRAC/MC 1.3 (Build 06.12)
# PowerEdge 1850 DRAC 4/I 1.35 (Build 09.27)
+# PowerEdge 1850 DRAC 4/I 1.40 (Build 08.24)
+# PowerEdge 1950 DRAC 5 1.0 (Build 06.05.12)
#
use Getopt::Std;
@@ -32,7 +35,7 @@
s/.*\///;
my $pname = $_;
-my $telnet_timeout = 5; # Seconds to wait for matching telent response
+my $telnet_timeout = 10; # Seconds to wait for matching telent response
my $power_timeout = 20; # time to wait in seconds for power state changes
$action = 'reboot'; # Default fence action.
@@ -41,10 +44,15 @@
my $t = new Net::Telnet;
-my $DRAC_VERSION_UNKNOWN = '__unknown__';
-my $DRAC_VERSION_III_XT = 'DRAC III/XT';
-my $DRAC_VERSION_MC = 'DRAC/MC';
-my $DRAC_VERSION_4I = 'DRAC 4/I';
+my $DRAC_VERSION_UNKNOWN = '__unknown__';
+my $DRAC_VERSION_III_XT = 'DRAC III/XT';
+my $DRAC_VERSION_MC = 'DRAC/MC';
+my $DRAC_VERSION_4I = 'DRAC 4/I';
+my $DRAC_VERSION_4P = 'DRAC 4/P';
+my $DRAC_VERSION_5 = 'DRAC 5';
+
+my $PWR_CMD_SUCCESS = "/^OK/";
+my $PWR_CMD_SUCCESS_DRAC5 = "/^Server power operation successful$/";
# WARNING!! Do not add code bewteen "#BEGIN_VERSION_GENERATION" and
# "#END_VERSION_GENERATION" It is generated by the Makefile
@@ -128,7 +136,7 @@
fail "failed: telnet open failed: ". $t->errmsg."\n";
# Expect 'Login: '
- ($_) = $t->waitfor(Match => "/Login: /", Timeout=>15) or
+ ($_) = $t->waitfor(Match => "/[Ll]ogin: /", Timeout=>15) or
fail "failed: telnet failed: ". $t->errmsg."\n" ;
# Determine DRAC version
@@ -147,7 +155,6 @@
}
else
{
- print "WARNING: unable to detect DRAC version '$_'\n";
$drac_version = $DRAC_VERSION_UNKNOWN;
}
}
@@ -168,14 +175,18 @@
$cmd_prompt = "/\\[$login\\]# /"
unless defined $cmd_prompt;
}
+ elsif ($drac_version =~ /$DRAC_VERSION_4P/)
+ {
+ $cmd_prompt = "/\\[$login\\]# /"
+ unless defined $cmd_prompt;
+ }
else
{
- print "WARNING: unsupported DRAC version '$drac_version'\n";
$drac_version = $DRAC_VERSION_UNKNOWN;
}
# Take a guess as to what the prompt might be if not already defined
- $cmd_prompt="/(\\[$login\\]# |DRAC\\/MC:)/" unless defined $cmd_prompt;
+ $cmd_prompt="/(\\[$login\\]# |DRAC\\/MC:|\\\$ )/" unless defined $cmd_prompt;
# Send login
@@ -188,9 +199,24 @@
# Send password
$t->print($passwd);
- # Expect '[$login]# '
+ # DRAC5 prints version controller version info
+ # only after you've logged in.
+ if ($drac_version eq $DRAC_VERSION_UNKNOWN) {
+ if ($t->waitfor(Match => "/.*\($DRAC_VERSION_5\)/m")) {
+ $drac_version = $DRAC_VERSION_5;
+ $cmd_prompt = "/\\\$ /";
+ $PWR_CMD_SUCCESS = $PWR_CMD_SUCCESS_DRAC5;
+ } else {
+ print "WARNING: unable to detect DRAC version '$_'\n";
+ }
+ }
+
$t->waitfor($cmd_prompt) or
- fail "failed: invalid username or password";
+ fail "failed: invalid username or password";
+
+ if ($drac_version eq $DRAC_VERSION_UNKNOWN) {
+ print "WARNING: unsupported DRAC version '$drac_version'\n";
+ }
$logged_in = 1;
}
@@ -210,7 +236,9 @@
{
$cmd = "serveraction -m $modulename -d 0 $svr_action";
}
- else
+ elsif ($drac_version eq $DRAC_VERSION_5) {
+ $cmd = "racadm serveraction $svr_action";
+ } else
{
$cmd = "serveraction -d 0 $svr_action";
}
@@ -248,7 +276,7 @@
}
else
{
- next if (/^OK$/);
+ next if ($PWR_CMD_SUCCESS);
$err = $_;
}
}
@@ -262,8 +290,14 @@
sub get_power_status
{
my $status;
- my $cmd = "getmodinfo";
my $modname = $modulename;
+ my $cmd;
+
+ if ($drac_version eq $DRAC_VERSION_5) {
+ $cmd = "racadm serveraction powerstatus";
+ } else {
+ $cmd = "getmodinfo";
+ }
$t->print($cmd);
@@ -282,51 +316,59 @@
fail "failed: unkown dialog exception: '$_'" unless (/^$cmd$/);
- #Expect:
- # #<group> <module> <presence> <pwrState> <health> <svcTag>
- # 1 ----> chassis Present ON Normal CQXYV61
- #
- # Note: DRAC/MC has many entries in the table whereas DRAC III has only
- # a single table entry.
-
- while (1)
- {
- $_ = shift @cmd_out;
- if (/^#<group>\s*<module>\s*<presence>\s*<pwrState>\s*<health>\s*<svcTag>/)
- {
- $found_header = 1;
- last;
+ if ($drac_version ne $DRAC_VERSION_5) {
+ #Expect:
+ # #<group> <module> <presence> <pwrState> <health> <svcTag>
+ # 1 ----> chassis Present ON Normal CQXYV61
+ #
+ # Note: DRAC/MC has many entries in the table whereas DRAC III has only
+ # a single table entry.
+
+ while (1)
+ {
+ $_ = shift @cmd_out;
+ if (/^#<group>\s*<module>\s*<presence>\s*<pwrState>\s*<health>\s*<svcTag>/)
+ {
+ $found_header = 1;
+ last;
+ }
}
+ fail "failed: invalid 'getmodinfo' header: '$_'" unless $found_header;
}
- fail "failed: invalid 'getmodinfo' header: '$_'" unless $found_header;
-
foreach (@cmd_out)
{
s/^\s+//g; #strip leading space
s/\s+$//g; #strip training space
- my ($group,$arrow,$module,$presence,$pwrstate,$health,
- $svctag,$junk) = split /\s+/;
+ if ($drac_version eq $DRAC_VERSION_5) {
+ if(m/^Server power status: (\w+)/) {
+ $status = lc($1);
+ }
+ } else {
+ my ($group,$arrow,$module,$presence,$pwrstate,$health,
+ $svctag,$junk) = split /\s+/;
+
+ if ($drac_version eq $DRAC_VERSION_III_XT || $drac_version eq $DRAC_VERSION_4I || $drac_version eq $DRAC_VERSION_4P)
+ {
+ fail "failed: extraneous output detected from 'getmodinfo'" if $found_module;
+ $found_module = 1;
+ $modname = $module;
+ }
+
+ if ($modname eq $module)
+ {
+ fail "failed: duplicate module names detected" if $status;
+ $found_module = 1;
+
+ fail "failed: module not reported present" unless ($presence =~ /Present/);
+ $status = $pwrstate;
+ }
- if ($drac_version eq $DRAC_VERSION_III_XT || $drac_version eq $DRAC_VERSION_4I)
- {
- fail "failed: extraneous output detected from 'getmodinfo'" if $found_module;
- $found_module = 1;
- $modname = $module;
- }
-
- if ($modname eq $module)
- {
- fail "failed: duplicate module names detected" if $status;
- $found_module = 1;
-
- fail "failed: module not reported present" unless ($presence =~ /Present/);
- $status = $pwrstate;
}
}
- if ($drac_version eq $DRAC_VERSION_MC)
+ if ($drac_version eq $DRAC_VERSION_MC)
{
fail "failed: module '$modulename' not detected" unless $found_module;
}
--- cluster/fence/agents/ilo/fence_ilo.pl 2006/08/16 19:11:49 1.5
+++ cluster/fence/agents/ilo/fence_ilo.pl 2007/05/10 19:42:24 1.5.2.1
@@ -262,6 +262,13 @@
foreach my $line (@response)
{
+ if ($line =~ /MANAGEMENT_PROCESSOR\s*=\s*\"(.*)\"/) {
+ if ($1 eq "iLO2") {
+ $ilo_vers = 2;
+ print "power_status: reporting iLO2\n" if ($verbose);
+ }
+ }
+
if ($line =~ /MESSAGE='(.*)'/)
{
my $msg = $1;
@@ -326,10 +333,20 @@
sendsock $socket, "<LOGIN USER_LOGIN = \"$username\" PASSWORD = \"$passwd\">\n";
sendsock $socket, "<SERVER_INFO MODE = \"write\">\n";
+ if ($ilo_vers == 2) {
+ # iLO2 with RIBCL v2.22 behaves differently from
+ # iLO with RIBCL v2.22. For the former, HOLD_PWR_BTN is
+ # used to both power the machine on and off; when the power
+ # is off, PRESS_PWR_BUTTON has no effect. For the latter,
+ # HOLD_PWR_BUTTON is used to power the machine off, and
+ # PRESS_PWR_BUTTON is used to power the machine on;
+ # when the power is off, HOLD_PWR_BUTTON has no effect.
+ sendsock $socket, "<HOLD_PWR_BTN/>\n";
+ }
# As of firmware version 1.71 (RIBCL 2.21) The SET_HOST_POWER command
# is no longer available. HOLD_PWR_BTN and PRESS_PWR_BTN are used
# instead now :(
- if ($ribcl_vers < 2.21 )
+ elsif ($ribcl_vers < 2.21)
{
sendsock $socket, "<SET_HOST_POWER HOST_POWER = \"$state\"/>\n";
}
@@ -384,6 +401,9 @@
sendsock $socket, "<RIBCL VERSION=\"2.0\">\n";
}
sendsock $socket, "<LOGIN USER_LOGIN = \"$username\" PASSWORD = \"$passwd\">\n";
+ if ($ribcl_vers >= 2) {
+ sendsock $socket, "<RIB_INFO MODE=\"read\"><GET_FW_VERSION/></RIB_INFO>\n";
+ }
sendsock $socket, "<SERVER_INFO MODE = \"read\">\n";
sendsock $socket, "<GET_HOST_POWER_STATUS/>\n";
sendsock $socket, "</SERVER_INFO>\n";
@@ -469,6 +489,7 @@
$action = "reboot";
$ribcl_vers = undef; # undef = autodetect
+$ilo_vers = 1;
if (@ARGV > 0) {
getopts("a:hl:n:o:p:r:qvV") || fail_usage ;
More information about the Cluster-devel
mailing list