#!/bin/bash
#
# Copyright 2004 - 2009 Pascal Pollet
#
# This file is part of BongoSurfer
#
# BongoSurfer is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
##############################################################################

bad_param () {
    echo "CapiVerbinden.sh: falsche oder unvollstaendige Parameter" >> $LOG
    exit 1
}

# Editiere den PATH, falls ein Kommando nicht gefunden wird
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"

BONGO_CONF_SUDO="/etc/bongosurfer/sudo.conf"

CONF_DIR="${1}/.BongoSurfer"
ANBIETER="${2}"
TARIF="${3}"
PREFIX="${4}"
EINWAHLNUMMER="${5}"
BENUTZERNAME="${6}"
PASSWORT="${7}"
REPLACEDEFAULTROUTE="${8}"
TIMEOUT="${9}"
MULTILINK="${10}"
OWNNUMBER="${11}"

LOG="${CONF_DIR}/BongoSurfer.log"

### checken, ob konfig-Verzeichnis existiert #################################
if [ ! -d $CONF_DIR ]; then
    logger "BongoSurfer Konfigurationsordner $CONF_DIR nicht gefunden!"
    logger "Bitte starten Sie BongoSurfer neu."
    exit 1
fi

# testen, ob stat existiert und ausfuehrbar ist ##############################
if ! which stat > /dev/null; then
    logger "Fehler: Programm stat nicht gefunden!"
    exit 1
fi
if [ ! -x `which stat` ]; then
    logger "Fehler: gefundenes Programm stat nicht ausfuehrbar!"
    exit 1
fi

### Logdatei sofort checken ##################################################
if (! echo "${LOG}" | grep -q 'ongoSurfer'); then
    logger "Fehler: Logdatei scheint nicht von Bongosurfer zu sein!"
    exit 1
fi
if (! echo "${LOG}" | grep -q '.log$'); then
    logger "Fehler: ungueltige Logdatei: ${LOG}"
    exit 1
fi
if [ -L $LOG ]; then
    if ! rm -f $LOG; then
        logger "Cannot remove ugly(?) symlink: $LOG!"
        exit 1
    fi
fi
if [ ! -f $LOG ]; then
    logger "Fehler: Logdatei $LOG nicht gefunden!"
    logger "Bitte starten Sie BongoSurfer neu."
    exit 1
fi
if [ `stat -c %u $LOG 2>/dev/null` = 0 ]; then
    logger "Abbruch: Nutzer-ID des Eigners $LOG ist root!"
    exit 1
fi
# testen, ob pppd existiert und ausfuehrbar ist ##############################
if ! which pppd > /dev/null; then
    echo "Error: pppd executable was not found" >> $LOG
    exit 1
fi

if [ ! -x `which pppd` ]; then
    echo "Error: pppd was found but is not executable" >> $LOG
    exit 1
fi

### fuer debugging ############################################################
echo "Einwahlparameter: $@" >> $LOG

# Einwaehlen
if [ $# -lt 11 ]; then
    echo "CapiVerbinden.sh: zu wenig Parameter" >> $LOG
    exit 1
fi

if (! echo $TIMEOUT | grep -q '^[[:digit:]]*$'); then
    bad_param
fi

if (! echo $EINWAHLNUMMER | grep -q '^[[:digit:]]*$'); then
    bad_param
fi

# MSN checken - falls vorhanden
if [ -n "$OWNNUMBER" ]; then
    if (! echo "$OWNNUMBER" | grep -q '^[[:digit:]]*$'); then
	echo "ungueltiger Wert fuer eigene Rufnummer (MSN): $OWNNUMBER" >> $LOG
	echo "stoppe Einwahlprozess." >> $LOG
	exit 1
    fi
fi

# clean the prefix
PREFIX_TMP="${PREFIX}"
PREFIX_TMP=`echo "${PREFIX_TMP}" | sed 's#[[:space:]]##g'`
PREFIX_TMP=`echo "${PREFIX_TMP}" | sed 's#[^,,&,+,=,%,\,*,-,^,a-z,A-Z,0-9]#_#g'`
if [ "${PREFIX}" != "${PREFIX_TMP}" ]; then
    echo "Warnung: PREFIX wurde geaendert: ${PREFIX_TMP}" >> $LOG
    echo "Bitte kontrollieren Sie Ihre Konfiguration!" >> $LOG
fi
PREFIX="${PREFIX_TMP}"

echo >> $LOG
echo "BongoSurfer startet die Einwahl zu "$ANBIETER" / "$TARIF >> $LOG 
echo >> $LOG
echo "Einwahlnummer: "$EINWAHLNUMMER >> $LOG
echo "Benutzername: "$BENUTZERNAME >> $LOG
echo "Passwort: "$PASSWORT >> $LOG
echo "idle-Timeout: ${TIMEOUT} Sekunden" >> $LOG
echo >> $LOG

# falls sudo methode - dann pap/chap-Eintraege moeglich
if [ -r ${BONGO_CONF_SUDO} ]; then
    if ( grep -q 'sudo=true' ${BONGO_CONF_SUDO} ); then
        if [ -f /etc/ppp/pap-secrets ]; then
            chmod u+w /etc/ppp/pap-secrets
            sed -ri '/.*#BS.*/d' /etc/ppp/pap-secrets
            echo "#BS-entry fuer "$ANBIETER"  "$TARIF >> /etc/ppp/pap-secrets
            echo "\""$BENUTZERNAME"\" * \""$PASSWORT"\" #BS" >> /etc/ppp/pap-secrets
        fi
        if [ -f /etc/ppp/chap-secrets ]; then
            chmod u+w /etc/ppp/chap-secrets
            sed -ri '/.*#BS.*/d' /etc/ppp/chap-secrets
            echo "#BS-entry fuer "$ANBIETER"  "$TARIF >> /etc/ppp/chap-secrets
            echo "\""$BENUTZERNAME"\" * \""$PASSWORT"\" #BS" >> /etc/ppp/chap-secrets
        fi
    fi
fi

# Falls noch eine Verbindung besteht, auflegen
if test "`pidof pppd`" != ""; then
    kill -9 `pidof pppd`
    sleep 1
fi

### check /var/tmp dir
VAR_TMP_DIR="/var/tmp"
VAR_TMP_CAPI="$VAR_TMP_DIR/capi"
if [ ! -d $VAR_TMP_DIR ]; then
    echo "Error: directory $VAR_TMP_DIR not found!" >> $LOG
    echo "Please contact your administrator!!" >> $LOG
    exit 1
fi
if [ -e $VAR_TMP_CAPI ]; then
    if ! rm -f $VAR_TMP_CAPI; then
	echo "Fehler: kann Datei $VAR_TMP_CAPI nicht loeschen!" >> $LOG
	echo "Kontaktieren Sie ihren Administrator!!" >> $LOG
        exit 1
    fi
fi
if ! touch $VAR_TMP_CAPI; then
    echo "Fehler: kann Datei $VAR_TMP_CAPI nicht erstellen!" >> $LOG
    echo "Kontaktieren Sie ihren Administrator!!" >> $LOG
    exit 1
else
    # Einwahlinfos in /var/tmp/capi hineinschreiben
    echo "user $BENUTZERNAME"        > $VAR_TMP_CAPI
    echo "password $PASSWORT"       >> $VAR_TMP_CAPI
    echo "idle $TIMEOUT"            >> $VAR_TMP_CAPI
    echo "number $EINWAHLNUMMER"    >> $VAR_TMP_CAPI
    echo "dialtimeout 9"            >> $VAR_TMP_CAPI
    echo "dialmax 4"                >> $VAR_TMP_CAPI
    
    if [ -n "$OWNNUMBER" ]; then
	echo "msn $OWNNUMBER"       >> $VAR_TMP_CAPI
    fi
    
    if [ "${MULTILINK}" = "multilink" ]; then
        echo "multilink"            >> $VAR_TMP_CAPI
    fi
    
    if [ -n "$PREFIX" ]; then
        echo "numberprefix $PREFIX" >> $VAR_TMP_CAPI
    fi
    
    if [ "${REPLACEDEFAULTROUTE}" = "replacedefaultroute" ]; then
	echo "replacedefaultroute" >> $VAR_TMP_CAPI
    fi
    
    chmod a-w $VAR_TMP_CAPI
fi

sleep 1

# Einwaehlen
pppd logfile $LOG call bongosurfer/isdn &
wait

if [ -e $VAR_TMP_CAPI ]; then
    chmod a+w $VAR_TMP_CAPI
    if ! rm -f $VAR_TMP_CAPI; then
        echo "Fehler: kann Datei $VAR_TMP_CAPI nicht loeschen!" >> $LOG
        echo "Kontaktieren Sie ihren Administrator!!" >> $LOG
    fi
fi

exit $?

### eof
