#=============================================================================== # 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, 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;