1#!/bin/sh 2# 3# $OpenBSD: ifstated,v 1.9 2021/10/05 17:41:03 anton Exp $ 4#/* 5# * Copyright (c) Rob Pierce <rob@openbsd.org> 6# * 7# * Permission to use, copy, modify, and distribute this software for any 8# * purpose with or without fee is hereby granted, provided that the above 9# * copyright notice and this permission notice appear in all copies. 10# * 11# * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12# * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13# * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14# * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15# * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16# * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17# * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18# */ 19 20# Basic ifstated regression script to test interface changes. 21 22# Ensure OBJDIR is defined 23: ${OBJDIR?} || exit 1 24export OBJDIR 25 26# Global variables 27VHIDA=252 28VHIDB=253 29PREFIX=172.16.0 30DEMOTE=ifconfig 31PROMOTE=ifconfig 32EVERY=5 33SLEEP=10 34 35cleanup() { 36 ifconfig carp${VHIDA} destroy > /dev/null 2>&1 37 ifconfig carp${VHIDB} destroy > /dev/null 2>&1 38 ifconfig vether${VHIDB} destroy > /dev/null 2>&1 39 rm ${OBJDIR}/ifstated.conf >/dev/null 2>&1 40 rm ${OBJDIR}/ifstated.log >/dev/null 2>&1 41 rm ${OBJDIR}/output.test >/dev/null 2>&1 42 rm ${OBJDIR}/output.new >/dev/null 2>&1 43 rm ${OBJDIR}/nohup.out >/dev/null 2>&1 44} 45 46fail() { 47 echo FAILED 48 cleanup 49 exit 1 50} 51 52skip() { 53 echo SKIPPED 54 cleanup 55 exit 0 56} 57 58trap 'skip' INT 59 60ifconfig vether${VHIDB} create >/dev/null 2>&1 61if [ $? -ne 0 ] 62then 63 echo "Could not create temporary vether interface." 64 echo SKIPPED 65 exit 0 66else 67 ifconfig vether${VHIDB} up 68 NIC=vether${VHIDB} 69fi 70 71if [ "$(pgrep ifstated)" ] 72then 73 echo "The ifstated daemon is already running." 74 echo SKIPPED 75 exit 0 76fi 77 78for interface in carp${VHIDA} carp${VHIDB} 79do 80 ifconfig ${interface} > /dev/null 2>&1 81 if [ $? -eq 0 ] 82 then 83 echo "Interface $interface already exists." 84 echo SKIPPED 85 exit 0 86 fi 87done 88 89cat > ${OBJDIR}/ifstated.conf <<EOF 90# This is a config template for ifstated regression testing 91carp = "carp${VHIDA}.link.up" 92init-state primary 93net = '( "ping -q -c 1 -w 1 ${PREFIX}.${VHIDB} > /dev/null" every ${EVERY})' 94state primary { 95 init { 96 run "ifconfig" 97 } 98 if ! \$net 99 set-state demoted 100 if ! \$carp 101 set-state demoted 102} 103state demoted { 104 init { 105 run "ifconfig" 106 } 107 if \$net && ( ! carp${VHIDA}.link.down && ! carp${VHIDA}.link.unknown ) 108 set-state primary 109} 110EOF 111 112ifconfig carp${VHIDA} inet ${PREFIX}.${VHIDA} netmask 255.255.255.0 broadcast \ 113 ${PREFIX}.255 vhid ${VHIDA} carpdev ${NIC} 114ifconfig carp${VHIDB} inet ${PREFIX}.${VHIDB} netmask 255.255.255.0 broadcast \ 115 ${PREFIX}.255 vhid ${VHIDB} carpdev ${NIC} 116 117# give the carp interface time to come up as MASTER 118sleep 5 119 120cat > ${OBJDIR}/output.test <<EOF 121changing state to primary 122changing state to demoted 123changing state to primary 124changing state to demoted 125changing state to primary 126changing state to demoted 127changing state to primary 128changing state to demoted 129changing state to primary 130changing state to primary 131EOF 132 133(cd ${OBJDIR} && nohup ifstated -dvf ./ifstated.conf > ifstated.log 2>&1) & 134 135sleep ${SLEEP} 136ifconfig carp${VHIDA} down 137sleep ${SLEEP} 138ifconfig carp${VHIDA} up 139sleep ${SLEEP} 140ifconfig carp${VHIDA} destroy 141sleep ${SLEEP} 142ifconfig carp${VHIDA} inet ${PREFIX}.${VHIDA} netmask 255.255.255.0 broadcast \ 143 ${PREFIX}.255 vhid ${VHIDA} carpdev ${NIC} 144sleep ${SLEEP} 145ifconfig carp${VHIDB} destroy 146sleep ${SLEEP} 147ifconfig carp${VHIDB} inet ${PREFIX}.${VHIDB} netmask 255.255.255.0 broadcast \ 148 ${PREFIX}.255 vhid ${VHIDB} carpdev ${NIC} 149sleep ${SLEEP} 150ifconfig carp${VHIDA} down 151sleep ${SLEEP} 152ifconfig carp${VHIDB} destroy 153sleep ${SLEEP} 154ifconfig carp${VHIDA} up 155sleep ${SLEEP} 156ifconfig carp${VHIDB} inet ${PREFIX}.${VHIDB} netmask 255.255.255.0 broadcast \ 157 ${PREFIX}.255 vhid ${VHIDB} carpdev ${NIC} 158sleep ${SLEEP} 159kill -HUP $(pgrep ifstated) >/dev/null 2>&1 160sleep ${SLEEP} 161 162grep ^changing ${OBJDIR}/ifstated.log > ${OBJDIR}/output.new 163 164kill $(pgrep ifstated) >/dev/null 2>&1 165 166diff ${OBJDIR}/output.test ${OBJDIR}/output.new 167case $? in 1680) echo PASSED 169 cleanup 170 exit 0 171 ;; 1721) fail 173 ;; 174esac 175