fence-agents: master - COMPATIBILITY BREAK: remove support for Dell DRAC III and older

Marek GrĂ¡c marx at fedoraproject.org
Mon Feb 11 18:09:52 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=fence-agents.git;a=commitdiff;h=d98df955e17fa6e85e0ea51997e55387389803a5
Commit:        d98df955e17fa6e85e0ea51997e55387389803a5
Parent:        5c8d1f68bc3e7a21338e1aa1a7fdea3a6febebf1
Author:        Marek 'marx' Grac <mgrac at redhat.com>
AuthorDate:    Mon Feb 11 15:23:34 2013 +0100
Committer:     Marek 'marx' Grac <mgrac at redhat.com>
CommitterDate: Mon Feb 11 15:23:34 2013 +0100

COMPATIBILITY BREAK: remove support for Dell DRAC III and older

Support for older DRAC devices was removed and fence agent was ported to fencing
library. fence_drac should be now used only for Dell DRAC IV.
---
 fence/agents/drac/Makefile.am   |    4 +-
 fence/agents/drac/fence_drac.pl |  768 ---------------------------------------
 fence/agents/drac/fence_drac.py |   80 ++++
 fence/agents/drac/test_drac.sh  |   83 -----
 4 files changed, 82 insertions(+), 853 deletions(-)

diff --git a/fence/agents/drac/Makefile.am b/fence/agents/drac/Makefile.am
index 392415f..0616c57 100644
--- a/fence/agents/drac/Makefile.am
+++ b/fence/agents/drac/Makefile.am
@@ -2,7 +2,7 @@ MAINTAINERCLEANFILES	= Makefile.in
 
 TARGET			= fence_drac
 
-SRC			= $(TARGET).pl
+SRC			= $(TARGET).py
 
 EXTRA_DIST		= $(SRC)
 
@@ -11,7 +11,7 @@ sbin_SCRIPTS		= $(TARGET)
 man_MANS		= $(TARGET).8
 
 include $(top_srcdir)/make/fencebuild.mk
-include $(top_srcdir)/make/fencemanperl.mk
+include $(top_srcdir)/make/fenceman.mk
 
 clean-local: clean-man
 	rm -f $(TARGET)
diff --git a/fence/agents/drac/fence_drac.pl b/fence/agents/drac/fence_drac.pl
deleted file mode 100644
index 536badd..0000000
--- a/fence/agents/drac/fence_drac.pl
+++ /dev/null
@@ -1,768 +0,0 @@
-#!/usr/bin/perl
-
-# The following agent has been tested on:
-#
-#  Model 		DRAC Version	Firmware
-#  -------------------	--------------	----------------------
-#  PowerEdge 750	DRAC III/XT	3.20 (Build 10.25)
-#  Dell Remote Access Controller - ERA and DRAC III/XT, v.3.20, A00
-#  
-#  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;
-use Net::Telnet ();
-
-my $ME = $0;
-
-END {
-  defined fileno STDOUT or return;
-  close STDOUT and return;
-  warn "$ME: failed to close standard output: $!\n";
-  $? ||= 1;
-}
-
-# Get the program name from $0 and strip directory names
-$_=$0;
-s/.*\///;
-my $pname = $_;
-
-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.  
-
-my $logged_in = 0;
-my $quiet = 0;
-
-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_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
-
-#BEGIN_VERSION_GENERATION
-$RELEASE_VERSION="";
-$REDHAT_COPYRIGHT="";
-$BUILD_DATE="";
-#END_VERSION_GENERATION
-
-sub usage 
-{
-	print "Usage:\n";
-	print "\n";
-	print "$pname [options]\n";
-	print "\n";
-	print "Options:\n";
-	print "  -a <ip>          IP address or hostname of DRAC\n";
-	print "  -c <cmd_prompt>  force DRAC command prompt\n";
-	print "  -d <dracversion> force DRAC version to use\n";
-	print "  -D <debugfile>   debugging output file\n";
-	print "  -h               usage\n";
-	print "  -l <name>        Login name\n";
-	print "  -m <modulename>  DRAC/MC module name\n";
-	print "  -o <string>      Action: reboot (default), off, on or metadata\n";
-	print "  -p <string>      Login password\n";
-	print "  -S <path>        Script to run to retrieve password\n";
-	print "  -f <seconds>     Wait X seconds before fencing is started\n";
-	print "  -q               quiet mode\n";
-	print "  -V               version\n";
-	print "\n";
-	print "CCS Options:\n";
-	print "  action = \"string\"      Action: reboot (default), off or on\n";
-	print "  debug  = \"debugfile\"   debugging output file\n";
-	print "  ipaddr = \"ip\"          IP address or hostname of DRAC\n";
-	print "  login  = \"name\"        Login name\n";
-	print "  passwd = \"string\"      Login password\n";
-	print "  passwd_script = \"path\" Script to run to retrieve password\n";
-	print "  delay = \"seconds\"      Wait X seconds before fencing is started\n";
-
-	exit 0;
-}
-
-sub msg
-{
-	($msg)=@_;
-	print $msg."\n" unless $quiet;
-}
-
-sub fail
-{
-	($msg)=@_;
-	print $msg."\n" unless $quiet;
-
-	if (defined $t)
-	{
-		# make sure we don't get stuck in a loop due to errors
-		$t->errmode('return');  
-
-		logout() if $logged_in;
-		$t->close 
-	}
-	exit 1;
-}
-
-sub fail_usage
-{
-	($msg)=@_;
-	print STDERR $msg."\n" if $msg;
-	print STDERR "Please use '-h' for usage.\n";
-	exit 1;
-}
-
-sub version
-{
-	print "$pname $RELEASE_VERSION $BUILD_DATE\n";
-	print "$REDHAT_COPYRIGHT\n" if ( $REDHAT_COPYRIGHT );
-	exit 0;
-}
-
-sub print_metadata
-{
-print '<?xml version="1.0" ?>
-<resource-agent name="fence_drac" shortdesc="fencing agent for Dell Remote Access Card" >
-<longdesc>
-fence_drac is an I/O Fencing agent which can be used with the Dell Remote Access Card (DRAC). This card provides remote access to controlling power to a server. It logs into the DRAC through the telnet interface of the card. By default, the telnet interface is not enabled. To enable the interface, you will need to use the racadm command in the racser-devel rpm available from Dell.  To enable telnet on the DRAC:
-
-[root]# racadm config -g cfgSerial -o cfgSerialTelnetEnable 1
-
-[root]# racadm racreset
-</longdesc>
-<vendor-url>http://www.dell.com</vendor-url>
-<parameters>
-        <parameter name="action" unique="0" required="1">
-                <getopt mixed="-o [action]" />
-                <content type="string" default="reboot" />
-                <shortdesc lang="en">Fencing Action</shortdesc>
-        </parameter>
-        <parameter name="ipaddr" unique="0" required="1">
-                <getopt mixed="-a [ip]" />
-                <content type="string"  />
-                <shortdesc lang="en">IP Address or Hostname</shortdesc>
-        </parameter>
-        <parameter name="login" unique="0" required="1">
-                <getopt mixed="-l [name]" />
-                <content type="string"  />
-                <shortdesc lang="en">Login Name</shortdesc>
-        </parameter>
-        <parameter name="passwd" unique="0" required="0">
-                <getopt mixed="-p [password]" />
-                <content type="string"  />
-                <shortdesc lang="en">Login password or passphrase</shortdesc>
-        </parameter>
-        <parameter name="passwd_script" unique="0" required="0">
-                <getopt mixed="-S [script]" />
-                <content type="string"  />
-                <shortdesc lang="en">Script to retrieve password</shortdesc>
-        </parameter>
-        <parameter name="cmd_prompt" unique="0" required="0">
-                <getopt mixed="-c [prompt]" />
-                <content type="string" />
-                <shortdesc lang="en">Force fence_drac to use cmd_prompt as the command prompt</shortdesc>
-        </parameter>
-        <parameter name="drac_version" unique="0" required="0">
-                <getopt mixed="-d [version]" />
-                <content type="string" />
-                <shortdesc lang="en">Force fence_drac to treat the device as though it was for the specified drac version</shortdesc>
-        </parameter>
-        <parameter name="module_name" unique="0" required="0">
-                <getopt mixed="-m [modulename]" />
-                <content type="string"/>
-                <shortdesc lang="en">The module name of the blade when using DRAC/MC firmware.</shortdesc>
-        </parameter>
-        <parameter name="debug" unique="0" required="0">
-                <getopt mixed="-D [dumpfile]" />
-                <content type="string"/>
-                <shortdesc lang="en">Debug file of the telnet interaction</shortdesc>
-        </parameter>
-        <parameter name="delay" unique="0" required="0">
-                <getopt mixed="-f [seconds]" />
-                <content type="string" default="0"/>
-                <shortdesc lang="en">Wait X seconds before fencing is started</shortdesc>
-        </parameter>
-        <parameter name="help" unique="0" required="0">
-                <getopt mixed="-h" />           
-                <content type="string"  />
-                <shortdesc lang="en">Display help and exit</shortdesc>                    
-        </parameter>
-</parameters>
-<actions>
-        <action name="on" />
-        <action name="off" />
-	<action name="reboot" />
-        <action name="status" />
-        <action name="metadata" />
-</actions>
-</resource-agent>
-';
-}
-
-
-sub login
-{
-	$t->open($address) or 
-		fail "failed: telnet open failed: ". $t->errmsg."\n";
-  
-	# Expect 'Login: ' 
-	($_) = $t->waitfor(Match => "/[Ll]ogin: /", Timeout=>15) or
-		fail "failed: telnet failed: ". $t->errmsg."\n" ;
-
-	# Determine DRAC version
-  if (/Dell Embedded Remote Access Controller \(ERA(\/O)?\)\nFirmware Version/m)
-  {
-    $drac_version = $DRAC_VERSION_III_XT;
-  } else {
-	if (/.*\((DRAC[^)]*)\)/m)
-	{
-		print "detected drac version '$1'\n" if $verbose;
-		$drac_version = $1 unless defined $drac_version;
-		
-		print "WARNING: detected drac version '$1' but using "
-			. "user defined version '$drac_version'\n"
-			if ($drac_version ne $1);
-	}
-	else
-	{
-		$drac_version = $DRAC_VERSION_UNKNOWN;
-	}
-  }
-
-	# Setup prompt
-	if ($drac_version =~ /$DRAC_VERSION_III_XT/)
-	{
-		$cmd_prompt = "/\\[$login\\]# /" 
-			unless defined $cmd_prompt;
-	}
-	elsif ($drac_version =~ /$DRAC_VERSION_MC/)
-	{
-		$cmd_prompt = "/DRAC\\/MC:/" 
-			unless defined $cmd_prompt;
-	}	
-	elsif ($drac_version =~ /$DRAC_VERSION_4I/)
-	{
-		$cmd_prompt = "/\\[$login\\]# /" 
-			unless defined $cmd_prompt;
-	}
-  elsif ($drac_version =~ /$DRAC_VERSION_4P/)
-  {
-        $cmd_prompt = "/\\[$login\\]# /"
-          unless defined $cmd_prompt;
-  } 
-	else
-	{
-		$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;
-	
-
-	# Send login
-	$t->print($login);
-
-	# Expect 'Password: ' 
-	$t->waitfor("/Password: /") or 
-		fail "failed: timeout waiting for password";
-
-	# Send password
-	$t->print($passwd);  
-
-	# 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";
-
-	if ($drac_version eq $DRAC_VERSION_UNKNOWN) {
-		print "WARNING: unsupported DRAC version '$drac_version'\n";
-	}
-
-	$logged_in = 1;
-}
-
-#
-# Set the power status of the node 
-#
-sub set_power_status
-{
-	my ($state,$dummy) = @_;
-	my $cmd,$svr_action;
-
-	if   ( $state =~ /^on$/)  { $svr_action = "powerup"   }
-	elsif( $state =~ /^off$/) { $svr_action = "powerdown" }
-
-	if ($drac_version eq $DRAC_VERSION_MC)
-	{
-		$cmd = "serveraction -m $modulename  -d 0 $svr_action";
-	}
-	elsif ($drac_version eq $DRAC_VERSION_5) {
-		$cmd = "racadm serveraction $svr_action";
-	} else
-	{
-		$cmd = "serveraction -d 0 $svr_action";
-	}
-
-	$t->print($cmd);
-
-	# Expect /$cmd_prompt/
-	($_) = $t->waitfor($cmd_prompt) or
-		fail "failed: unexpected serveraction response"; 
-
-	my @cmd_out = split /\n/;
-
-	# discard command sent to DRAC
-	$_ = shift @cmd_out;
-        s/\e\[(([0-9]+;)*[0-9]+)*[ABCDfHJKmsu]//g; #strip ansi chars
-        s/^.*\x0D//;
-
-	fail "failed: unkown dialog exception: '$_'" unless (/^$cmd$/);
-
-	# Additional lines of output probably means an error.  
-	# Aborting to be safe.  Note: additional user debugging will be 
-	# necessary,  run with -D and -v flags
-	my $err;
-	while (@cmd_out)
-	{
-		$_ = shift @cmd_out;
-                #firmware vers 1.2 on DRAC/MC sends ansi chars - evil
-                s/\e\[(([0-9]+;)*[0-9]+)*[ABCDfHJKmsu]//g;
-                s/^.*\x0D//;
-
-		next if (/^\s*$/); # skip empty lines
-		if (defined $err)
-		{
-			$err = $err."\n$_";
-		}
-		else
-		{
-			next if ($PWR_CMD_SUCCESS);
-			$err = $_;
-		}
-	}
-	fail "failed: unexpected response: '$err'" if defined $err;
-}
-
-
-#
-# get the power status of the node and return it in $status and $_
-#
-sub get_power_status
-{
-	my $status; 
-	my $modname = $modulename;
-	my $cmd;
-
-	if ($drac_version eq $DRAC_VERSION_5) {
-		$cmd = "racadm serveraction powerstatus";
-	} else {
-		$cmd = "getmodinfo";
-	}
-
-	$t->print($cmd);
-
-	($_) = $t->waitfor($cmd_prompt);
-
-	my $found_header = 0;
-	my $found_module = 0;
-
-	my @cmd_out = split /\n/;
-
-	# discard command sent to DRAC
-	$_ = shift @cmd_out;
-        #strip ansi control chars
-        s/\e\[(([0-9]+;)*[0-9]+)*[ABCDfHJKmsu]//g;
-        s/^.*\x0D//;
-
-	fail "failed: unkown dialog exception: '$_'" unless (/^$cmd$/);
-
-	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;
-	}
-
-	foreach (@cmd_out)
-	{ 
-		s/^\s+//g; #strip leading space
-		s/\s+$//g; #strip training space
-
-		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_MC)
-	{
-		fail "failed: module '$modulename' not detected" unless $found_module;
-	}
-
-	$_=$status;
-	if(/^(on|off)$/i)
-	{
-		# valid power states 
-	}
-	elsif ($status) 
-	{
-		fail "failed: unknown power state '$status'";
-	}
-	else
-	{
-		fail "failed: unable to determine power state";
-	}
-}
-
-
-# Wait upto $power_timeout seconds for node power state to change to 
-# $state before erroring out.
-#
-# return 1 on success
-# return 0 on failure
-#
-sub wait_power_status
-{
-	my ($state,$dummy) = @_;
-	my $status;
-
-	$state = lc $state;
-
-	for (my $i=0; $i<$power_timeout ; $i++)
-	{
-		get_power_status;
-		$status = $_;
-		my $check = lc $status;
-
-		if ($state eq $check ) { return 1 }
-		sleep 1;
-	}
-	$_ = "timed out waiting to power $state";
-	return 0;
-}
-
-#
-# logout of the telnet session
-#
-sub logout 
-{
-	$t->print("");
-	$t->print("exit");
-}
-
-#
-# error routine for Net::Telnet instance
-#
-sub telnet_error
-{
-	fail "failed: telnet returned: ".$t->errmsg."\n";
-}
-
-#
-# execute the action.  Valid actions are 'on' 'off' 'reboot' and 'status'.
-# TODO: add 'configure' that uses racadm rpm to enable telnet on the drac
-#
-sub do_action
-{
-	if (($action =~ /^off$/i) || ($action =~ /^reboot$/i)) {
-		sleep ($delay) if defined($delay);
-	}
-
-	get_power_status;
-	my $status = $_;
-
-	if ($action =~ /^on$/i)
-	{
-		if ($status =~ /^on$/i)
-		{
-			msg "success: already on";
-			return 0;
-		}
-			
-		set_power_status on;
-		fail "failed: $_" unless wait_power_status on;
-
-		msg "success: powered on";
-	}
-	elsif ($action =~ /^off$/i)
-	{
-		if ($status =~ /^off$/i)
-		{
-			msg "success: already off";
-			return 0;
-		}
-
-		set_power_status off;
-		fail "failed: $_" unless wait_power_status off;
-	
-		msg "success: powered off";
-	}
-	elsif ($action =~ /^reboot$/i)
-	{
-		if ( !($status =~ /^off$/i) )
-		{
-			set_power_status off;
-		}
-		fail "failed: $_" unless wait_power_status off;
-
-		set_power_status on;
-		fail "failed: $_" unless wait_power_status on;
-
-		msg "success: rebooted";
-	}
-	elsif ($action =~ /^status$/i)
-	{
-		msg "status: $status";
-		if ($status =~ /on/i)
-		{
-			return 0;
-		} else {
-			return 2;
-		}
-	}
-	else 
-	{
-		fail "failed: unrecognised action: '$action'";
-	}
-
-	return 0;
-}
-
-#
-# Decipher STDIN parameters
-#
-sub get_options_stdin
-{
-	my $opt;
-	my $line = 0;
-	while( defined($in = <>) )
-	{
-		$_ = $in;
-		chomp;
-
-		# strip leading and trailing whitespace
-		s/^\s*//;
-		s/\s*$//;
-
-		# skip comments
-		next if /^#/;
-	
-		$line+=1;
-		$opt=$_;
-		next unless $opt;
-
-		($name,$val)=split /\s*=\s*/, $opt;
-
-		if ( $name eq "" )
-		{
-			print STDERR "parse error: illegal name in option $line\n";
-			exit 2;
-		} 
-		# DO NOTHING -- this field is used by fenced 
-		elsif ($name eq "agent" ) 
-		{
-		} 
-		elsif ($name eq "ipaddr" ) 
-		{
-			$address = $val;
-		} 
-		elsif ($name eq "login" ) 
-		{
-			$login = $val;
-		} 
-		elsif ($name eq "action" ) 
-		{
-			$action = $val;
-		} 
-		elsif ($name eq "passwd" ) 
-		{
-			$passwd = $val;
-		}
-		elsif ($name eq "passwd_script" )
-		{
-			$passwd_script = $val;
-		}
-		elsif ($name eq "debug" ) 
-		{
-			$debug = $val;
-		} 
-		elsif ($name eq "modulename" ) 
-		{
-			$modulename = $val;
-		} 
-		elsif ($name eq "drac_version" ) 
-		{
-			$drac_version = $val;
-		} 
-		elsif ($name eq "cmd_prompt" ) 
-		{
-			$cmd_prompt = $val;
-		} 
-		elsif ($name eq "delay")
-		{
-			$delay = $val;
-		}
-	}
-}
-
-
-### MAIN #######################################################
-
-#
-# Check parameters
-#
-if (@ARGV > 0) {
-	getopts("a:c:d:D:hl:m:o:p:S:qVvf:") || fail_usage ;
-	
-	usage if defined $opt_h;
-	version if defined $opt_V;
-	
-	$quiet = 1 if defined $opt_q;
-	$debug = $opt_D; 
-
-	fail_usage "Unknown parameter." if (@ARGV > 0);
-
-	if ((defined $opt_o) && ($opt_o =~ /metadata/i)) {
-		print_metadata();
-		exit 0;
-	}
-
-	fail_usage "No '-a' flag specified." unless defined $opt_a;
-	$address = $opt_a;
-
-	fail_usage "No '-l' flag specified." unless defined $opt_l;
-	$login = $opt_l;
-
-	$modulename = $opt_m if defined $opt_m;
-	$delay = $opt_f if defined $opt_f;
-
-	if (defined $opt_S) {
-		$pwd_script_out = `$opt_S`;
-		chomp($pwd_script_out);
-		if ($pwd_script_out) {
-			$opt_p = $pwd_script_out;
-		}
-	}
-
-	fail_usage "No '-p' or '-S' flag specified." unless defined $opt_p;
-	$passwd = $opt_p;
-
-	$verbose = $opt_v if defined $opt_v;
-
-	$cmd_prompt = $opt_c if defined $opt_c;
-	$drac_version = $opt_d if defined $opt_d;
-
-	if ($opt_o)
-	{
-		fail_usage "Unrecognised action '$opt_o' for '-o' flag"
-		unless $opt_o =~ /^(Off|On|Reboot|status)$/i;
-		$action = $opt_o;
-	}
-
-} else {
-	get_options_stdin();
-
-	if ((defined $action) && ($action =~ /metadata/i)) {
-		print_metadata();
-		exit 0;
-	}
-
-	fail "failed: no IP address" unless defined $address;
-	fail "failed: no login name" unless defined $login;
-
-	if (defined $passwd_script) {
-		$pwd_script_out = `$passwd_script`;
-		chomp($pwd_script_out);
-		if ($pwd_script_out) {
-			$passwd = $pwd_script_out;
-		}
-	}
-
-	fail "failed: no password" unless defined $passwd;
-	fail "failed: unrecognised action: $action"
-		unless $action =~ /^(Off|On|Reboot|status)$/i;
-} 
-
-
-$t->timeout($telnet_timeout);
-$t->input_log($debug) if $debug;
-$t->errmode('return');  
-
-login;
-
-# Abort on failure beyond here
-$t->errmode(\&telnet_error);  
-
-if ($drac_version eq $DRAC_VERSION_III_XT)
-{
-	fail "failed: option 'modulename' not compatilble with DRAC version '$drac_version'" 
-		if defined $modulename;
-}
-elsif ($drac_version eq $DRAC_VERSION_MC)
-{
-	fail "failed: option 'modulename' required for DRAC version '$drac_version'"
-		unless  defined $modulename;
-}
-
-my $res = do_action;
-
-logout;
-
-exit $res;
-
-
diff --git a/fence/agents/drac/fence_drac.py b/fence/agents/drac/fence_drac.py
new file mode 100644
index 0000000..e081001
--- /dev/null
+++ b/fence/agents/drac/fence_drac.py
@@ -0,0 +1,80 @@
+#!/usr/bin/python
+
+import sys, re, pexpect, exceptions
+sys.path.append("@FENCEAGENTSLIBDIR@")
+from fencing import *
+
+#BEGIN_VERSION_GENERATION
+RELEASE_VERSION=""
+REDHAT_COPYRIGHT=""
+BUILD_DATE=""
+#END_VERSION_GENERATION
+
+def get_power_status(conn, options):
+	conn.send_eol("getmodinfo")
+	conn.log_expect(options, options["--command-prompt"], int(options["--shell-timeout"]))
+	status = re.compile("\s+(on|off)\s+", re.IGNORECASE).search(conn.before).group(1)
+	return (status.lower().strip())
+
+def set_power_status(conn, options):
+	action = {
+		'on' : "powerup",
+		'off': "powerdown"
+	}[options["--action"]]
+
+	conn.send_eol("serveraction -d 0 " + action)
+	conn.log_expect(options, options["--command-prompt"], int(options["--shell-timeout"]))
+
+def main():
+	device_opt = [ "ipaddr", "login", "passwd", "cmd_prompt" ]
+
+	atexit.register(atexit_handler)
+
+	opt = process_input(device_opt)
+	if "--username" in opt:
+		all_opt["cmd_prompt"]["default"] = "\\[" + opt["--username"] + "\\]# "
+	else:
+		all_opt["cmd_prompt"]["default"] = "\\[" "username" + "\\]# "
+	
+	options = check_input(device_opt, opt)
+
+	docs = { }
+	docs["shortdesc"] = "I/O Fencing agent for Dell DRAC IV"
+	docs["longdesc"] = "fence_drac is an I/O Fencing agent which can be used with \
+the Dell Remote Access Card (DRAC). This card provides remote access to controlling \
+power to a server. It logs into the DRAC through the telnet interface of the card. By \
+default, the telnet interface is not enabled. To enable the interface, you will need \
+to use the racadm command in the racser-devel rpm available from Dell.  \
+\
+To enable telnet on the DRAC: \
+\
+[root]# racadm config -g cfgSerial -o cfgSerialTelnetEnable 1 \
+\
+[root]# racadm racreset \
+"
+	docs["vendorurl"] = "http://www.dell.com"
+	show_docs(options, docs)
+
+	##
+	## Operate the fencing device
+	####
+	conn = fence_login(options)
+	result = fence_action(conn, options, set_power_status, get_power_status, None)
+
+	##
+	## Logout from system
+	##
+	## In some special unspecified cases it is possible that 
+	## connection will be closed before we run close(). This is not 
+	## a problem because everything is checked before.
+	######
+	try:
+		conn.send_eol("exit")
+		conn.close()
+	except:
+		pass
+	
+	sys.exit(result)
+
+if __name__ == "__main__":
+	main()
diff --git a/fence/agents/drac/test_drac.sh b/fence/agents/drac/test_drac.sh
deleted file mode 100644
index 55ebc4d..0000000
--- a/fence/agents/drac/test_drac.sh
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/bin/bash
-
-verbose="-D /dev/stdout -v "
-passwd="calvin"
-login="root"
-
-drac="drac.localhost.localdomain"
-modulename=" -m Server-1 "
-
-
-fence_drac="./fence_drac.pl"
-i=0
-
-cmd()
-{
-	echo $*
-	out=$(echo $*; $*)
-	out_exit=$?
-
-	echo "$out" > out.log.$i
-	echo "Exit $out_exit" >> out.log.$i
-
-	if [ $out_exit -ne 0 ]
-	then
-		echo "ASSERTION FAILURE: command failed: see out.log.$i" >&2
-		exit 1
-	fi
-
-	: $((i++))
-}
-
-pause()
-{
-	echo "press ENTER to continue"
-	read
-}
-
-assert()
-{
-	get_status
-	if [ "$status" != "$1" ]
-	then
-		echo "ASSERTION FAILURE: power status is '$status' not '$1'" >&2
-		exit 1
-	fi
-}
-
-get_status()
-{
-	cmd $fence_drac -o status -a $drac -l $login -p $passwd $modulename $verbose
-	status=$(echo "$out" | awk '($1 == "status:") { print tolower($2)}')
-	echo "status -> $status"
-}
-
-get_status
-pause
-
-cmd $fence_drac -o off -a $drac -l $login -p $passwd $modulename $verbose 
-assert off
-
-cmd $fence_drac -o on -a $drac -l $login -p $passwd $modulename $verbose 
-assert on
-
-cmd $fence_drac -o off -a $drac -l $login -p $passwd $modulename $verbose 
-assert off
-
-cmd $fence_drac -o reboot -a $drac -l $login -p $passwd $modulename $verbose 
-assert on
-
-cmd $fence_drac -o on -a $drac -l $login -p $passwd $modulename $verbose 
-assert on
-
-cmd $fence_drac -o reboot -a $drac -l $login -p $passwd $modulename $verbose 
-assert on
-
-cmd $fence_drac -o off -a $drac -l $login -p $passwd $modulename $verbose 
-assert off
-
-cmd $fence_drac -o off -a $drac -l $login -p $passwd $modulename $verbose 
-assert off
-
-echo SUCCESS
-exit 0


More information about the cluster-commits mailing list