Net: : Telnet: : Cisco

From Teknologisk videncenter
Jump to: navigation, search

Net::Telnet::Cisco er et Perl modul som er beregnet til at koble op imod Cisco udstyr.


Eksempel 1

#!/usr/bin/env perl

use Net::Telnet::Cisco;

my $backup_host  = "201.1.1.201";
my @devices = ( "H1R1", "H1R2", "H1R3", "H2R1", "H2R2", "H2R3", "H3R1", "H3R2",
                "H3R3", "H4R1", "H4R2", "H4R3", "H1S", "H2S", "H3S", "H4S", "BGPS" );

  foreach (@devices) {

    print "Session oprettes til $_\n";

    my $session = Net::Telnet::Cisco->new(Host => $_,
        Input_log => "/tmp/input-log.$_",
	Timeout => 60);

    print "der logges ind paa   $_\n";
    #Login via Telnet med passwordet cisco
    if ( ! $session->login('login', 'cisco') ) {
       print ("ADVARSEL: Der kunne ikke skabes kontakt til: $_\n");
    } else {
      # Enable mode (Password cisco)
      if ($session->enable("cisco") ) {
          @output = $session->cmd("copy running-config tftp:\n$backup_host\n$_-config\n");
          print "@output\n"; # Vis på skærmen hvad der sker
      } else {
          warn "Can't enable: " . $session->errmsg;
      }
    $session->close;
    }
  }

Eksempel 2

#!/usr/bin/perl -w
use strict;

use Net::Ping;
use Net::Telnet::Cisco;

my @output;
my $logfile = 'C:\temp\logfile';
my $session; # Til at holde Net::Telnet::Cisco instans
my $backup_host  = "201.1.1.201";
######## Status info
my $ciscoConfReg;
my $ciscoIOS;
my $ciscoIOSfile;
my $ciscoFlashSize;
my $ciscoMemSize;
my $ciscoModel;
#####################
#
# INIT

if ( ! open EUC_LOG, ">> $logfile" ) {
  die "Kan ikke åbne logfil";
} else {
  info(101, "Running.\n");
}

     my @devices = ( "192.168.22.50","80.80.12.112","192.168.22.51","marswan" );
  #system "cls";
  foreach (@devices) {

    #print "Session oprettes til $_\n";
    if ( icmpOnline($_) ) {
        print "$_ OK\n";
    } else {
        print "$_ offline....\n";
        warning( 101, "Pingtest: $_ offline");
    }
  }
  if ( ciscoLogin('192.168.22.50', 'cisco') ) {
    print "session: $session\n";
    ciscoGetInfo();
    ciscoClose();
    print "Model: $ciscoModel\nConfReg: $ciscoConfReg\nMemory: $ciscoMemSize MB\n Flash: $ciscoFlashSize MB\nIOS: $ciscoIOS\nFile: $ciscoIOSfile\n";

  } else {
    print "Der kunne ikke logges ind\n";
    warning( 102, "Der kunne ikke logges ind på host");
  }

sub icmpOnline {
  my $ping_instance;
  my $host = shift;
    $ping_instance = Net::Ping->new('icmp' , 1);
    if ($ping_instance->ping($host) ) {
        return 1;
    } else {
        return 0;
    }
}

sub ciscoCommand {
    my $command=shift;
    my @result;

    @result = $session->cmd($command);
    return @result;
}


sub ciscoLogin {
    my $host = shift;
    my $password = shift;
    $session = Net::Telnet::Cisco->new(Host => $host,
        Input_log => "C:\\temp\\input-log.$host",
	Timeout => 60,
	Errmode => "return");
    if ( ! $session->login('login', $password ) ) {
       warn ("ADVARSEL: Der kunne ikke skabes kontakt til: $host\n");
       return 0;
    } else {
      # Enable mode
      if ($session->enable( $password ) ) {
          #@output = $session->cmd("configure terminal\n");
         $session->cmd("terminal lenght 0");
      } else {
          warn "Can't enable: " . $session->errmsg;
          return 0;
      }
    return 1; # Success
    }
}

sub ciscoClose {
    if ( !$session->close ) {
        warning( 103, "Kan ikke logge af: ");
    }
}
sub ciscoGetInfo {
    my @output = ciscoCommand('show version');
    foreach (@output) {
        if ( $_ =~ m/\S+\s+(\S+).+\(revision.+/ ) {
            $ciscoModel = $1;
        }
        if ( $_ =~ m/Configuration register is (\S+)/ ) {
            $ciscoConfReg = $1;
        }
        if ( $_ =~ m/\(revision \S+\s+\S+\s+(\d+)K\/(\d+)K/ ) {
            $ciscoMemSize = int(($1+$2)/1024);
        }
        if ( $_ =~ m/(\d+)K.*flash/ ) {
            $ciscoFlashSize = int($1/1024);
        }
        if ( $_ =~ m/(IOS.*)/ ) {
            $ciscoIOS = $1;
        }
        if (  $_ =~ m/System image file is ".*:(.*)"/ ) {
            $ciscoIOSfile = $1;
        }
    }

}

sub info {
my($arg1, $arg2) = @_;
print EUC_LOG "INFO...: ", tid(), " nummer: ", $arg1, " -> ", $arg2, "\n";
print "INFO: ", $arg2, "\n";
}

sub warning {
my $arg1 = shift;
my $arg2 = shift;
print EUC_LOG "WARNING: ", tid(), " nummer: ", $arg1, " -> ", $arg2, "\n";
print "WARNING: ", $_[1],"\n";
}

sub error {
my $arg1 = shift;
my $arg2 = shift;
print EUC_LOG "ERROR..: ", tid(), " nummer: ", $arg1, " -> ", $arg2, "\n";
print "ERROR: ", $arg2, "\n";
}

sub tid {
my @mon_abbr =
      qw( Jan Feb Mar Apr Maj Jun Jul Aug Sep Okt Nov Dec );

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);

return sprintf " %02i:%02i:%02i %2i. %s %4i ", $hour, $min, $sec,
	$mday, $mon_abbr[$mon], $year+1900;
}

Eksempel 3 - findMacPort

#!/usr/bin/perl
######################
# Program name:
#
# Abstract....:
#
# Author......: Henrik Thomsen/Mercantec
# Email.......: heth@mercantec.dk
######################
use strict;
use warnings;
use Net::Telnet::Cisco;

my $description=findMacPort("192.168.22.202","cisco","0021.869f.c355");
print "FindMacPort sagde: $description\n";




sub findMacPort {
  my $IP=shift;
  my $PW=shift;
  my $MAC=shift;
  my $PORT;
  my $session = Net::Telnet::Cisco->new(Host => $IP);
  $session->login('login', $PW);
  # Execute a command
  my @output = $session->cmd('show mac-address dynamic');
  foreach my $linje (@output) {
    # Find linien hvor MAC addressen står
    if ( $linje =~ /$MAC/ ) {
    	#Find sidste ord på linjen fx. Fa0/11
        $linje =~ /.*?(\S+)$/;
        $PORT=$1;
    }
  }

  # Enable mode
  if ($session->enable($PW) ) {
      @output = $session->cmd("show run int $PORT");
      foreach my $linje (@output) {
      	# Find linie hvor første ord er description og husk beskrivelsen i $1
        if ( $linje =~ /^\s+description(.*)/ ) {
           $session->close;
           return($1);
        }
      }
  } else {
      warn "Can't enable: " . $session->errmsg;
  }
  $session->close;

}