openrc/net/tuntap.sh
Robin H. Johnson 4255ba175b net: net.lo, lots of scripts
The program function in depend blocks is now able to search paths by
itself. If passed multiple arguments or multiple calls, at least one of
the arguments passed must be a program or a shell builtin (eg ip built
into busybox). If a qualified path is specified, only that path will be
checked, otherwise it will be checked as a builtin, then $PATH will be
checked for the named binary (via type).

Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
2012-01-08 16:24:10 -08:00

103 lines
2.4 KiB
Bash

# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
tuntap_depend()
{
before bridge interface macchanger
program ip openvpn tunctl
}
_config_vars="$_config_vars iproute2 openvpn tunctl"
_is_tuntap()
{
[ -n "$(export RC_SVCNAME="net.${IFACE}"; service_get_value tuntap)" ]
}
tuntap_pre_start()
{
local tuntap=
local rc=
eval tuntap=\$tuntap_${IFVAR}
[ -z "${tuntap}" ] && return 0
if [ ! -e /dev/net/tun ]; then
if ! modprobe tun; then
eerror "TUN/TAP support is not present in this kernel"
return 1
fi
vebegin "Waiting for /dev/net/tun"
# /dev/net/tun can take its time to appear
local timeout=10
while [ ! -e /dev/net/tun -a ${timeout} -gt 0 ]; do
sleep 1
: $(( timeout -= 1 ))
done
if [ ! -e /dev/net/tun ]; then
eerror "TUN/TAP support present but /dev/net/tun is not"
return 1
fi
veend 0
fi
ebegin "Creating Tun/Tap interface ${IFACE}"
# Set the base metric to 1000
metric=1000
local i_opts= o_opts= t_opts=
local do_iproute2=false do_openvpn=false do_tunctl=false
eval i_opts=\$iproute2_${IFVAR}
eval o_opts=\$openvpn_${IFVAR}
eval t_opts=\$tunctl_${IFVAR}
if [ -n "${i_opts}" ] && type ip >/dev/null 2>&1; then
do_iproute2=true
elif [ -n "${o_opts}" ] && type openvpn >/dev/null 2>&1; then
do_openvpn=true
elif [ -n "${t_opts}" ] && type tunctl >/dev/null 2>&1; then
do_tunctl=true
elif type ip >/dev/null 2>&1; then
do_iproute2=true
elif type openvpn >/dev/null 2>&1; then
do_openvpn=true
elif type tunctl >/dev/null 2>&1; then
do_tunctl=true
fi
if ${do_iproute2}; then
ip tuntap add dev "${IFACE}" mode "${tuntap}" ${i_opts}
rc=$?
elif ${do_openvpn}; then
openvpn --mktun --dev-type "${tuntap}" --dev "${IFACE}" \
${o_opts} >/dev/null
rc=$?
elif ${do_tunctl}; then
tunctl ${t_opts} -t "${IFACE}" >/dev/null
rc=$?
else
eerror "Neither iproute2, openvpn nor tunctl has been found, please install"
eerror "either \"iproute2\" \"openvpn\" or \"usermode-utilities\"."
rc=1
fi
eend $rc && _up && service_set_value tuntap "${tuntap}"
}
tuntap_post_stop()
{
_is_tuntap || return 0
ebegin "Destroying Tun/Tap interface ${IFACE}"
if type ip > /dev/null 2>&1; then
ip tuntap del dev ${IFACE} mode $(service_get_value tuntap)
elif type tunctl >/dev/null 2>&1; then
tunctl -d "${IFACE}" >/dev/null
else
openvpn --rmtun \
--dev-type "$(service_get_value tuntap)" \
--dev "${IFACE}" >/dev/null
fi
eend $?
}