1#!/bin/sh
2# Virtual ethernet interface control script
3# Sometimes, we need a virtual interface of arbitrary name and configuration
4# that we can do dhcp on. This script is for those times.
5
6# Basically,
7# $ veth setup foo 127.0.1
8# $ dhclient foo
9# ...
10# $ veth teardown foo
11# Would set up an ethernet interface called 'foo' whose dhcpd is at 127.0.1.1
12# and which will allocate addresses from 127.0.1.0/24. Note that using anything
13# inside 127.0.0.0/8 is a bad idea here, since lo already handles those.
14
15usage () {
16	echo "Usage: $0 <command> [args...]"
17	echo "  setup <iface> <base>     Sets up <iface> for <base>.0/24"
18	echo "  teardown <iface>         Tears down <iface>"
19}
20
21setup () {
22	iface="$1"
23	base="$2"
24	peer_iface="${iface}p"
25	lease_file="/tmp/dnsmasq.${iface}.leases"
26	pid_file="/tmp/dnsmasq.${iface}.pid"
27	ip link add name "$iface" type veth peer name "$peer_iface"
28	ifconfig "$peer_iface" "${base}.0/32"
29	ifconfig "$peer_iface" up
30	ifconfig "$iface" up
31	route add -host 255.255.255.255 dev "$peer_iface"
32	truncate -s 0 "$lease_file"
33	dnsmasq --pid-file="$pid_file" \
34		--dhcp-leasefile="$lease_file" \
35		--dhcp-range="${base}.2,${base}.254" \
36		--port=0 \
37		--interface="$peer_iface" \
38		--bind-interfaces
39}
40
41teardown () {
42	iface="$1"
43	pid_file="/tmp/dnsmasq.${iface}.pid"
44	[ -f "$pid_file" ] && kill -TERM $(cat "$pid_file")
45	route del -host 255.255.255.255
46	ip link del "$iface"
47}
48
49if [ -z "$1" ]; then
50	usage
51	exit 1
52fi
53
54command="$1" ; shift
55case "$command" in
56	setup)
57		setup "$@"
58		;;
59	teardown)
60		teardown "$@"
61		;;
62	*)
63		usage
64		;;
65esac
66