[rancid] clogin commenting script commands following multiple blanks lines

heasley heas at shrubbery.net
Wed Oct 24 21:19:31 UTC 2018


Wed, Oct 24, 2018 at 04:43:41PM -0400, Erik Muller:
> On 10/24/18 13:28 , heasley wrote:
> > Sat, Sep 29, 2018 at 03:19:00PM -0700, Erik Muller:
> >> So here's an odd thing I just ran across.  Running clogin with a script with multiple blank lines has some very unexpected behaviour.  It looks like it's turning \n\n into \n;, with the net effect of commenting out any command that follows two blank lines.  Reproducible on ubuntu 12.04 and OSX 10.13 with stock 3.8 source.  Works as expected in 2.3.8 ubuntu packages.
> >>
> >> The culprit is definitely in the "# handle escaped ;s in commands, and ;; and ^;" section of clogin (rolling that block back to what was in 2.3.8 fixes it), but trying to grok that in expect language to provide a real fix makes my head hurt, so I'll leave this as a bug report.  Examples below.
> >>
> >> thanks,
> >> -e
> > 
> > I believe that patch addresses this bug.
> 
> 
> That definitely fixes the blanks-may-comment-the-next-line issue, though it looks like it also breaks handling of escaped ;s as well.
> 
> before:
> $ clogin-3.8 -c 'sh ip bgp nei | inc 1\; ; show ver | inc ^Model Num' fl1-as01
> ...
> fl1-as01#sh ip bgp nei | inc 1;
>   Route to peer address reachability Up: 1; Down: 0
>   Connections established 1; dropped 0
> 
> 
> with patch:
> $ clogin -c 'sh ip bgp nei | inc 1\; ; show ver | inc ^Model Num' fl1-as01
> ...
> fl1-as01#sh ip bgp nei | inc 1
> BGP neighbor is x.x.x.x,  remote AS 4200000000, external link
> 
> 
> 
> And it seems to eat leading semicolon comments as well:
> 
> $ cat ~/clogin-blanks-test2
> show bridge
> ; just a comment
> $ clogin -x ~/clogin-blanks-test2 fl1-as01.polaris.corp
> ...
> fl1-as01#show bridge
> fl1-as01#
> fl1-as01#
> fl1-as01#
> fl1-as01# just a comment
>           ^
> % Invalid input detected at '^' marker.
> 

I missed that in your example, but noticed it in testing...after I sent that
patch.  This is my final patch, i think.  I havent committed it yet, as I
want to review it once more.

Index: bin/clogin.in
===================================================================
--- bin/clogin.in	(revision 3909)
+++ bin/clogin.in	(working copy)
@@ -76,11 +76,12 @@
 	    }
 
 	    # handle escaped ;s in commands, and ;; and ^;
-	    regsub -all {([^\\]);;} $command "\\1;\u002;" esccommand
-	    regsub {^;} $esccommand "\u002;" command
-	    set sep "\\1\u001"
-	    regsub -all {([^\\])\;} $command "$sep" esccommand
-	    set sep "\u001"
+	    regsub -all {([^\\]);} $command "\\1\u002;" esccommand
+	    regsub -all {([^\\]);;} $esccommand "\\1;\u002;" command
+	    regsub {^;} $command "\u002;" esccommand
+	    regsub -all {[\\];} $esccommand ";" command
+	    regsub -all {\u002;} $command "\u002" esccommand
+	    set sep "\u002;"
 	    set commands [split $esccommand $sep]
 	    set num_commands [llength $commands]
 	    set rshfail 0
@@ -373,11 +374,12 @@
     log_user 0
 
     # handle escaped ;s in commands, and ;; and ^;
-    regsub -all {([^\\]);;} $command "\\1;\u002;" esccommand
-    regsub {^;} $esccommand "\u002;" command
-    set sep "\\1\u001"
-    regsub -all {([^\\])\;} $command "$sep" esccommand
-    set sep "\u001"
+    regsub -all {([^\\]);} $command "\\1\u002;" esccommand
+    regsub -all {([^\\]);;} $esccommand "\\1;\u002;" command
+    regsub {^;} $command "\u002;" esccommand
+    regsub -all {[\\];} $esccommand ";" command
+    regsub -all {\u002;} $command "\u002" esccommand
+    set sep "\u002"
     set commands [split $esccommand $sep]
     set num_commands [llength $commands]
     # the pager can not be turned off on the PIX, so we have to look
@@ -384,11 +386,7 @@
     # for the "More" prompt.  the extreme is equally obnoxious in pre-12.3 XOS,
     # with a global switch in the config.
     for {set i 0} {$i < $num_commands} { incr i} {
-	if { [lindex $commands $i] == "\u002" } {
-	    send -- "\r"
-	} else {
-	    send -- "[subst -nocommands [lindex $commands $i]]\r"
-	}
+	send -h -- "[subst -nocommands [lindex $commands $i]]\r"
 	expect {
 	    -re "^\b+"				{ exp_continue }
 	    -re "^\[^\n\r *]*$reprompt"		{ send_user -- "$expect_out(buffer)"



More information about the Rancid-discuss mailing list