1#!/bin/ksh 2PFCTL="${PFCTL:=/sbin/pfctl}" 3D=`dirname $1` 4A='regress' 5$PFCTL -a $A -FT 2>/dev/null 6$PFCTL -a $A -Fr 2>/dev/null 7KT_R=`vmstat -mv | awk '/pfrktable/{print $3}'` 8KT_I=`vmstat -mv | awk '/pfrktable/{print $5}'` 9KEP_R=`vmstat -mv | awk '/pfrke_plain /{print $3}'` 10KEP_I=`vmstat -mv | awk '/pfrke_plain /{print $5}'` 11KER_R=`vmstat -mv | awk '/pfrke_route /{print $3}'` 12KER_I=`vmstat -mv | awk '/pfrke_route /{print $5}'` 13KEC_R=`vmstat -mv | awk '/pfrke_cost /{print $3}'` 14KEC_I=`vmstat -mv | awk '/pfrke_cost /{print $5}'` 15echo "# create" 16echo "table <regress> persist" | $PFCTL -a $A -f - 2>&1 || exit 1 17for LINE in `sed -e "s/ /_/g" $1`; do 18 RESULT=`echo $LINE | awk '{split($1,a,"_");print a[1]}'` 19 case $RESULT in 20 pass|fail) ;; 21 *) continue ;; 22 esac 23 CMD=`echo $LINE | awk '{split($1,a,"_");print a[2]}'` 24 ARGSX=`echo $LINE | awk '{split($1,a,"_");for(i=3;a[i];i++)print a[i]}'` 25 ARGS="" 26 for ARG in $ARGSX; do 27 if [ "X$ARGS" = "X" ]; then 28 ARGS="$ARG" 29 else 30 ARGS="$ARGS $ARG" 31 fi 32 done 33 if [ "$RESULT" = "pass" ]; then case $CMD in 34 add|delete|replace) 35 echo "# pass $CMD -n $ARGS" 36 $PFCTL -a $A -t regress -nT $CMD $ARGS 2>&1 | sort || exit 1 37 echo "# pass $CMD -nf-" 38 echo "# test\n" $ARGSX | $PFCTL -a $A -t regress -nT $CMD -f- \ 39 2>&1 | sort || exit 1 40 echo "# pass $CMD -nqv $ARGS" 41 $PFCTL -a $A -t regress -nqvT $CMD $ARGS 2>&1 | sort || exit 1 42 echo "# pass $CMD -nqvv $ARGS" 43 $PFCTL -a $A -t regress -nqvvT $CMD $ARGS 2>&1 | sort || exit 1 44 ;; 45 esac fi 46 echo "# $RESULT $CMD $ARGS" 47 if [ "$RESULT" = "pass" ]; then 48 case $CMD in 49 list) 50 $PFCTL -a $A -sT 2>&1 51 echo "# pass $CMD -v" 52 $PFCTL -a $A -gvsT 2>&1 53 ;; 54 load) 55 echo $ARGS | sed "s,DIR,$D,g" | $PFCTL -a $A -f- \ 56 || exit 1 57 ;; 58 rule) 59 echo $ARGS | $PFCTL -a $A -f- 2>&1 || exit 1 60 ;; 61 show) 62 $PFCTL -qvv -a $A -t regress -T $CMD $ARGS 2>&1 | \ 63 grep -v "Cleared:" 64 ;; 65 *) 66 $PFCTL -a $A -t regress -T $CMD $ARGS 2>&1 | sort \ 67 || exit 1 68 ;; 69 esac 70 else 71 case $CMD in 72 load) 73 echo ARGS | sed "s,DIR,$D,g" | $PFCTL -a $A -Tl -f- \ 74 && exit 1 75 ;; 76 rule) 77 echo $ARGS | $PFCTL -a $A -f- 2>&1 && exit 1 78 ;; 79 *) 80 $PFCTL -a $A -t regress -T $CMD $ARGS 2>&1 && exit 1 81 ;; 82 esac 83 fi 84done 85echo "# kill" 86$PFCTL -a $A -FT 2>&1 87$PFCTL -a $A -Fr 2>&1 88let KT_R=`vmstat -mv | awk '/pfrktable/{print $3}'`-$KT_R 89let KT_I=`vmstat -mv | awk '/pfrktable/{print $5}'`-$KT_I 90let KT_RL=$KT_R-$KT_I 91let KEP_R=`vmstat -mv | awk '/pfrke_plain /{print $3}'`-$KEP_R 92let KEP_I=`vmstat -mv | awk '/pfrke_plain /{print $5}'`-$KEP_I 93let KEP_RL=$KEP_R-$KEP_I 94let KER_R=`vmstat -mv | awk '/pfrke_route /{print $3}'`-$KER_R 95let KER_I=`vmstat -mv | awk '/pfrke_route /{print $5}'`-$KER_I 96let KER_RL=$KER_R-$KER_I 97let KEC_R=`vmstat -mv | awk '/pfrke_cost /{print $3}'`-$KEC_R 98let KEC_I=`vmstat -mv | awk '/pfrke_cost /{print $5}'`-$KEC_I 99let KEC_RL=$KEC_R-$KEC_I 100echo "ktable: $KT_R allocated, $KT_RL released, $KT_I leaked." 101echo "pfrke_plain: $KEP_R allocated, $KEP_RL released, $KEP_I leaked." 102echo "pfrke_route: $KER_R allocated, $KER_RL released, $KER_I leaked." 103echo "pfrke_cost: $KEC_R allocated, $KEC_RL released, $KEC_I leaked." 104[ "$KT_I" = "0" -a "$KEP_I" = "0" -a "$KER_I" = "0" -a "$KEC_I" = "0" ] || \ 105 exit 1 106