[rancid] clogin commenting script commands following multiple blanks lines

Erik Muller erikm at buh.org
Thu Oct 25 19:53:41 UTC 2018


On 10/24/18 18:32 , heasley wrote:
> Wed, Oct 24, 2018 at 09:19:31PM +0000, heasley:
>> 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.
> 
> ok; committed.  Either the alpha tarball or the svn repo.  Welcome testers,
> esp for palo alto, of which I have none.

That one was really close, but still didn't pass through ^; from command files properly.
After a bit more tweaking, the following change seems to get it to handle all my test cases correctly.

erikm at vpn41:~/ports-dev [15:21 - 1497]$ diff -Naur /opt/local/libexec/rancid/clogin-3.99.99.bak /opt/local/libexec/rancid/clogin-3.99.99
--- /opt/local/libexec/rancid/clogin-3.99.99.bak	2018-10-24 19:46:30.000000000 -0400
+++ /opt/local/libexec/rancid/clogin-3.99.99	2018-10-25 15:21:18.000000000 -0400
@@ -253,7 +253,8 @@
 	    }
 	    set cmd_text [read $cmd_fd]
 	    close $cmd_fd
-	    set command [join [split $cmd_text \n] \;]
+	    regsub -all {;} $cmd_text "\\;" cmd_text
+	    set command [join [split $cmd_text \n] \u002;]
 	    set do_command 1
 	# 'ssh -c' cypher type
 	} -y* {
@@ -444,13 +445,8 @@
 		continue;
 	    }

-	    # handle escaped ;s in commands, and ;; and ^;
-	    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 esccommand [escapecommandlist $command]
+	    set sep "\u002"
 	    set commands [split $esccommand $sep]
 	    set num_commands [llength $commands]
 	    set rshfail 0
@@ -724,6 +720,21 @@
     return 0
 }

+# handle escaped ;s in commands, and ;; and ^;
+proc escapecommandlist {command} {
+    # \; should be passed through as a ;
+    # ^; should be treated as a comment (when coming from a command file)
+    # ;; represents a literal ; before a subsequent command (?)
+    # other ;s are separators between items in a sequence of commands
+    # note this is processed as one big multiline text blob, so ^ anchors may
+    # not work as expected
+    regsub -all {([^\\\u002]);} $command "\\1\u002;" esccommand
+    regsub -all {([^\\\u00a\u00d\u002]);;} $esccommand "\\1;\u002;" command
+    regsub -all {\u002;} $command "\u002" esccommand
+    regsub -all {[\\];} $esccommand ";" command
+    return $command
+}
+
 # Run commands given on the command line.
 proc run_commands { prompt command } {
     global do_interact do_saveconfig in_proc platform
@@ -742,12 +753,7 @@
     # this is the only way i see to get rid of more prompts in o/p..grrrrr
     log_user 0

-    # handle escaped ;s in commands, and ;; and ^;
-    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 esccommand [escapecommandlist $command]
     set sep "\u002"
     set commands [split $esccommand $sep]
     set num_commands [llength $commands]




More information about the Rancid-discuss mailing list