mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-09 20:58:44 +00:00
106 lines
1.6 KiB
Bash
106 lines
1.6 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
set -e
|
||
|
|
||
|
LOCAL=2001:db8:dead::
|
||
|
|
||
|
EXTERNAL=2001:db8:beef::
|
||
|
EXTERNAL_NET=${EXTERNAL}/48
|
||
|
EXTERNAL_NH=${LOCAL}beef
|
||
|
|
||
|
LEARN=2001:db8:feed::
|
||
|
LEARN_NET=${LEARN}/48
|
||
|
LEARN_NH=${LOCAL}feed
|
||
|
|
||
|
IFACE=bird-test-dummy
|
||
|
IFACE_EXISTS=false
|
||
|
|
||
|
BIRD_RUNNING=false
|
||
|
|
||
|
D=$(mktemp -d)
|
||
|
pushd ${D} >/dev/null
|
||
|
|
||
|
stop_bird() {
|
||
|
birdc -l down >/dev/null
|
||
|
sleep 1
|
||
|
grep -q "<FATAL> Shutdown completed" bird.log
|
||
|
[ ! -e bird.pid ]
|
||
|
[ ! -e bird.ctl ]
|
||
|
}
|
||
|
|
||
|
cleanup() {
|
||
|
if ${BIRD_RUNNING}; then
|
||
|
stop_bird
|
||
|
if [ -e bird.pid ]; then
|
||
|
kill -9 $(<bird.pid)
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
if ${IFACE_EXISTS}; then
|
||
|
ip link del ${IFACE}
|
||
|
fi
|
||
|
|
||
|
|
||
|
popd > /dev/null
|
||
|
rm -rf ${D}
|
||
|
}
|
||
|
|
||
|
failed() {
|
||
|
cleanup
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
trap failed ERR
|
||
|
trap failed INT
|
||
|
trap failed HUP
|
||
|
|
||
|
ip link add ${IFACE} type dummy
|
||
|
IFACE_EXISTS=true
|
||
|
|
||
|
ip link set ${IFACE} up
|
||
|
ip -6 addr add ${LOCAL}/64 dev bird-test-dummy
|
||
|
|
||
|
ip -6 route add ${LEARN_NET} via ${LEARN_NH}
|
||
|
|
||
|
cat >bird.conf <<EOF
|
||
|
log "bird.log" all;
|
||
|
|
||
|
protocol device {}
|
||
|
|
||
|
protocol kernel {
|
||
|
ipv6 { import all; export all; };
|
||
|
learn;
|
||
|
}
|
||
|
|
||
|
protocol static {
|
||
|
ipv6;
|
||
|
route ${EXTERNAL_NET} via ${EXTERNAL_NH};
|
||
|
}
|
||
|
EOF
|
||
|
|
||
|
bird -l -P bird.pid
|
||
|
|
||
|
if [ ! -S bird.ctl ] || [ ! -f bird.pid ] || [ ! -f bird.log ]; then
|
||
|
failed
|
||
|
fi
|
||
|
|
||
|
BIRD_RUNNING=true
|
||
|
|
||
|
ROUTE_INSERTED=false
|
||
|
for _ in $(seq 10); do
|
||
|
if ip -6 route show ${EXTERNAL_NET} | egrep -q "${EXTERNAL_NET} via ${EXTERNAL_NH} dev ${IFACE} proto bird metric [0-9]+ pref medium"; then
|
||
|
ROUTE_INSERTED=true
|
||
|
break
|
||
|
fi
|
||
|
sleep 1
|
||
|
done
|
||
|
|
||
|
$ROUTE_INSERTED || failed
|
||
|
|
||
|
if birdc -l show route "${LEARN_NET}" | egrep -q "Network not found"; then
|
||
|
failed
|
||
|
fi
|
||
|
|
||
|
cleanup
|
||
|
exit 0
|