[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