#===============================================================================
#         FILE:  CiscoIOS.pm
#
#  DESCRIPTION: Contains subs for common IOS operations 
#       AUTHOR:  Jess Portnoy <kernel01@gmail.com> 
#      VERSION:  1.0
#      CREATED:  07/11/2011 09:34:53 AM
#     REVISION:  ---
#===============================================================================
package CiscoIOS;

use strict;
use warnings;


use Net::Appliance::Session;
use POSIX qw(strftime);
#use Data::Dumper;
use base 'Exporter';
our @EXPORT = qw(ios_connect ifup ifdown ifstat dump_conf terminate_session);


sub ios_connect
{
	my ($ios_device_ip,$ios_username,$ios_password,$ios_enable_password,$protocol,$debug)=@_;
	if (!defined $protocol){
		$protocol='SSH';	
	}
	my $session_obj = Net::Appliance::Session->new(
		 host      => $ios_device_ip,
		 personality => 'ios',
		 transport => $protocol,
	);

	if ($debug){
	# give verbose output whilst we run this script
	#	$session_obj->input_log(*STDOUT);
		$session_obj->set_global_log_at('debug');
	}
	# try to login to the ios device, ignoring host check
	$session_obj->connect(
		 username => $ios_username,
		 password => $ios_password,
		 SHKC => 0
	);
	 
	return $session_obj;
}

sub ifup
{
	my ($session_obj,$ios_enable_password,@ios_ifs)=@_;
	# drop in to enable mode
	$session_obj->begin_privileged($ios_enable_password);
	my @out;
	foreach my $if (@ios_ifs){
		$session_obj->cmd("conf t");
		$session_obj->cmd("inter $if ");
		$session_obj->cmd("no sh");
		$session_obj->cmd("exit");
		$session_obj->cmd("exit");
		push @out,$session_obj->cmd("write");
	}
	return \@out;
}

sub ifdown
{
	my ($session_obj,$ios_enable_password,@ios_ifs)=@_;
	# drop in to enable mode
	$session_obj->begin_privileged($ios_enable_password);
	my @out;
	foreach my $if (@ios_ifs){
		$session_obj->cmd("conf t");
		$session_obj->cmd("inter $if ");
		$session_obj->cmd("sh");
		$session_obj->cmd("exit");
		$session_obj->cmd("exit");
		push @out,$session_obj->cmd("write");
	}
	return \@out;
}
sub ifstat
{
	my ($session_obj,@ios_ifs)=@_;
	my @out;
	my $cnt=0;
	foreach my $if (@ios_ifs){
		push @out,$session_obj->cmd("show inter $if");
	}
	return \@out;
}
sub dump_conf
{
	my ($session_obj)=@_;
	my @out;
	$session_obj->cmd("term length 0");
	push @out,$session_obj->cmd("sh run");
	return \@out;
}
sub terminate_session
{
	my ($session_obj)=@_;
	#my $sshpid = $session_obj->childpid();
	$session_obj->close;
	#if (kill(0, $sshpid) > 0) {
	#	print STDERR ("Child SSH proc $sshpid is still running. Sending SIGTERM.\n");
	#	kill TERM => $sshpid;
	#	if (kill(0, $sshpid) > 0) {
	#		print STDERR ("Child SSH proc $sshpid is still running. Sending SIGKILL.\n");
	#		kill KILL => $sshpid;
	#	}
	#}
}
1;
