[rancid] Ignore differences in certain lines?

Alan McKinnon alan.mckinnon at gmail.com
Thu Jul 24 18:19:52 UTC 2014

On 24/07/2014 17:48, Aaron Wasserott wrote:
>>> Trying to capture 'show interface status' output from Cisco IOS 
>>> switches, but ignore the output for diff purposes. Is that possible? I 
>>> guess it would have to be part of the mailer function to not send 
>>> output for certain lines.
>>> I copied the ShowVLAN sub-routine because it already appends ! in 
>>> front of the lines, so they are not considered config lines. But right 
>>> now I can't even get the output captured.
>>> This is the new sub I am using:
>>> # This routine parses "show interface status"
>>> sub ShowIntStat {
>>>     print STDERR "    In ShowIntStat: $_" if ($debug);
>>>     #($_ = <INPUT>, return(1)) if (!$DO_SHOW_INT_STAT);
>>>     while (<INPUT>) {
>>>         tr/\015//d;
>>>         last if (/^$prompt/);
>>>         next if (/^(\s*|\s*$cmd\s*)$/);
>>>         return(1) if /^\s*\^\s*$/;
>>>         return(1) if /Line has invalid autocommand /;
>>>         return(1) if /(Invalid input detected|Type help or )/;
>>>         return(1) if /Ambiguous command/i;
>>>         # newer releases (~12.1(9)) place the vlan config in the normal
>>>         # configuration (write term).
>>>         #return(1) if ($type =~ /^(3550|4500)$/);
>>>         #return(1) if ($type !~ /^(2900XL|3500XL|6000)$/);
>>>         return(-1) if (/command authorization failed/i);
>>>         # the pager can not be disabled per-session on the PIX
>>>         if (/^(<-+ More -+>)/) {
>>>             my($len) = length($1);
>>>             s/^$1\s{$len}//;
>>>         }
>>>         ProcessHistory("COMMENTS","keysort","IO","!INT: $_");
>>>     }
>>>     ProcessHistory("COMMENTS","keysort","IO","!\n");
>>>     return(0);
>>> }
>> Did you add corresponding entries to @command in the rancid script to match your new sub? Just follow the existing pattern, it's obvious how it must work.
> Yep I added this line to the commandtable in the rancid file.
> {'show interface status'        => 'ShowIntStat'},

that's correct, it's also the only extra step you need to do. The call
to clogin uses @commmand so it is guaranteed to be run on the switch

> It is picking it up, because if I rename the my sub-routine I see an error in the logs. So something inside the sub-routine is not parsing output right.
> I'll play around with it some more.

It's such a simple sub it's hard to see where it could do wrong.
If the ProcessHistory in the while loop is called, it will most
certainly record and output each line. So I can only assume the sub
exists early, or the switch output is odd somehow confusing the while.

My first crude debug steps would be to add a print statement just before
that ProcessHistory and run the script manually:

rancid -d <switch name from router.db>
and check you get as many prints on the console as there are lines in
"show interface status"

Then closely examine the switches output of "show interface status". The
form is simple:

- presence of the prompt signals end of output and the sub exits
- any line containing only whitespace and a carat is skipped
- any line containing the $cmd is skipped

> Thanks,
> -Aaron
> _______________________________________________
> Rancid-discuss mailing list
> Rancid-discuss at shrubbery.net
> http://www.shrubbery.net/mailman/listinfo/rancid-discuss

Alan McKinnon
alan.mckinnon at gmail.com

More information about the Rancid-discuss mailing list