#!/bin/sh
# Virtual ethernet interface control script
# Sometimes, we need a virtual interface of arbitrary name and configuration
# that we can do dhcp on. This script is for those times.

# Basically,
# $ veth setup foo 127.0.1
# $ dhclient foo
# ...
# $ veth teardown foo
# Would set up an ethernet interface called 'foo' whose dhcpd is at 127.0.1.1
# and which will allocate addresses from 127.0.1.0/24. Note that using anything
# inside 127.0.0.0/8 is a bad idea here, since lo already handles those.

usage () {
	echo "Usage: $0 <command> [args...]"
	echo "  setup <iface> <base>     Sets up <iface> for <base>.0/24"
	echo "  teardown <iface>         Tears down <iface>"
}

setup () {
	iface="$1"
	base="$2"
	peer_iface="${iface}p"
	lease_file="/tmp/dnsmasq.${iface}.leases"
	pid_file="/tmp/dnsmasq.${iface}.pid"
	ip link add name "$iface" type veth peer name "$peer_iface"
	ifconfig "$peer_iface" "${base}.0/32"
	ifconfig "$peer_iface" up
	ifconfig "$iface" up
	route add -host 255.255.255.255 dev "$peer_iface"
	truncate -s 0 "$lease_file"
	dnsmasq --pid-file="$pid_file" \
		--dhcp-leasefile="$lease_file" \
		--dhcp-range="${base}.2,${base}.254" \
		--port=0 \
		--interface="$peer_iface" \
		--bind-interfaces
}

teardown () {
	iface="$1"
	pid_file="/tmp/dnsmasq.${iface}.pid"
	[ -f "$pid_file" ] && kill -TERM $(cat "$pid_file")
	route del -host 255.255.255.255
	ip link del "$iface"
}

if [ -z "$1" ]; then
	usage
	exit 1
fi

command="$1" ; shift
case "$command" in
	setup)
		setup "$@"
		;;
	teardown)
		teardown "$@"
		;;
	*)
		usage
		;;
esac