[rancid] #' in my login banner

heasley heas at shrubbery.net
Tue Dec 24 06:59:47 UTC 2013


Thu, Dec 19, 2013 at 11:48:57AM +0200, Alan McKinnon:
> One possibility is to ignore any line with 2 or more #, and assume that
> it's a banner. This is the command case.
> 
> Login and command prompts contain ">" or "#", but always only one.
> 
> This way, code can discard lines that are known to NOT be the prompt.
> It's not 100% failproof but it is an improvement over the blind match we
> currently have.
> 
> 
> On 19/12/2013 10:26, Jan Dahl wrote:
> > Maybe if we could somehow define an "ignored" string? I have a couple
> > of thousand switches with this in the login banner, which I won't be
> > allowed to change any time soon:
> > 
> >                   ######    ######   #     #
> >                   #     #   #        #     #
> >                   #     #   ######    #   #
> >                   #     #        #     # #
> >                   ######    ######      #
> > 
> > Is it un-clever? Indeed! But it has been rolled out world wide before
> > I started here and now I can't use rancid.
> > 
> > The really weird thing for me is that somehow, terminal length and
> > width are set at the right time, but none of my commands are pushed
> > after that.
> > 
> > Kind regards,
> > 
> > Jan
> > 
> > On Wed Dec 11 18:24:32 UTC 2013, Allan McKinnon wrote:
> > 
> > On 11/12/2013 20:14, Per-Olof Olsson wrote:
> >> Hello
> >>
> >>
> >>
> >>
> >> On 12/11/2013 06:51 PM, Alan McKinnon wrote:
> >>> I see no-one has responded with an answer to your question.
> >>>
> >>> I think the reason is that code cannot deal with ">" and "#" characters
> >>> in a banner in any sane way that gives consistent results. For rancid to
> >>> function properly, it has to know what the shell prompt is exactly for a
> >>> given device, and to do that it has to parse the entire text output.
> >>>
> >>> The only tool available to detect the prompt is pattern matching which
> >>> inevitably means a regex. As a perl regex this is
> >>>
> >>> ^[-a-zA-Z0-9]*[>#]
> >>>
> >>> and that's assuming the prompt is the hostname.
> >>
> >> In hlogin I added
> >>
> >> -re "\[#>]+.*\[\n\r]+" {
> >> exp_continue
> >> }
> >>
> >> to just pass over none prompter # and >.
> >> Banner "#" and ">" is followed by CR or NL!
> > 
> > 
> > 
> > Only if the banner has a surrounding box made of > or #
> > 
> > One can always come up with a scheme that just happens to work for
> > oneself because local rules specify some exact format where you can get
> > a regex to work for you.
> > 
> > That's a lot of work though. I find it easier to just change the banner.
> > 
> > 
> > 
> > 
> >>
> >> Works for HPs
> >>
> >> /Peo
> >> ----------------------------------------------------------
> >> Per-Olof Olsson               Email: peo at chalmers.se
> >> Chalmers tekniska högskola    IT-service
> >> Hörsalsvägen 5                412 96 Göteborg
> >> Tel: 031/772 6738  Fax: 031/772 8660
> >> ----------------------------------------------------------
> >> _______________________________________________
> >> Rancid-discuss mailing list
> >> Rancid-discuss at shrubbery.net
> >> http://www.shrubbery.net/mailman/listinfo/rancid-discuss
> >>
> >>
> > 
> > 
> 
> 
> -- 
> Alan McKinnon
> alan.mckinnon at gmail.com
> 
> _______________________________________________
> Rancid-discuss mailing list
> Rancid-discuss at shrubbery.net
> http://www.shrubbery.net/mailman/listinfo/rancid-discuss

This adds a 'prompt', or i suppose "initial prompt", directive to cloginrc,
so something like this could be added to cloginrc:

	add prompt hostglob	{^[^\n\r#]+#}

it still has an odor from my pov, but it would work for the case at hand.

Index: bin/clogin.in
===================================================================
--- bin/clogin.in	(revision 2761)
+++ bin/clogin.in	(working copy)
@@ -581,6 +581,7 @@
 				  send_user "\nError: Invalid login: $router\n";
 				  catch {close}; catch {wait}; return 1
 				}
+	-re "\[^\r\n]*\[\r\n]+"	{ exp_continue; }
      }
     }
 
@@ -763,7 +764,10 @@
     }
 
     # Default prompt.
-    set prompt "(>|#| \\(enable\\))"
+    set prompt [join [find prompt $router] ""]
+    if { [llength $prompt] == 0 } {
+	set prompt "(>|#| \\(enable\\))"
+    }
 
     # look for noenable option in .cloginrc
     if { [find noenable $router] == "1" } {
@@ -902,9 +906,10 @@
     }
     # we are logged in, now figure out the full prompt
     send "\r"
+    regsub -all {^(\^*)(.*)} $prompt {\2} reprompt
     expect {
 	-re "\[\r\n]+"		{ exp_continue; }
-	-re "^(.+\[:.])1 ($prompt)" { # stoopid extreme cmd-line numbers and
+	-re "^(.+\[:.])1 ($reprompt)" { # stoopid extreme cmd-line numbers and
 				  # prompt based on state of config changes,
 				  # which may have an * at the beginning.
 				  set junk $expect_out(1,string)
@@ -913,7 +918,7 @@
 				  set prompt ".? ?$junk\[0-9]+ $expect_out(2,string)";
 				  set platform "extreme"
 				}
-	-re "^.+$prompt"	{ set junk $expect_out(0,string);
+	-re "^.+$reprompt"	{ set junk $expect_out(0,string);
 				  regsub -all "\[\]\[\(\)]" $junk {\\&} prompt;
 				}
     }



More information about the Rancid-discuss mailing list