# -*- shell-script -*- FUNCTIONS_DIR="debian/tests/functions.d" match_or_exit () { file_to_match="$1" pattern_file="$2" while read line_to_match <&3 && read pattern_line <&4 ; do if [ "${line_to_match##$pattern_line}" ]; then echo '!!! MISMATCH !!!' >&2 echo "Line: ${line_to_match}" >&2 echo "Pattern: ${pattern_line}" >&2 exit 1 fi; done 3<"${file_to_match}" 4<"${pattern_file}" } linecount () { wc -l $1 | cut -d' ' -f1 } error_exit () { echo "ERROR: $1" exit 1 } stop_dnsmasq_bind_networking () { systemctl stop dnsmasq.service systemctl stop named.service systemctl stop networking.service } configure_and_start_networking () { #Add interfaces needed for the test cat ${FUNCTIONS_DIR}/add-to.interfaces >> /etc/network/interfaces systemctl start networking.service } configure_and_start_bind () { cp ${FUNCTIONS_DIR}/db.autopkg.test /etc/bind/ cat ${FUNCTIONS_DIR}/add-to.named.conf.local >> /etc/bind/named.conf.local cp ${FUNCTIONS_DIR}/named.conf.options /etc/bind/named.conf.options systemctl start named.service } configure_and_start_dnsmasq () { alt_mode=0 lua_mode=0 sysv_mode=0 service='dnsmasq.service' sysv_param2='' conf_dir='/etc/dnsmasq.d' while [ -n "$1" ]; do case "$1" in alt|lua|sysv) eval ${1}_mode=1 ;; *) error_exit "configure_and_start_dnsmasq(): invalid flag '$1'" esac shift done if [ ${alt_mode} -eq 1 ]; then cp ${FUNCTIONS_DIR}/dnsmasq.alt-autopkgtest.default /etc/default/dnsmasq.alt cp /etc/dnsmasq.conf /etc/dnsmasq.alt.conf mkdir /etc/dnsmasq.alt.d service='dnsmasq@alt.service' sysv_param2='alt' conf_dir='/etc/dnsmasq.alt.d' fi cp ${FUNCTIONS_DIR}/dnsmasq-autopkgtest.conf "${conf_dir}" if [ ${lua_mode} -eq 1 ]; then mkdir -p /usr/local/share/dnsmasq cp ${FUNCTIONS_DIR}/log.lua /usr/local/share/dnsmasq/ echo "dhcp-luascript=/usr/local/share/dnsmasq/log.lua\n" \ >>"${conf_dir}"/dnsmasq-autopkgtest.conf fi if [ ${sysv_mode} -eq 1 ]; then SYSTEMCTL_SKIP_REDIRECT=1 /etc/init.d/dnsmasq start "${sysv_param2}" else systemctl enable "${service}" systemctl start "${service}" fi } check_compile_time_options () { journalctl -b -u dnsmasq echo ~~~ Check compile time options... journalctl -b -u dnsmasq -g '[a-z]+: ' --output cat >options.msg cat options.msg match_or_exit options.msg ${FUNCTIONS_DIR}/options${1}.patterns } get_address_on_veth1_and_check_the_result () { echo ~~~ Get an address on veth1 and check the result... ip netns exec clientnet ifup veth1 ip netns exec clientnet ip addr show dev veth1 >ip-addr.out 2>&1 cat ip-addr.out match_or_exit ip-addr.out ${FUNCTIONS_DIR}/ip-addr.patterns } query_test_zone_records_and_check_the_result () { echo ~~~ Query some test zone records and check the result... ip netns exec clientnet dig +short SOA autopkg.test >dig.out 2>&1 ip netns exec clientnet dig +short NS autopkg.test >>dig.out 2>&1 ip netns exec clientnet dig +short A ns.autopkg.test >>dig.out 2>&1 ip netns exec clientnet dig +short A dhcp3.autopkg.test >>dig.out 2>&1 cat dig.out if [ `linecount dig.out` -ne `linecount ${FUNCTIONS_DIR}/dig.patterns` ] ; then error_exit 'empty or unexpected output' fi match_or_exit dig.out ${FUNCTIONS_DIR}/dig.patterns } check_utils () { #Test dhcp_lease_time and dhcp_release leases_file='/var/lib/misc/dnsmasq.leases' client_ip_address=`cut -d' ' -f3 $leases_file` client_mac_address=`cut -d' ' -f2 $leases_file` echo ~~~ Test dhcp_lease_time... if ! dhcp_lease_time $client_ip_address; then error_exit "'dhcp_lease_time $client_ip_address' failed with return code $?" else #Add \n to dhcp_lease_time's output echo '' fi echo ~~~ Test dhcp_release... cat $leases_file if ! dhcp_release veth0 $client_ip_address 1-$client_mac_address; then error_exit "'dhcp_release veth0 $client_ip_address 1-$client_mac_address' failed with return code $?0" fi if [ -n "`cat $leases_file`" ]; then cat $leases_file error_exit "$leases_file is not empty" fi } check_lua_log () { log_file='/var/log/dnsmasq-lua.log' echo ~~~ Check log file generated by lua script ls -l ${log_file} if [ -s ${log_file} ]; then cat ${log_file} match_or_exit ${log_file} ${FUNCTIONS_DIR}/log.patterns else error_exit "${log_file} is empty" fi }