rancid-srlinux/srlinux.pm

219 lines
No EOL
6.4 KiB
Perl

package srlinux;
##
## rancid 3.11
## Copyright (c) 2023 by Nick Peelman
## All rights reserved.
##
## This code is derived from software contributed to and maintained by
## Henry Kilmer, John Heasley, Andrew Partan,
## Pete Whiting, Austin Schutz, and Andrew Fort.
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
## 1. Redistributions of source code must retain the above copyright
## notice, this list of conditions and the following disclaimer.
## 2. Redistributions in binary form must reproduce the above copyright
## notice, this list of conditions and the following disclaimer in the
## documentation and/or other materials provided with the distribution.
## 3. Neither the name of RANCID nor the names of its
## contributors may be used to endorse or promote products derived from
## this software without specific prior written permission.
##
## THIS SOFTWARE IS PROVIDED BY Nick Peelman AND CONTRIBUTORS
## ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
## TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
## PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COMPANY OR CONTRIBUTORS
## BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
## CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
## SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
## INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
## CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
## ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
## POSSIBILITY OF SUCH DAMAGE.
##
## It is the request of the authors, but not a condition of license, that
## parties packaging or redistributing RANCID NOT distribute altered versions
## of the etc/rancid.types.base file nor alter how this file is processed nor
## when in relation to etc/rancid.types.conf. The goal of this is to help
## suppress our support costs. If it becomes a problem, this could become a
## condition of license.
#
# The expect login scripts were based on Erik Sherk's gwtn, by permission.
#
# The original looking glass software was written by Ed Kern, provided by
# permission and modified beyond recognition.
#
# RANCID - Really Awesome New Cisco confIg Differ
#
# srlinux.pm - Nokia SRLinux rancid procedures
use 5.010;
use strict 'vars';
use warnings;
no warnings 'uninitialized';
require(Exporter);
our @ISA = qw(Exporter);
use rancid 3.11;
our $proc;
our $memoryseen;
@ISA = qw(Exporter rancid main);
#XXX @Exporter::EXPORT = qw($VERSION @commandtable %commands @commands);
# load-time initialization
sub import {
0;
}
# post-open(collection file) initialization
sub init {
$proc = "";
$memoryseen = 0;
# add content lines and separators
ProcessHistory("","","","#RANCID-CONTENT-TYPE: $devtype\n");
0;
}
# main loop of input of device output
sub inloop {
my($INPUT, $OUTPUT) = @_;
my($cmd, $rval);
TOP: while(<$INPUT>) {
tr/\015//d;
CMD: if (/[#]\s?quit\s*$/) {
$clean_run = 1;
last;
}
if (/^Error:/ &&
!(/^Error: Invalid parameter\./ || /^Error: Bad command\./)) {
print STDOUT ("$host clogin error: $_");
print STDERR ("$host clogin error: $_") if ($debug);
$clean_run = 0;
last;
}
while (/[#]\s*($cmds_regexp)\s*$/) {
$cmd = $1;
if (!defined($prompt)) {
print STDERR ("PROMPT LINE IS: $_\n") if ($debug);
$prompt = ($_ =~ /(\w[:][\w.@_()-:]+[#])\s?.*$/)[0];
print STDERR ("PROMPT MATCH: $prompt\n") if ($debug);
}
print STDERR ("HIT COMMAND:$_") if ($debug);
if (! defined($commands{$cmd})) {
print STDERR "$host: found unexpected command - \"$cmd\"\n";
$clean_run = 0;
last TOP;
}
if (! defined(&{$commands{$cmd}})) {
printf(STDERR "$host: undefined function - \"%s\"\n",
$commands{$cmd});
$clean_run = 0;
last TOP;
}
$rval = &{$commands{$cmd}}($INPUT, $OUTPUT, $cmd);
delete($commands{$cmd});
if ($rval == -1) {
$clean_run = 0;
last TOP;
}
if (defined($prompt)) {
if (/$prompt/) {
goto CMD;
}
}
}
}
}
# This routine parses "file cat /var/log/srlinux/srl_boot.log"
sub CatBootLog {
my($INPUT, $OUTPUT, $cmd) = @_;
print STDERR " In CatBootLog: $_" if ($debug);
while (<$INPUT>) {
tr/\015//d;
last if (/^$prompt/);
next if (/^(\s*|\s*$cmd\s*)$/);
next if (/^\s+\^$/);
return(-1) if (/error: invalid parameter/i);
return(-1) if (/minor: cli command not allowed for this user/i);
# if file doesn't exist, return 0
return(0) if (/minor: cli could not access file/i);
}
}
# This routine parses "show platform" commands
sub ShowPlatform {
my($INPUT, $OUTPUT, $cmd) = @_;
print STDERR " In ShowPlatform: $_" if ($debug);
$_ =~ s/ +/ /;
ProcessHistory("COMMENTS","keysort","C1","# $_");
while (<$INPUT>) {
tr/\015//d;
last if (/^$prompt/);
next if (/Temperature/i);
next if (/^--\{\s+\+?\s+\w+\s+\}--\[\s+\]--$/);
return(-1) if (/error: invalid parameter/i);
return(-1) if (/minor: cli command not allowed for this user/i);
ProcessHistory("COMMENTS","keysort","C1","# $_");
}
}
# This routine parses "info flat within the running context"
sub RunningConfig {
my($INPUT, $OUTPUT, $cmd) = @_;
print STDERR " In RunningConfig: $_" if ($debug);
ProcessHistory("","","","#\n# $_");
my($linecnt) = 0;
while (<$INPUT>) {
tr/\015//d;
$found_end = 1 if (/^$prompt/);
last if (/^$prompt/);
next if (/^--\{\s+\+?\s+\w+\s+\}--\[\s+\]--$/);
return(-1) if (/error: invalid parameter/i);
return(-1) if (/minor: cli command not allowed for this user/i);
s/echo \"(.*)\"/# $1/i;
$linecnt++;
# password/community filtering
if (/^(\s+community) "[^"]*" /) {
if ($filter_commstr) {
ProcessHistory("SNMPSERVERCOMM","","", "#$1 <removed> $'") &&
next;
} else {
ProcessHistory("SNMPSERVERCOMM","","","$_") && next;
}
}
if (/^(\s+trap-target\s+.*)\s+(notify-community)\s+("\S+")/) {
if ($filter_commstr) {
ProcessHistory("","","","#$1 $2 <removed>$'") && next;
} else {
ProcessHistory("","","","$_") && next;
}
}
if (/^(\s+password)\s+("\$\S+")/) {
if ($filter_pwds >= 2) {
ProcessHistory("","","","#$1 <removed>$'") && next;
} else {
ProcessHistory("","","","$_") && next;
}
}
ProcessHistory("","","","$_");
}
return(0);
}
1;