[rancid] [PATCH] Nortel/Avaya BayStack/ERS support
heasley
heas at shrubbery.net
Sun Mar 24 16:09:44 UTC 2019
Thu, Feb 21, 2019 at 06:53:07PM +0000, Anderson, Charles R:
> The attached files add support for Bay Networks/Nortel/Avaya BayStack/BPS/ERS switches. I based these changes on ones we've been running in production for over a decade and I've tested this extensively on models BPS 2000, 470, and ERS 25xx/45xx/55xx/56xx.
>
> Initially I copied clogin to bslogin, but I've attached a diff from the original clogin because I believe it should be safe to apply to the original and eliminate the need for a separate login script. I rearranged a few conditionals related to Extreme support to make the logic easier for the BayStack and other future differences.
>
> It was a PITA to get past the BayStack login banner, but I finally found a workable solution that should hopefully not interfere with other device types and should support BayStacks that have the stock banner, a custom banner, or the banner turned off. The only potential concern for impact to non-BayStack devices is the matching on "##+" used to skip past the banner to avoid it being interpreted as a "#" prompt character. I'm now running this in production as my "clogin" and so far there have been no impacts to Aruba devices, the only other devices I have that use clogin.
Has, or can, anyone test this module to verify that it works well? I have
none of these devices to test.
> rancid.types.conf entry:
>
> # Nortel BayStack
> baystack;script;rancid -t baystack
> baystack;login;clogin
> baystack;module;baystack
> baystack;inloop;baystack::inloop
> baystack;command;baystack::ShowSysInfo;show sys-info
> baystack;command;baystack::ShowSysInfo;show stack-info
> baystack;command;baystack::ShowSysInfo;show system verbose
> baystack;command;baystack::ShowSysInfo;show interfaces gbic-info
> baystack;command;baystack::ShowConfig;show running-config
> --- /usr/libexec/rancid/clogin 2019-02-06 02:03:27.000000000 -0500
> +++ /usr/local/libexec/rancid/bslogin 2019-02-20 15:40:04.747945375 -0500
> @@ -1,7 +1,5 @@
> #! /usr/bin/expect --
> ##
> -## $Id: clogin.in 3943 2019-01-18 16:18:34Z heas $
> -##
> ## rancid 3.9
> ## Copyright (c) 1997-2018 by Henry Kilmer and John Heasley
> ## All rights reserved.
> @@ -46,7 +44,8 @@
> # The original looking glass software was written by Ed Kern, provided by
> # permission and modified beyond recognition.
> #
> -# clogin - Cisco login
> +# bslogin - Bay Networks/Nortel/Avaya BayStack/BPS/ERS login script
> +# Supports models BPS 2000, 470, ERS 25xx/45xx/55xx/56xx.
> #
> # Most options are intuitive for logging into a Cisco router.
> # The default is to enable (thus -noenable). Some folks have
> @@ -646,6 +645,23 @@
> -re "Press the <tab> key \[^\r\n]+\[\r\n]+" {
> exp_continue
> }
> + -re "##+" {
> + # BayStacks have a default banner that spells out NORTEL or AVAYA in huge
> + # letters made from ## that look like prompt characters, so we need to skip
> + # over them.
> + exp_continue
> + }
> + -re "Enter Ctrl-Y to begin" {
> + # After the default or custom banner, BayStacks prompt for Ctrl-Y and
> + # then display a static banner with model and version info surrounded
> + # by an asterisk border. Discard the top and bottom of the border and
> + # send a Ctrl-Y and remember that this is a baystack for logout procedure.
> + set platform "baystack"
> + expect -ex "***************************************************************" {}
> + expect -ex "***************************************************************" {}
> + send "\031"
> + exp_continue
> + }
> -re "@\[^\r\n]+ $p_prompt" {
> # ssh pwd prompt
> sleep 1
> @@ -803,10 +819,16 @@
> return 0
> }
>
> - if { [string compare "extreme" "$platform"] } {
> - send -h "exit\r"
> - } else {
> + if { ![string compare "extreme" "$platform"] } {
> send -h "quit\r"
> + } elseif { ![string compare "baystack" "$platform"] } {
> + # BayStacks use logout to completely exit, but they
> + # can also exit back to a menu interface, so send L
> + # to logout from the menu too just in case.
> + send -- "logout\r"
> + send -- "L"
> + } else {
> + send -h "exit\r"
> }
> expect {
> -re "^\[^\n\r *]*$reprompt" {
> @@ -1058,7 +1080,15 @@
> }
> }
> if { $do_command || $do_script } {
> - if { [string compare "extreme" "$platform"] } {
> + if { ![string compare "extreme" "$platform"] } {
> + send "disable clipaging\r"
> + expect -re $prompt {}
> + } elseif { ![string compare "baystack" "$platform"] } {
> + send -- "terminal length 0\r"
> + expect -re $prompt {}
> + send -- "terminal width 131\r"
> + expect -re $prompt {}
> + } else {
> # If the prompt is (enable), then we are on a cataylyst switch and
> # the command is "set length 0"; otherwise its "terminal length 0".
> if [regexp -- ".*> .*enable" "$prompt"] {
> @@ -1073,9 +1103,6 @@
> send "terminal width 132\r"
> }
> expect -re $prompt {}
> - } else {
> - send "disable clipaging\r"
> - expect -re $prompt {}
> }
> }
> if { $do_command } {
> package baystack;
> ##
> ## rancid 3.9
> ## Copyright (c) 1997-2018 by Henry Kilmer and John Heasley
> ## 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 Henry Kilmer, John Heasley 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
> #
> # baystack.pm - Bay Networks/Nortel/Avaya BayStack rancid procedures
> #
>
> use 5.010;
> use strict 'vars';
> use warnings;
> require(Exporter);
> our @ISA = qw(Exporter);
> $Exporter::Verbose=1;
>
> use rancid 3.9;
>
> @ISA = qw(Exporter rancid main);
> #our @EXPORT = qw($VERSION)
>
> # load-time initialization
> sub import {
> 0;
> }
>
> # post-open(collection file) initialization
> sub init {
> # add content lines and separators
> ProcessHistory("","","","!RANCID-CONTENT-TYPE: $devtype\n!\n");
>
> 0;
> }
>
> # main loop of input of device output
> sub inloop {
> my($INPUT, $OUTPUT) = @_;
> my($cmd, $rval);
>
> TOP:
> while(<$INPUT>) {
> tr/\015//d;
> if ( (/(>|#)\s?logout/) || $found_end ) {
> print STDERR "Found logout statement, ending\n" if ($debug);
> delete($commands{'logout'});
> $clean_run=1;
> last;
> }
> if (/^Error:/) {
> print STDOUT ("$host bslogin error: $_");
> print STDERR ("$host bslogin error: $_") if ($debug);
> $clean_run=0;
> last;
> }
> while (/(^.*[>|#])\s*($cmds_regexp)\s*$/) {
> $cmd = $2;
> print STDERR "Doing $cmd\n";
> if (!defined($prompt)) {
> $prompt = $1;
> 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;
> }
> print STDERR "Calling \"$cmd\"\n" if ($debug);
> $rval = &{$commands{$cmd}}($INPUT, $OUTPUT, $cmd);
> delete($commands{$cmd});
> if ($rval == -1) {
> $clean_run = 0;
> last TOP;
> }
> }
> }
> }
>
> # This routine parses "show running-config"
> sub ShowConfig {
> my($INPUT, $OUTPUT, $cmd) = @_;
> my($lines) = 0;
> print STDERR " In ShowConfig: $_" if ($debug);
>
> ProcessHistory("","","","! $_");
>
> # baystacks refuse to turn off linewrapping, so we have to
> # carefully reconstruct the unwrapped line
> my $line = '';
> my $bit;
> while ($bit = <$INPUT>) {
> $bit =~ tr/\015//d;
> if (length($bit) >= 132) {
> # tack onto previous
> chomp($line);
> $line .= $bit;
> } else {
> if ($line) {
> chomp($line);
> $line .= $bit;
> } else {
> $line = $bit;
> }
> $line =~ tr/\015//d;
>
> if ($line =~ /^\s*\^\s*$/) {
> $line = '';
> next;
> }
> return(1) if $line =~ /invalid command name/;
> return(1) if $line =~ /Invalid input detected at/;
>
> if ($line =~ /^$prompt/) {
> print STDERR "Found prompt, finishing ShowConfig\n" if ($debug);
> $found_end++;
> last;
> }
>
> $lines++;
>
> if ($line =~ /^! clock set /) {
> ProcessHistory("","","","! clock set \n");
> $line = '';
> next;
> }
>
> if ($filter_pwds >= 1) {
> if ($line =~ /(cli password .* read-.*\b )/) {
> ProcessHistory("","","","! $1<removed>\n");
> $line = '';
> next;
> } elsif ($line =~ /(radius-server (key|password) )/) {
> ProcessHistory("","","","! $1<removed>\n");
> $line = '';
> next;
> }
> }
>
> if ($filter_commstr) {
> if ($line =~ /(snmp-server community ).*( r[o|w])/) {
> ProcessHistory("","","","! $1<removed>$2\n");
> $line = '';
> next;
> }
> }
>
> ProcessHistory("","","","$line");
> $line = '';
> }
> }
>
> $_ = $line;
>
> if ($lines < 3) {
> printf(STDERR "ERROR: $host configuration appears truncated.\n");
> $found_end = 0;
> return(-1);
> }
>
> return(0);
> }
>
> # This routine parses "show sys-info" and "show stack-info"
> sub ShowSysInfo {
> my($INPUT, $OUTPUT, $cmd) = @_;
> print STDERR " In ShowSysInfo: $_" if $debug;
> print STDERR " prompt is \"$prompt\"\n" if $debug;
>
> while(<$INPUT>){
> tr/\015//d;
>
> next if /^\s*\^\s*$/;
> return(1) if /invalid command name/;
> return(1) if /Invalid input detected at/;
>
> next if /Reset Count:/;
> next if /Last Reset Type:/;
> next if /sysUpTime:/;
> next if /sysNtpTime/;
> next if /sysRtcTime/;
>
>
> if(/^$prompt/){
> print STDERR "Found prompt, finishing ShowSysInfo\n" if $debug;
> ProcessHistory("SYSINFO","","","! \n");
> return(0);
> }
> ProcessHistory("SYSINFO","","","!SYSINFO: $_");
> }
>
> ProcessHistory("SYSINFO","","","! \n");
> return(0);
> }
>
> 1;
More information about the Rancid-discuss
mailing list