#!/bin/bash # # # # # shellcheck disable=SC2034 #set -e -u # -o pipefail export LANG=C LC_ALL=C main () { setup_ucs setup_interface 1 main1="$main" guest1="$guest" setup_interface 2 main2="$main" guest2="$guest" setup_dhcp 1 subnet1="$subnet" gw1="$gw" host1="$host" setup_dhcp 2 subnet2="$subnet" gw2="$gw" host2="$host" wait_dhcp_restart test_guest 1 test_guest 2 # bash -i teardown_dhcp 1 teardown_dhcp 2 teardown_interface 1 teardown_interface 2 } setup_ucs () { apt-get -qq install univention-dhcp ethtool if [ -z "${tmp:-}" ] then tmp=$(mktemp -d) # shellcheck disable=SC2064 trap "rm -rf '$tmp'" EXIT lease="${tmp}/dhclient.lease" pid="${tmp}/pid" fi NET1='192.0.2' # .0/24 # "TEST-NET-1" NET2='198.51.100' # .0/24 # "TEST-NET-2" } setup_interface () { [ -e "/sys/class/net/veth${1}-main" ] && return ip link add name "veth${1}-main" type veth peer name "veth${1}-guest" main=$(<"/sys/class/net/veth${1}-main/address") [ -n "$main" ] guest=$(<"/sys/class/net/veth${1}-guest/address") [ -n "$guest" ] local NET="NET${1}" ip addr add "${!NET}.1/24" dev "veth${1}-main" ip link set "veth${1}-main" up ethtool -K "veth${1}-main" tx off >/dev/null ethtool -K "veth${1}-guest" tx off >/dev/null ip netns add "my-env${1}" ip link set dev "veth${1}-guest" netns "my-env${1}" name eth0 ip netns exec "my-env${1}" ip addr flush eth0 ip netns exec "my-env${1}" ip link set eth0 up } setup_dhcp () { service=$(udm dhcp/service list|DN1) [ -n "$service" ] || die service local NET="NET${1}" udm policies/dhcp_routing create --ignore_exists --set name="gw${1}" --set routers="${!NET}.0" gw=$(udm policies/dhcp_routing list --filter name="gw${1}"|DN1) udm dhcp/subnet create --ignore_exists --superordinate="$service" --set subnet="${!NET}.0" --set subnetmask="24" --policy-reference "$gw" subnet=$(udm dhcp/subnet list --superordinate="$service" --filter subnet="${!NET}.0"|DN1) [ -n "$subnet" ] || die subnet local guest="guest${1}" udm dhcp/host create --superordinate="$service" --set hwaddress="ethernet ${!guest}" --set host="${!guest}" --set fixedaddress="${!NET}.50" host=$(udm dhcp/host list --superordinate="$service" --filter host="${!guest}"|DN1) [ -n "$host" ] || die host } wait_dhcp_restart () { local i oldpid oldpid=$(0;i+=-1)) do sleep 1 [ "$oldpid" -eq "$( $("$lease" 2>"$pid" ip netns exec "my-env${1}" dhclient -1 -pf "$pid" -sf /bin/true -lf "$lease" -q -4 eth0 grep --color -F -e " fixed-address ${!NET}.50" "$lease" grep --color -F -e " option dhcp-server-identifier ${!NET}.1;" "$lease" grep --color -F -e " option routers ${!NET}.0;" "$lease" ip netns exec "my-env${1}" dhclient -1 -pf "$pid" -sf /bin/true -lf "$lease" -q -r -4 eth0 udm dhcp/host list --policies 0 --position "${!host}" echo } teardown_dhcp () { local subnet="subnet${1}" udm dhcp/subnet remove --superordinate "$service" --dn "${!subnet}" local host="host${1}" udm dhcp/host remove --superordinate "$service" --dn "${!host}" local gw="gw${1}" udm policies/dhcp_routing remove --dn "${!gw}" } teardown_interface () { ip link del dev "veth${1}-main" ip netns del "my-env${1}" } die () { echo "${0##*/}: $*" >&2 exit 1 } DN1 () { sed -ne 's/^DN: //p;T;q' } udm () { local module="$1" action="$2" shift 2 /usr/sbin/udm "$module" "$action" "$@" } main "$@"