#!/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