From e9b1b3053a7e28f1d44d44600bd9da8cf8d9467d Mon Sep 17 00:00:00 2001 From: jostreff Date: Mon, 7 Apr 2025 18:01:33 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D1=8F=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=B0=20srlinux.pm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- srlinux.pm | 219 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 srlinux.pm diff --git a/srlinux.pm b/srlinux.pm new file mode 100644 index 0000000..8ea671d --- /dev/null +++ b/srlinux.pm @@ -0,0 +1,219 @@ +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 $'") && + next; + } else { + ProcessHistory("SNMPSERVERCOMM","","","$_") && next; + } + } + if (/^(\s+trap-target\s+.*)\s+(notify-community)\s+("\S+")/) { + if ($filter_commstr) { + ProcessHistory("","","","#$1 $2 $'") && next; + } else { + ProcessHistory("","","","$_") && next; + } + } + if (/^(\s+password)\s+("\$\S+")/) { + if ($filter_pwds >= 2) { + ProcessHistory("","","","#$1 $'") && next; + } else { + ProcessHistory("","","","$_") && next; + } + } + + ProcessHistory("","","","$_"); + } + + return(0); +} + +1; \ No newline at end of file