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