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