#!/bin/bash
###########################################################################
# Configuration of the tunN devices for usage with Basilisk II.
# (derived MOL tunconfig script)
#
# This script should be named /usr/share/BasiliskII/tunconfig (unless
# the default name has been changed with the 'etherconfig' keyword).
#
#       Usage:          tunconfig iface up|down
#
# If the linux box is configured as a firewall, the rules below might
# need some adjustments.
#
# The IP Tunnel driver requires IP forwarding to be enabled. Run as root:
#
#       echo 1 >/proc/sys/net/ipv4/ip_forward
#
###########################################################################

SUDO=/usr/bin/sudo
IFCONFIG=/sbin/ifconfig
IPTABLES=/sbin/iptables

#########################################################

[[ "x$1" = "x-n" ]] && {
    DONT_EXECUTE=yes
    shift 1
}

TUN_DEV=$1
ACTION=$2

TUN_NUM=`echo $TUN_DEV | sed s/[^0-9]//g`
NET_NUM=`expr 40 + $TUN_NUM`
TUN_NET=172.20.$NET_NUM.0/24
TUN_HOST=172.20.$NET_NUM.1

#########################################################
# Misc Checks
#########################################################

[[ $# = 2 ]] || {
	echo "Usage: tunconfig [-n] iface up|down"
    exit 2
}

[[ "`id -u`" = "0" ]] && {
    echo "---> $SUDO not necessary." 1>&2
    SUDO=""
}

[[ -x $IPTABLES ]] || {
    echo "---> $IPTABLES not found." 1>&2
    exit 1
}

if [ -n "$SUDO" ]; then
    $SUDO -l | grep -q "NOPASSWD: $IFCONFIG" || {
        echo "---> Missing sudo NOPASSWD: $IFCONFIG." 1>&2
        exit 1
    }
    $SUDO -l | grep -q "NOPASSWD: $IPTABLES" || {
        echo "---> Missing sudo NOPASSWD: $IPTABLES." 1>&2
        exit 1
    }
    IFCONFIG="$SUDO $IFCONFIG"
    IPTABLES="$SUDO $IPTABLES"
fi

[[ "x$DONT_EXECUTE" = "xyes" ]] && exit 0

$IPTABLES -L -n -t nat > /dev/null || exit 1

#########################################################
# Remove old (possibly stale) ruleset
#########################################################

{
    $IPTABLES -t nat -D POSTROUTING -s $TUN_NET -d ! $TUN_NET -j MASQUERADE
} >& /dev/null

#########################################################
# Bring down interface
#########################################################

[[ "$ACTION" = down ]] && {
    $IFCONFIG $TUN_DEV down
}

#########################################################
# Configure interface
#########################################################

[[ "$ACTION" = up ]] && {
    $IFCONFIG $TUN_DEV $TUN_HOST

    # masquerade the tun network
    $IPTABLES -t nat -A POSTROUTING -s $TUN_NET -d ! $TUN_NET -j MASQUERADE
}

exit 0
