]> git.puffer.fish Git - mirror/frr.git/commitdiff
Add code to extract.pl.in to prevent further cli function overwrites
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 10 Jun 2015 00:22:42 +0000 (20:22 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 30 May 2016 00:29:58 +0000 (20:29 -0400)
Currently extract.pl.in is used to build the vtysh cli.  When two
different cli's collide with the same command name, the original
cli is never called, because it is dropped.  This code notes the
silent drop and tracks the number of drops.  If they change then
the code will fail the build.  The current number of drops was
figured out by running extract.pl and counting up the drops
then adding code to compare the numbers returned.

If you have added to the problem, the solution is to fix your cli
command to not stomp on someone else's command.  If you have removed
a stomp, safely modify extract.pl.in as part of your commit.

Signed-off-by: Donald Sharp <sharpd at cumulusnetworks.com>
Acked-by: Vincent Jardin <vincent.jardin@6wind.com>
vtysh/extract.pl.in

index 2621cf8f56aca38822a26f941b64fcd5402a4efd..7f9a2514c5072a5d4eaccca8c89cfd8c0fc7304e 100755 (executable)
@@ -63,6 +63,8 @@ $ignore{'"terminal monitor"'} = "ignore";
 $ignore{'"terminal no monitor"'} = "ignore";
 $ignore{'"show history"'} = "ignore";
 
+my $cli_stomp = 0;
+
 foreach (@ARGV) {
     $file = $_;
 
@@ -151,7 +153,13 @@ foreach (@ARGV) {
         $defun_array[1] = $cmd . "_vtysh";
         $defun_body = join (", ", @defun_array);
 
-        # $cmd -> $str hash for lookup
+       # $cmd -> $str hash for lookup
+       if (exists($cmd2str{$cmd})) {
+           warn "Duplicate CLI Function: $cmd\n";
+           warn "\tFrom cli: $cmd2str{$cmd} to New cli: $str\n";
+           warn "\tOriginal Protocol: $cmd2proto{$cmd} to New Protocol: $protocol\n";
+           $cli_stomp++;
+       }
         $cmd2str{$cmd} = $str;
         $cmd2defun{$cmd} = $defun_body;
         $cmd2proto{$cmd} = $protocol;
@@ -192,6 +200,27 @@ foreach (@ARGV) {
     }
 }
 
+my $bad_cli_stomps = 109;
+# Currently we have $bad_cli_stomps.  This was determined by
+# running this script and counting up the collisions from what
+# was returned.
+#
+# When we have cli commands that map to the same function name, we
+# can introduce subtle bugs due to code not being called when
+# we think it is.
+#
+# If extract.pl fails with a error message and you've been
+# modifying the cli, then go back and fix your code to
+# not have cli command function collisions.
+#
+# If you've removed a cli overwrite, you can safely subtract
+# one from $bad_cli_stomps.  If you've added to the problem
+# please fix your code before submittal
+if ($cli_stomp != $bad_cli_stomps) {
+    warn "Expected $bad_cli_stomps command line stomps, but got $cli_stomp instead\n";
+    exit $cli_stomp;
+}
+
 # Check finaly alive $cmd;
 foreach (keys %odefun) {
     my ($node, $str) = (split (/,/));