#!/usr/bin/env bash # common.sh - an include file for commonly used functions for test code. # BSD licensed (see LICENSE file). # # Version 3 # 2011-02-23: get_pcat for PCAT, PCAT_DIFF and PCAT_PRINT defines. # 2011-02-18: ports check on BSD,Solaris. wait_nsd_up. # 2011-02-11: first version. # # include this file from a tpkg script with # . ../common.sh # # overview of functions available: # error x : print error and exit # info x : print info # test_tool_avail x : see if program in path and complain, exit if not. # get_ldns_testns : set LDNS_TESTNS to executable ldns-testns # get_make : set MAKE to gmake or make tool. # get_gcc : set cc or gcc in CC # get_pcat : set PCAT, PCAT_DIFF and PCAT_PRINT executables. # set_doxygen_path : set doxygen path # skip_if_in_list : set SKIP=1 if name in list and tool not available. # get_random_port x : get RND_PORT a sequence of free random port numbers. # wait_server_up : wait on logfile to see when server comes up. # wait_ldns_testns_up : wait for ldns-testns to come up. # wait_unbound_up : wait for unbound to come up. # wait_petal_up : wait for petal to come up. # wait_nsd_up : wait for nsd to come up. # wait_server_up_or_fail: wait for server to come up or print a failure string # kill_pid : kill a server, make sure and wait for it to go down. # print error and exit # $0: name of program # $1: error to printout. error () { echo "$0: error: $1" >&2 exit 1 } # print info # $0: name of program # $1: to printout. info () { echo "$0: info: $1" } # test if 'tool' is available in path and complain otherwise. # $1: tool test_tool_avail () { if test ! -x "$(command -v "$1" 2>&1)"; then echo No "$1" in path exit 1 fi } # get ldns-testns tool in LDNS_TESTNS variable. get_ldns_testns () { if test -x "$(command -v ldns-testns 2>&1)"; then LDNS_TESTNS=ldns-testns else LDNS_TESTNS=/home/wouter/bin/ldns-testns fi } # get make tool in MAKE variable, gmake is used if present. get_make () { if test -x "$(command -v gmake 2>&1)"; then MAKE=gmake else MAKE=make fi } # get cc tool in CC variable, gcc is used if present. get_gcc () { if test -x "$(command -v gcc 2>&1)"; then CC=gcc else CC=cc fi } # get pcat, pcat-print and pcat-diff get_pcat () { PCAT=$(command -v pcat) PCAT_PRINT=$(command -v pcat-print) PCAT_DIFF=$(command -v pcat-diff) } # set SKIP=1 if the name is in list and tool is not available. # $1: name of package to check. # $2: list of packages that need the tool. # #3: name of the tool required. skip_if_in_list () { if echo "$2" | grep "$1" >/dev/null; then if test ! -x "$(command -v "$3" 2>&1)"; then SKIP=1; fi fi } # function to get a number of random port numbers. # $1: number of random ports. # RND_PORT is returned as the starting port number get_random_port () { local plist local cont local collisions local i local MAXCOLLISION=1000 cont=1 collisions=0 while test "$cont" = 1; do #netstat -n -A ip -A ip6 -a | sed -e "s/^.*:\([0-9]*\) .*$/\1/" RND_PORT=$(( RANDOM + 5354 )) # depending on uname try to check for collisions in port numbers case "$(uname)" in linux|Linux) plist=$(netstat -n -A ip -A ip6 -a | sed -e 's/^.*:\([0-9]*\) .*$/\1/') ;; FreeBSD|freebsd|NetBSD|netbsd|OpenBSD|openbsd) plist=$(netstat -n -a | grep "^[ut][dc]p[46] " | sed -e 's/^.*\.\([0-9]*\) .*$/\1/') ;; Solaris|SunOS) plist=$(netstat -n -a | sed -e 's/^.*\.\([0-9]*\) .*$/\1/' | grep '^[0-9]*$') ;; *) plist="" ;; esac cont=0 for (( i=0 ; i < $1 ; i++ )); do if echo "$plist" | grep '^'"$(expr $i + $RND_PORT)"'$' >/dev/null 2>&1; then cont=1; collisions=$((collisions + 1)) fi done if test $collisions = $MAXCOLLISION; then error "too many collisions getting random port number" fi done } # wait for server to go up, pass # $1 : logfilename # $2 : string to watch for. # exits with failure if it does not come up wait_server_up () { local MAX_UP_TRY=120 local WAIT_THRES=30 local try for (( try=0 ; try <= MAX_UP_TRY ; try++ )) ; do if test -f "$1" && grep -F "$2" "$1" >/dev/null; then #echo "done on try $try" break; fi if test $try -eq $MAX_UP_TRY; then echo "Server in $1 did not go up!" cat "$1" exit 1; fi if test $try -ge $WAIT_THRES; then sleep 1 fi done } # wait for ldns-testns to come up # $1 : logfilename that is watched. wait_ldns_testns_up () { wait_server_up "$1" "Listening on port" } # wait for unbound to come up # string 'Start of service' in log. # $1 : logfilename that is watched. wait_unbound_up () { wait_server_up "$1" "start of service" } # wait for petal to come up # string 'petal start' in log. # $1 : logfilename that is watched. wait_petal_up () { wait_server_up "$1" "petal start" } # wait for nsd to come up # string nsd start in log. # $1 : logfilename that is watched. wait_nsd_up () { wait_server_up "$1" " started (NSD " } # wait for server to go up, pass # $1 : logfile # $2 : success string # $3 : failure string wait_server_up_or_fail () { local MAX_UP_TRY=120 local WAIT_THRES=30 local try for (( try=0 ; try <= MAX_UP_TRY ; try++ )) ; do if test -f "$1" && grep -F "$2" "$1" >/dev/null; then echo "done on try $try" break; fi if test -f "$1" && grep -F "$3" "$1" >/dev/null; then echo "failed on try $try" break; fi if test $try -eq $MAX_UP_TRY; then echo "Server in $1 did not go up!" cat "$1" exit 1; fi if test $try -ge $WAIT_THRES; then sleep 1 fi done } # kill a pid, make sure and wait for it to go down. # $1 : pid to kill kill_pid () { local MAX_DOWN_TRY=120 local WAIT_THRES=30 local try kill "$1" for (( try=0 ; try <= MAX_DOWN_TRY ; try++ )) ; do if kill -0 "$1" >/dev/null 2>&1; then : else #echo "done on try $try" break; fi if test $try -eq $MAX_DOWN_TRY; then echo "Server in $1 did not go down! Send SIGKILL" kill -9 "$1" >/dev/null 2>&1 fi if test $try -ge $WAIT_THRES; then sleep 1 fi # re-send the signal kill "$1" >/dev/null 2>&1 done return 0 } # set doxygen path, so that make doc can find doxygen set_doxygen_path () { if test -x '/home/wouter/bin/doxygen'; then export PATH="/home/wouter/bin:$PATH" fi }