#!/usr/bin/perl
###############################################################################
# Fencing agent for Raritan eRIC G4
###############################################################################

###############################################################################
# Pragmas
###############################################################################
use strict;
use warnings;

###############################################################################
# Dependencies
###############################################################################
use Getopt::Std;
use Net::Telnet;
use Switch;

###############################################################################
# Global Variables
###############################################################################

###############################################################################
# Function Prototypes
###############################################################################
sub Main();
sub PowerOn($);
sub PowerOff($);
sub Usage();

Main();

###############################################################################
# Main ()
###############################################################################
sub Main()
{
	#######################################################################
	# Parameters:
	#
	# In:	None
	# Out:	None
	#######################################################################

	#######################################################################
	# Local Variables
	#######################################################################
	my $Telnet;
	my %Opts;

	#######################################################################
	# Body
	#######################################################################

	getopts('ha:l:o:p:', \%Opts);

	if (	defined($Opts{h}) or
		not
		(
			defined ($Opts{a}) and
			defined ($Opts{l}) and
			defined ($Opts{p})
		)
	)
	{
		Usage();
		exit 0;
	}

	$Telnet = new Net::Telnet (Timeout => 20, Prompt => '/eSH\> /');
	eval
	{
		$Telnet -> open ($Opts{a});
	};

	if ($@)
	{
		print "FAILED: $@\n" if ($ENV{DEBUG});
		exit 1;
	}

	$Telnet -> login ($Opts{l}, $Opts{p});

	unless ($Opts{o})
	{
		$Opts{o} = 'reboot';
	}

	switch ($Opts{o})
	{
		case 'on'
		{
			PowerOn($Telnet);
		}

		case 'off'
		{
			PowerOff($Telnet);
		}

		case 'reboot'
		{
			PowerOff($Telnet);
			sleep 5;
			PowerOn($Telnet);
		}
	}

	exit(0);
}

###############################################################################
# Usage ()
###############################################################################
sub Usage()
{
	#######################################################################
	# Parameters:
	#
	# In:	None
	# Out:	None
	#######################################################################

	#######################################################################
	# Local Variables
	#######################################################################

	#######################################################################
	# Body
	#######################################################################

	print '
Usage:

fence_eric [options]

Options:
  -a <ip>          IP address or hostname of eRIC
  -h               usage
  -l <name>        Login name
  -o <string>      Action: reboot (default), off or on
  -p <string>      Login password

CCS Options:
  action = "string"      Action: reboot (default), off or on
  ipaddr = "ip"          IP address or hostname of eRIC
  login  = "name"        Login name
  passwd = "string"      Login password

';

}

###############################################################################
# PowerOff ($Telnet)
###############################################################################
sub PowerOff($)
{
	#######################################################################
	# Parameters:
	#
	# In:	$Telnet
	# Out:	$Success
	#######################################################################
	my $Telnet = $_[0];

	#######################################################################
	# Local Variables
	#######################################################################
	my @Lines = undef;
	my $Line;

	#######################################################################
	# Body
	#######################################################################

	@Lines = $Telnet -> cmd ('power info');
	if ($Lines[0] eq "The server is powered off.\n")
	{
		print "SUCCESS: OFF\n" if ($ENV{DEBUG});
		return;
	}
	else
	{
		$Telnet -> put ("power off\n");
		$Telnet -> getline();
		$Line = $Telnet -> getline();

		if ($Line eq "Warning: This may result in data loss on the server!\n")
		{
			$Telnet -> put ("y\n");
		}
		else
		{
			chomp($Line);
			print "FAILED: Expected 'Warning: This may result in data loss on the server!' but got '$Line'!\n" if ($ENV{DEBUG});
			exit 1;
		}		
	}

	$Telnet -> getline();
	$Telnet -> getline();
	$Telnet -> getline();

	$Telnet -> cmd ("power info");
	$Telnet -> getline();
	$Line = $Telnet -> getline();

	if ($Line eq "The server is powered off.\n")
	{
		print "SUCCESS: OFF\n" if ($ENV{DEBUG});
		return;
	}
	else
	{
		print "FAILED: Status reads: $Line" if ($ENV{DEBUG});
		exit 1;
	}

}

###############################################################################
# PowerOn ($Telnet)
###############################################################################
sub PowerOn($)
{
	#######################################################################
	# Parameters:
	#
	# In:	$Telnet
	# Out:	None
	#######################################################################
	my $Telnet = $_[0];

	#######################################################################
	# Local Variables
	#######################################################################
	my @Lines = undef;
	my $Line;

	#######################################################################
	# Body
	#######################################################################

	$Telnet -> cmd ('');
	@Lines = $Telnet -> cmd ('power info');
	@Lines = $Telnet -> cmd ('power info');

	if ($Lines[0] eq "The server is powered on.\n")
	{
		print "SUCCESS: ON\n" if ($ENV{DEBUG});
		return;
	}
	else
	{
		@Lines = $Telnet -> cmd ('power on');
	}

	$Telnet -> cmd ('');
	@Lines = $Telnet -> cmd ('power info');
	@Lines = $Telnet -> cmd ('power info');

	if ($Lines[0] eq "The server is powered on.\n")
	{
		print "SUCCESS: ON\n" if ($ENV{DEBUG});
		return;
	}
	else
	{
		print "FAIL: Status reads: '$Lines[0]'\n" if ($ENV{DEBUG});
		exit 1;
	}
}
