grml-addtun: fix usage information
[grml-network.git] / sbin / grml-addtun
index af1b810..256de5a 100755 (executable)
@@ -5,28 +5,35 @@
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
 ################################################################################
-# grml-addtun [OPTIONS] <tun0> <tun1> ...
 
 set -e
 #set -x
 
+PN_="`basename $0`"
 OPT_DEL_='false'
 OPT_USER_=''
 OPT_GROUP_=''
 OPT_BRIDGE_=''
+OPT_AUTO_='false'
 
-while getopts "du:g:b:h" opt; do
-    case "$opt" in
-        d) OPT_DEL_='true' ;;
-        u) OPT_USER_="$OPTARG" ;;
-        g) OPT_GROUP_="$OPTARG" ;;
-        b) OPT_BRIDGE_="$OPTARG" ;;
-        h) printUsage; exit 0 ;;
-        ?) printUsage; exit 1 ;;
-    esac
-done
-shift $(($OPTIND - 1))
 
+function printUsage()
+{
+    cat <<EOT
+Usage: "$PN_" [OPTIONS] <tun0> <tun1> ...
+
+$PN_ creates persistent tun/tap devices with bridge handling
+
+OPTIONS:
+   -d             delete the tun devices and remove them from the bridge if given
+   -u <user>      this user should be able to use the tun device
+   -g <group>     this group should be able to use the tun device
+   -b <bridge>    if given, all tun/tap devices are added/removed from the bridge
+   -a             enable auto mode, eg. create the bridge if not already existing and
+                  delete it when empty after removing given tun devices
+   -h             this help
+EOT
+}
 
 function fromCmdline()
 {
@@ -51,20 +58,56 @@ function createTun()
     if [[ $OPT_BRIDGE_ != '' ]]; then
         brctl addif "$OPT_BRIDGE_" "$1"
     fi
+    ifconfig "$1" 0.0.0.0 up
 }
 
 function trashTun()
 {
+    ifconfig "$1" down
     if [[ $OPT_BRIDGE_ != '' ]]; then
         brctl delif "$OPT_BRIDGE_" "$1"
     fi
     tunctl -d "$1"
 }
 
+function die()
+{
+    echo "$@" >&2
+    exit 1
+}
+
+##
+# MAIN
+##
+
+while getopts "du:g:b:ah" opt; do
+    case "$opt" in
+        d) OPT_DEL_='true' ;;
+        u) OPT_USER_="$OPTARG" ;;
+        g) OPT_GROUP_="$OPTARG" ;;
+        b) OPT_BRIDGE_="$OPTARG" ;;
+        a) OPT_AUTO_='true' ;;
+        h) printUsage; exit 0 ;;
+        ?) printUsage; exit 1 ;;
+    esac
+done
+shift $(($OPTIND - 1))
+
 if [[ $OPT_DEL_ == 'false' ]]; then
+    if [[ $OPT_BRIDGE_ != '' && $OPT_AUTO_ == 'true' ]]; then
+        brctl showmacs "$OPT_BRIDGE_" &>/dev/null || brctl addbr "$OPT_BRIDGE_"
+    fi
     fromCmdline "createTun" "$@"
 else
     fromCmdline "trashTun" "$@"
+    if [[ $OPT_BRIDGE_ != '' && $OPT_AUTO_ == 'true' ]]; then
+        tmp_="`brctl showmacs "$OPT_BRIDGE_" |wc -l`"
+        if (( $tmp_ == 1 )); then
+            brctl delbr "$OPT_BRIDGE_"
+        else
+            die "E: bridge $OPT_BRIDGE_ not empty, not removing"
+        fi
+    fi
 fi
 
-# vim: filetype=sh
+## END OF FILE #################################################################