beaaf3316d
**- Why I did it** Earlier today we found a bug in the SONiC TSA implementation. TSC shows incorrect output (see below) in case we have a route-map which contains TSA route-map as a prefix. ``` admin@str-s6100-acs-1:~$ TSC Traffic Shift Check: System Mode: Not consistent ``` The reason is that TSC implementation has too loose regexps in TSA utilities, which match wrong route-map entries: For example, current TSC matches following ``` route-map TO_BGP_PEER_V4 permit 200 route-map TO_BGP_PEER_V6 permit 200 ``` But it should match only ``` route-map TO_BGP_PEER_V4 permit 20 route-map TO_BGP_PEER_V4 deny 30 route-map TO_BGP_PEER_V6 permit 20 route-map TO_BGP_PEER_V6 deny 30 ``` **- How I did it** I fixed it by using egrep with `^` and `$` regexp markers which match begin and end of the line. **- How to verify it** 1. Add follwing entry to FRR config: ``` str-s6100-acs-1# str-s6100-acs-1# conf t str-s6100-acs-1(config)# route-map TO_BGP_PEER_V4 permit 200 str-s6100-acs-1(config-route-map)# end ``` 2. Use the TSC command and check output. It should show normal. ``` admin@str-s6100-acs-1:~$ TSC Traffic Shift Check: System Mode: Normal```
44 lines
1014 B
Bash
Executable File
44 lines
1014 B
Bash
Executable File
#!/bin/bash
|
|
|
|
function check_installed()
|
|
{
|
|
c=0
|
|
e=0
|
|
config=$(vtysh -c "show run")
|
|
for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p');
|
|
do
|
|
echo "$config" | egrep -q "^route-map $route_map_name permit 20$"
|
|
c=$((c+$?))
|
|
e=$((e+1))
|
|
echo "$config" | egrep -q "^route-map $route_map_name deny 30$"
|
|
c=$((c+$?))
|
|
e=$((e+1))
|
|
done
|
|
return $((e-c))
|
|
}
|
|
|
|
check_installed
|
|
installed=$?
|
|
if [[ $installed -ne 0 ]];
|
|
then
|
|
TSB_FILE=$(mktemp)
|
|
for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p');
|
|
do
|
|
case "$route_map_name" in
|
|
*V4*)
|
|
;;
|
|
*V6*)
|
|
;;
|
|
*)
|
|
continue
|
|
;;
|
|
esac
|
|
sonic-cfggen -d -a "{\"route_map_name\":\"$route_map_name\"}" -t /usr/share/sonic/templates/bgpd/tsa/bgpd.tsa.unisolate.conf.j2 > "$TSB_FILE"
|
|
vtysh -f "$TSB_FILE"
|
|
rm -f "$TSB_FILE"
|
|
done
|
|
echo "System Mode: Maintenance -> Normal"
|
|
else
|
|
echo "System is already in Normal mode"
|
|
fi
|