#=============================================================================== # FILE: CiscoIOS.pm # # DESCRIPTION: Contains subs for common IOS operations # AUTHOR: Jess Portnoy # 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, Transport => $protocol, ); if ($debug){ # give verbose output whilst we run this script $session_obj->input_log(*STDOUT); } # try to login to the ios device, ignoring host check $session_obj->connect( Name => $ios_username, Password => $ios_password, SHKC => 0 ); # drop in to enable mode $session_obj->begin_privileged($ios_enable_password); return $session_obj; } sub ifup { my ($session_obj,@ios_ifs)=@_; 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_ifs)=@_; 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;