From: Donald Sharp Date: Wed, 10 Jun 2015 00:22:42 +0000 (-0400) Subject: Add code to extract.pl.in to prevent further cli function overwrites X-Git-Tag: frr-2.0-rc1~632 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=b623cda4f1485dd16da0bfc5f9a8ae931360b6eb;p=mirror%2Ffrr.git Add code to extract.pl.in to prevent further cli function overwrites 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 Acked-by: Vincent Jardin --- diff --git a/vtysh/extract.pl.in b/vtysh/extract.pl.in index 2621cf8f56..7f9a2514c5 100755 --- a/vtysh/extract.pl.in +++ b/vtysh/extract.pl.in @@ -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 (/,/));