diff options
Diffstat (limited to 'net-scripts/net/tuntap.sh')
-rw-r--r-- | net-scripts/net/tuntap.sh | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/net-scripts/net/tuntap.sh b/net-scripts/net/tuntap.sh new file mode 100644 index 0000000..597cb12 --- /dev/null +++ b/net-scripts/net/tuntap.sh @@ -0,0 +1,99 @@ +#!/bin/bash +# Copyright (c) 2004-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +# Contributed by Roy Marples (uberlord@gentoo.org) + +# Fix any potential localisation problems +# Note that LC_ALL trumps LC_anything_else according to locale(7) +openvpn() { + LC_ALL=C /usr/sbin/openvpn "$@" +} +tunctl() { + LC_ALL=C /usr/bin/tunctl "$@" +} + +# void tuntap_depend(void) +# +# Sets up the dependancies for the module +tuntap_depend() { + before interface macchanger + functions interface_exists interface_type + variables tunctl +} + +# bool tuntap_check_installed(void) +# +# Returns 1 if tuntap is installed, otherwise 0 +tuntap_check_installed() { + [[ -x /usr/sbin/openvpn ]] && return 0 + [[ -x /usr/bin/tunctl ]] && return 0 + ${1:-false} && eerror "For TunTap support, emerge net-misc/openvpn or sys-apps/usermode-utilities" + return 1 +} + +# bool tuntap_check_kernel(void) +# +# Checks to see if the tun is present - if not try and load it +# Returns 1 if there is a problem +tuntap_check_kernel() { + [[ -a /dev/net/tun ]] && return 0 + /sbin/modprobe tun && sleep 1 + [[ -a /dev/net/tun ]] && return 0 + eerror "TUN/TAP support is not present in this kernel" + return 1 +} + +# bool tuntap_exists(char *interface) +# +# Returns 0 if the tun/tap interface exists, otherwise 1 +tuntap_exists() { + [[ -n $(get_options tuntap "net.$1") ]] +} + +# bool tuntap_pre_start(char *iface) +# +# Create the device, give it the right perms +tuntap_pre_start() { + local iface="$1" ifvar="$(bash_variable "$1")" + local tuntap="tuntap_${ifvar}" + + [[ -z ${!tuntap} ]] && return 0 + tuntap_check_kernel || return 1 + + ebegin "Creating Tun/Tap interface ${iface}" + + # Set the base metric to 1000 + metric=1000 + + if [[ -x /usr/sbin/openvpn ]] ; then + openvpn --mktun --dev-type "${!tuntap}" --dev "${iface}" \ + > /dev/null + else + local opts="tunctl_${ifvar}" + tunctl ${!opts} -t "${iface}" >/dev/null + fi + eend $? && save_options tuntap "${!tuntap}" +} + +# bool tuntap_stop(char *iface) +# +# Removes the device +tuntap_stop() { + local iface="$1" + + tuntap_check_installed || return 0 + tuntap_exists "${iface}" || return 0 + + ebegin "Destroying Tun/Tap interface ${iface}" + if [[ -x /usr/sbin/openvpn ]] ; then + openvpn --rmtun \ + --dev-type "$(get_options tuntap)" \ + --dev "${iface}" > /dev/null + else + tunctl -d "${fiace}" >/dev/null + fi + eend $? +} + +# vim:ts=4 |