#!/bin/bash
# Filename:      grml-network
# Purpose:       simple frontend to varous connection tools
# Authors:       (c) Klaus Knopper Mar 2004, (c) Michael Prokop <mika@grml.org>
# Bug-Reports:   see http://grml.org/bugs/
# License:       This file is licensed under the GPL v2.
# Latest change: Fre Apr 20 00:36:37 CEST 2007 [mika]
################################################################################

PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin"
export PATH

if [ $UID != 0 ] ; then
   echo Error: become root before starting $0 >& 2
   exit 100
fi

# XDIALOG_HIGH_DIALOG_COMPAT=1
# export XDIALOG_HIGH_DIALOG_COMPAT

CHECK=""
[ "$1" = "check" ] && CHECK="yes"

TMP=$(mktemp)

bailout(){
  rm -f "$TMP"
  exit $1
}

DIALOG="dialog"
# [ -n "$DISPLAY" ] && [ -x /usr/bin/Xdialog ] && DIALOG="Xdialog"

trap bailout 1 2 3 15

# LANGUAGE etc.
[ -r /etc/default/locale ] && . /etc/default/locale

gauge(){
  rm -f "$TMP.done"
  status=0
  while [ ! -e "$TMP.done" ]; do
    echo "$status"
    status="`expr \( 100 - $status \) / 4 + $status`"
    sleep 1
  done | $DIALOG --title "$0" --gauge "$1" 8 75 0
}

# Stop status bar
killgauge(){
  touch "$TMP.done" ; wait ; rm -f "$TMP.done"
}

# Provider specific setup - menu
provider () {
  MENUINTERNET=$($DIALOG --stdout --clear --title "$PN" --menu \
  "This script is a submenu of grml-network to set up an internet connection" 14 65 7 \
  "TUG"      "Connect via vpnc to TU Graz" \
  "VCGraz"   "Connect via pptp to VC-Graz" \
  "Inode"    "Connect via pptp to Inode" \
  "Students" "Connect via pptp to Inode-Students" \
  "Exit" "Exit this program")

  retval=$?
  case $retval in
      (0)
        if [ $MENUINTERNET == TUG ] ; then
                exec grml-vpnc-tugraz
        fi
        if [ $MENUINTERNET == VCGraz ] ; then
                exec grml-pptp-vcgraz
        fi
        if [ $MENUINTERNET == Inode ] ; then
                exec grml-pptp-inode
        fi
        if [ $MENUINTERNET == Students ] ; then
                exec grml-pptp-xdsl-students
        fi ;;
      (1)   echo "Cancel pressed." ;;
      (255) echo "ESC pressed."    ;;
  esac
}

main(){
  if [ -z "$NOCHECK" -a -x /usr/bin/nmap ] ; then
  gauge "Checking network status..." &
    STATUS=""
    GW="`echo $(route -n | awk '/^0\.0\.0\.0/{print $2}')`"
    GWDEV="`echo $(route -n | awk '/^0\.0\.0\.0/{print $NF}')`"
    NMAP="$(nmap -sP --host_timeout 4000 --max_rtt_timeout 4000 $GW 2>/dev/null)"

    if [ "$?" = 0 ]; then
      echo "$NMAP" | grep -q "down" >/dev/null 2>&1 || STATUS="online"
    fi

    killgauge

    if [ -n "$STATUS" ]; then
       [ -n "$CHECK" ] && exit 0 # exit if we are already connected
       STATUS="Online ($GWDEV)"
    else
       STATUS="Offline"
    fi
  else
    STATUS="Unknown"
  fi

# Language-dependent Messages
case "$LANGUAGE" in
  de*|at*|ch*)
    TITLE1="Netzwerk-Setup"
    STATUS="Status: $STATUS"
    MESSAGE1="Bitte auswaehlen:"
    MODEMSETUP="/dev/modem-Schnittstelle (neu) konfigurieren"
    NETCARD="Netzwerkkarten (LAN/WLAN) Konfiguration"
    WIRELESS="Wireless Zugang"
    GPRS="Einwahl per Handy/GPRS"
    DSL="Einwahl per DSL-Modem"
    ISDN="Einwahl per ISDN"
    MODEM="Einwahl per Analogmodem"
    PROVIDER="Provider spezifische Einstellungen"
    EXIT="Beenden"
    ;;
  *)
    TITLE1="Network Setup"
    STATUS="Current state: $STATUS"
    MESSAGE1="Please select:"
    MODEMSETUP="(re)configure /dev/modem device"
    NETCARD="Configure network card (LAN/WLAN)"
    WIRELESS="Wireless access"
    GPRS="Dial via cellphone/GPRS"
    DSL="Dial via DSL-adapter"
    ISDN="Dial via ISDN"
    MODEM="Dial via analog modem"
    PROVIDER="Provider specific setup"
    EXIT="Quit"
   ;;
esac

# Shortcut description selected
TYPES=(netcardconfig "$NETCARD" \
provider "$PROVIDER" \
modemlink "$MODEMSETUP" \
gprsconnect "$GPRS" \
pppoeconf "$DSL" \
isdnconfig "$ISDN" \
wvdial "$MODEM")

type wvdial      >/dev/null 2>&1 || { unset TYPES[13]; unset TYPES[12]; }
type isdnconfig  >/dev/null 2>&1 || { unset TYPES[11]; unset TYPES[10];  }
type pppoeconf   >/dev/null 2>&1 || { unset TYPES[9];  unset TYPES[8];  }
type gprsconnect >/dev/null 2>&1 || { unset TYPES[7];  unset TYPES[6];  }
type modemlink   >/dev/null 2>&1 || { unset TYPES[5];  unset TYPES[4];  }

rm -f "$TMP"

$DIALOG --clear --cancel-label "$EXIT" --title "$TITLE1" --menu "$STATUS

$MESSAGE1" 18 75 10 "${TYPES[@]}" 2>"$TMP" || bailout 1

read TYPE <"$TMP"
TYPE="${TYPE#\"}"; TYPE="${TYPE%\"}"
rm -f "$TMP"

case "$TYPE" in
  wvdial) [ -e /etc/wvdial.conf ] || wvdialconf /etc/wvdial.conf ;;
esac

eval $TYPE
return "$?"
}

if [ -z "$NOCHECK" ] ; then
  while true; do
    main
  done
else
  main
fi

## END OF FILE #################################################################
