1#!/bin/ksh
2#	$OpenBSD: med.sh,v 1.2 2021/01/13 10:15:08 claudio Exp $
3
4set -e
5
6BGPD=$1
7BGPDCONFIGDIR=$2
8RDOMAIN1=$3
9RDOMAIN2=$4
10PAIR1=$5
11PAIR2=$6
12
13RDOMAINS="${RDOMAIN1} ${RDOMAIN2}"
14PAIRS="${PAIR1} ${PAIR2}"
15PAIR1IP=10.12.57.1
16PAIR2IP=10.12.57.2
17PAIR2IP2=10.12.57.3
18PAIR2IP3=10.12.57.4
19PAIR2IP4=10.12.57.5
20
21error_notify() {
22	echo cleanup
23	pkill -T ${RDOMAIN1} bgpd || true
24	pkill -T ${RDOMAIN2} -f exabgp || true
25	sleep 1
26	ifconfig ${PAIR2} destroy || true
27	ifconfig ${PAIR1} destroy || true
28	route -qn -T ${RDOMAIN1} flush || true
29	route -qn -T ${RDOMAIN2} flush || true
30	ifconfig lo${RDOMAIN1} destroy || true
31	ifconfig lo${RDOMAIN2} destroy || true
32	if [ $1 -ne 0 ]; then
33		echo FAILED
34		exit 1
35	else
36		echo SUCCESS
37	fi
38}
39
40run_exabgp() {
41	local _t=$1
42
43	shift
44	env	exabgp.log.destination=stdout \
45		exabgp.log.packets=true \
46		exabgp.log.parser=true \
47		exabgp.log.level=DEBUG \
48		exabgp.api.cli=false \
49		exabgp.daemon.user=build \
50	    route -T ${RDOMAIN2} exec exabgp -1 ${1+"$@"} > ./exabgp.$_t.log
51}
52
53exacmd() {
54	echo "${1+"$@"}" > med.fifo
55	sleep .1	# give exabgp a bit of time
56}
57
58if [ ! -x /usr/local/bin/exabgp ]; then 
59	echo install exabgp from ports for this test >&2
60	exit 1
61fi
62
63if [ "$(id -u)" -ne 0 ]; then 
64	echo need root privileges >&2
65	exit 1
66fi
67
68trap 'error_notify $?' EXIT
69
70echo check if rdomains are busy
71for n in ${RDOMAINS}; do
72	if /sbin/ifconfig | grep -v "^lo${n}:" | grep " rdomain ${n} "; then
73		echo routing domain ${n} is already used >&2
74		exit 1
75	fi
76done
77
78echo check if interfaces are busy
79for n in ${PAIRS}; do
80	/sbin/ifconfig "${n}" >/dev/null 2>&1 && \
81	    ( echo interface ${n} is already used >&2; exit 1 )
82done
83
84set -x
85
86echo setup
87ifconfig ${PAIR1} rdomain ${RDOMAIN1} ${PAIR1IP}/29 up
88ifconfig ${PAIR2} rdomain ${RDOMAIN2} ${PAIR2IP}/29 up
89ifconfig ${PAIR2} alias ${PAIR2IP2}/32
90ifconfig ${PAIR2} alias ${PAIR2IP3}/32
91ifconfig ${PAIR2} alias ${PAIR2IP4}/32
92ifconfig ${PAIR1} patch ${PAIR2}
93ifconfig lo${RDOMAIN1} inet 127.0.0.1/8
94ifconfig lo${RDOMAIN2} inet 127.0.0.1/8
95
96[ -p med.fifo ] || mkfifo med.fifo
97
98echo run bgpd
99route -T ${RDOMAIN1} exec ${BGPD} \
100	-v -f ${BGPDCONFIGDIR}/bgpd.med.conf
101
102sleep 1
103
104echo run exabgp
105run_exabgp med exabgp.med.conf &
106sleep 2
107
108echo test 1
109
110exacmd 'neighbor 10.12.57.1 router-id 10.12.57.2 announce route 10.12.1.0/24 next-hop self as-path [ 64501 64510 ] med 100'
111exacmd 'neighbor 10.12.57.1 router-id 10.12.57.3 announce route 10.12.1.0/24 next-hop self as-path [ 64502 64510 ] med 100'
112exacmd 'neighbor 10.12.57.1 router-id 10.12.57.4 announce route 10.12.1.0/24 next-hop self as-path [ 64501 64510 ] med 50'
113
114sleep 5
115route -T ${RDOMAIN1} exec bgpctl sh rib | tee med.out
116sleep .2
117diff -u ${BGPDCONFIGDIR}/exabgp.med.ok med.out
118echo OK
119
120exacmd 'clear adj-rib out all peers'
121
122echo test 2
123
124exacmd 'neighbor 10.12.57.1 router-id 10.12.57.4 announce route 10.12.1.0/24 next-hop self as-path [ 64501 64510 ] med 50'
125exacmd 'neighbor 10.12.57.1 router-id 10.12.57.3 announce route 10.12.1.0/24 next-hop self as-path [ 64502 64510 ] med 100'
126exacmd 'neighbor 10.12.57.1 router-id 10.12.57.2 announce route 10.12.1.0/24 next-hop self as-path [ 64501 64510 ] med 100'
127
128sleep 5
129route -T ${RDOMAIN1} exec bgpctl sh rib | tee med.out
130sleep .2
131diff -u ${BGPDCONFIGDIR}/exabgp.med.ok med.out
132echo OK
133
134exacmd 'clear adj-rib out all peers'
135
136echo test 3
137
138exacmd 'neighbor 10.12.57.1 router-id 10.12.57.2 announce route 10.12.1.0/24 next-hop self as-path [ 64501 64510 ] med 100'
139exacmd 'neighbor 10.12.57.1 router-id 10.12.57.4 announce route 10.12.1.0/24 next-hop self as-path [ 64501 64510 ] med 50'
140exacmd 'neighbor 10.12.57.1 router-id 10.12.57.3 announce route 10.12.1.0/24 next-hop self as-path [ 64502 64510 ] med 100'
141
142sleep 5
143route -T ${RDOMAIN1} exec bgpctl sh rib | tee med.out
144sleep .2
145diff -u ${BGPDCONFIGDIR}/exabgp.med.ok med.out
146echo OK
147
148echo test 4
149
150exacmd 'neighbor 10.12.57.1 router-id 10.12.57.4 withdraw route 10.12.1.0/24'
151
152sleep 5
153route -T ${RDOMAIN1} exec bgpctl sh rib | tee med.out
154sleep .2
155diff -u ${BGPDCONFIGDIR}/exabgp.med_2.ok med.out
156echo OK
157exacmd 'shutdown'
158
159exit 0
160