#!/bin/bash
#
# file encoding: utf-8
#
# bongosetup - Setup fuer Bongosurfer
#
# - Erlaubte Benutzer und Gruppen fuer Dial-Up abfragen und festlegen
# - Einwahlmethode abfragen (sudo/suid)
# - sudo konfigurieren
# - automatischer Setup
# - automatisches Update
# - Status-Anzeige der Konfiguration
# - automatisches Reinigen der /etc/sudoers von alten Eintraegen
#
# Copyright (C) 2004 - 2007 Pascal Pollet <pascal@bongosoft.de>
# http://www.bongosoft.de/
#
# This package 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; version 2 dated June, 1991. This package 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 package; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##############################################################################

PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
SUDOERSMOD=400

LANG=de_DE@UTF-8
export LANG

# Konfigurationsdateien
##############################################################################
BONGO_DIR="/etc/bongosurfer"
BONGO_CONF="${BONGO_DIR}/sudo.conf"
SYSTEM_SUDO="/etc/sudoers"
SUDOBACKUP="/etc/sudoers.bs.old"
##############################################################################
# bongosetup nur als root zulassen
##############################################################################
if [ ! `id -u` = 0 ]; then
    echo "Fehler: bongosetup muss als root ausgefuehrt werden."
    exit 0
fi
##############################################################################
# bongosurfer config-verzeichnis checken, notfalls anlegen
##############################################################################
if [ ! -d $BONGO_DIR ]; then
    echo "Konfigurationsverzeichnis $BONGO_DIR nicht gefunden!"
    echo -n "Erstelle $BONGO_DIR ... "
    umask 022
    if ( ! mkdir -p $BONGO_DIR ); then
	echo "Fehler!"
	exit 0
    else
	echo "Ok."
    fi
    echo 
fi
#################################################################################
# speichert die Berechtigungen der Datei /etc/sudoers in die Variable SUDOERSMOD
#################################################################################
checkSudoersMod () {

	if [ -f $SYSTEM_SUDO ]; then
	    sudoers=`ls -l $SYSTEM_SUDO`
	else
	    return
	fi

        mods=${sudoers:0:10}

        u=0
        g=0
        o=0

        if [ "${mods:1:1}" = "r" ]; then
                let u=$u+4
        fi
        if [ "${mods:2:1}" = "w" ]; then
                let u=$u+2
        fi
        if [ "${mods:3:1}" = "x" ]; then
                let u=$u+1
        fi
        if [ "${mods:4:1}" = "r" ]; then
                let g=$g+4
        fi
        if [ "${mods:5:1}" = "w" ]; then
                let g=$g+2
        fi
        if [ "${mods:6:1}" = "x" ]; then
                let g=$g+1
        fi
        if [ "${mods:7:1}" = "r" ]; then
                let o=$o+4
        fi
        if [ "${mods:8:1}" = "w" ]; then
                let o=$o+2
        fi
        if [ "${mods:9:1}" = "x" ]; then
                let o=$o+1
        fi

        SUDOERSMOD=$u$g$o
}
##############################################################################
# im Fehlerfall Meldung fuer Parameter ausgeben
##############################################################################
sudoers_usage () {
    echo 
    echo "  Optionen fuer $0"
    echo "  ================================================================="
    echo 
    echo "    $0 -a"
    echo "    Automatische (Erst-)Konfiguration - Default: sudo und %dialout"
    echo
    echo "    $0 -c"
    echo "    Alte Bongosurfer-Eintraege aus /etc/sudoers entfernen"
    echo
    echo "    $0 -i"
    echo "    Startet den interaktiven Setup fuer Bongosurfer"
    echo
    echo "    $0 -s"
    echo "    Status-Anzeige der Bongosurfer-Konfiguration"
    echo
    echo "    $0 -u"
    echo "    Startet Update von /etc/sudoers bei Installation"
    echo    
    echo "  ================================================================="
    echo "  Copyright (C) 2004 - 2007 Pascal Pollet <pascal@bongosoft.de>"
    echo
}
##############################################################################
# Status anzeigen
##############################################################################
sudoers_status () {
    echo "************************************"
    echo "Status der Bongosurfer-Konfiguration"
    echo "************************************"
    if [ -f $BONGO_CONF ]; then
	echo "Info: $BONGO_CONF gefunden."	
    else
	echo "Info: $BONGO_CONF nicht gefunden."
    fi
    if [ -r $BONGO_CONF ]; then
	if ( grep -q 'sudo=true' ${BONGO_CONF} ); then
	    echo "Info: aktuelle Einwahlmethode: sudo"
	else
	    echo "Info: aktuelle Einwahlmethode: suid"
	fi
    else
	echo "Info: $BONGO_CONF kann nicht gelesen werden!"
    fi
    if ! which pppd > /dev/null; then
	echo "Info: pppd nicht gefunden."
    else
	echo "Info: aktuelle Berechtigung des pppd:"
	ls -l `which pppd`
    fi
    if which sudo > /dev/null; then
        echo "Info: das Programm sudo wurde gefunden."
    else
	echo "Info: das Programm sudo wurde nicht gefunden!"
    fi
    if [ -f $SYSTEM_SUDO ]; then
        echo "Info: $SYSTEM_SUDO gefunden."
    else
        echo "Info: $SYSTEM_SUDO nicht gefunden!"
    fi
    if [ -r $SYSTEM_SUDO ]; then
	AKTUELLE_NUTZER=`grep '^User_Alias BONGO2_ACCOUNTS' $SYSTEM_SUDO | sed 's/User_Alias BONGO2_ACCOUNTS=//' 2>/dev/null`
	if [ -z "${AKTUELLE_NUTZER}" ]; then
    	    echo "Info: zur Zeit sind keine Benutzer per sudo zugelassen."
	else
	    echo "Info: zugelassene Nutzer: ${AKTUELLE_NUTZER}"
	fi
    else
        echo "Info: $SYSTEM_SUDO kann nicht gelesen werden!"
    fi
    echo "***********************"
    echo "Ende der Status-Anzeige"
    echo "***********************"
}
##############################################################################
# fuer bongosetup ist sudo notwendig!
##############################################################################
sudoers_check_sudo () {
    if ! which sudo > /dev/null; then
	echo "Fehler: das Programm sudo wurde nicht gefunden!"
	echo "Info: $0 setzt sudo voraus."
	echo "Info: bitte installieren Sie das Programm sudo."
	exit 0
    fi
}
##############################################################################
# Rechte setzen fuer /etc/sudoers
##############################################################################
sudoers_rights_saved () {
    if [ ! -f $SYSTEM_SUDO ]; then
        echo "Fehler: kann $SYSTEM_SUDO nicht finden."
        exit 0
    fi    
    chmod $SUDOERSMOD $SYSTEM_SUDO
}
##############################################################################
# Rechte setzen fuer /etc/sudoers - schreibbar machen
##############################################################################
sudoers_rights_for_write () {
    if [ -f $SYSTEM_SUDO ]; then
	chmod 640 $SYSTEM_SUDO
    fi
    if [ ! -w $SYSTEM_SUDO ]; then
	echo "Fehler: kann $SYSTEM_SUDO nicht schreiben."
	exit 0
    fi
}
##############################################################################
# Check /etc/bongosurfer.conf und /etc/sudoers plus Backup
##############################################################################
sudoers_init_files () {
    touch $SYSTEM_SUDO
    sudoers_rights_saved
    if [ ! -e $SUDOBACKUP ]; then
	cp $SYSTEM_SUDO $SUDOBACKUP
    fi
    touch $BONGO_CONF
    if [ ! -w $BONGO_CONF ]; then
	echo "Fehler: kann $BONGO_CONF nicht schreiben."
	exit 0
    fi
}
##############################################################################
# alle Eintraege von Bongosurfer entfernen
##############################################################################
sudoers_delete () {
    sudoers_rights_for_write
    if [ -w $SYSTEM_SUDO ]; then
        echo -n "entferne alte Eintraege von BONGOSURFER in $SYSTEM_SUDO... "
        sed -ri '/(BONGO2|BSISDN)/d' $SYSTEM_SUDO && echo "OK" || echo "Fehler!"
    fi
    sudoers_rights_saved
}
##############################################################################
# Check PPPD
##############################################################################
sudoers_check_pppd () {
    if ! which pppd > /dev/null; then
        echo "Fehler: pppd nicht gefunden."
        exit 0
    fi
}
##############################################################################
# Rechte fuer PPPD nosuid setzen
##############################################################################
sudoers_pppd_nosuid () {
    sudoers_check_pppd
    if [ -u `which pppd` ]; then
        echo "suid-Bit auf "`which pppd`" entfernen? (j/n)"
        echo "(chmod -s "`which pppd`")"
        echo
        while [[ ! ("$entf" = "j" || "$entf" = "n") ]]; do
            read -n 1 entf
            if [[ ! ("$entf" = "j" || "$entf" = "n") ]]; then
                echo "falsche Eingabe, nochmal!"
            fi
        done
        echo
        if [ "$entf" = "j" ]; then
            echo -n "suid-Bit auf pppd wird entfernt... "
            chmod -s `which pppd` && echo "OK" || echo "Fehler!"
        fi
    fi
}
##############################################################################
# Rechte fuer PPPD suid setzen
##############################################################################
sudoers_pppd_suid () {
    sudoers_check_pppd
    echo -n "setze suid-bit auf "`which pppd`"... "
    chmod +s `which pppd` && echo "OK" || echo "Fehler!"
}
##############################################################################
# User und Gruppen festlegen
##############################################################################
sudoers_define () {
    ### alte Eintraege abfragen
    OLD_ENTRY=`grep '^User_Alias BONGO2_ACCOUNTS' $SYSTEM_SUDO | sed 's/User_Alias BONGO2_ACCOUNTS=//' 2>/dev/null`
    if [ -z "${OLD_ENTRY}" ]; then
	OLD_ENTRY='%dialout'
    fi
    echo
    echo " Wer darf mit Bongosurfer Internetverbindungen herstellen?"
    echo " Eine durch Komma getrennte Liste von Benutzernamen oder mit"
    echo " mit einem Prozentzeichen davor fuer Gruppen."
    echo
    echo " Bsp: \"%dialout,martin,eva\" fuer die Gruppe dialout und die "
    echo " Benutzer martin und eva"
    echo
    echo " (Enter für Standard: ${OLD_ENTRY})"
    echo
    echo -n " [Standard \"${OLD_ENTRY}\"] "
    x=0
    
    BONGO2_ACCOUNTS="${BONGO2_ACCOUNTS:=/falscheEingabe}"
    
    until echo "$BONGO2_ACCOUNTS" | egrep -q '(^%?[a-zA-Z_0-9-]+(,%?[a-zA-Z_0-9-]+)*$|^$)'
	do
	    [ $x -gt 0 ] && echo " Falsche Eingabe, bitte nochmal"
    	    echo -n "> "
    	    read BONGO2_ACCOUNTS
    	    ((x++))
	done

    # alte Daten uebernehmen, falls nur ENTER
    if [ -z "${BONGO2_ACCOUNTS}" ]; then
	BONGO2_ACCOUNTS="${OLD_ENTRY}"
    fi
}
##############################################################################
# Alles nach /etc/sudoers schreiben
##############################################################################
sudoers_write () {
    echo "Zugelassene Nutzer: ${BONGO2_ACCOUNTS}"
    echo "Konfiguriere sudo..."
    
    # Alte Eintraege von Bongosurfer entfernen
    sudoers_delete
    # /etc/sudoers schreibbar machen
    sudoers_rights_for_write
    
    # SUDO einrichten fuer ISDN+Modem
    echo -n "Bearbeite $SYSTEM_SUDO... "
    COMMAND_ALIAS="Cmnd_Alias BONGO2_COMMANDS=/usr/share/bongosurfer/skripte/i4l/I4lVerbinden.sh,/usr/share/bongosurfer/skripte/i4l/I4lTrennen.sh,/usr/share/bongosurfer/skripte/i4l/I4l1x.sh,/usr/share/bongosurfer/skripte/i4l/I4l2x.sh,/usr/share/bongosurfer/skripte/modem/ModemVerbinden.sh,/usr/share/bongosurfer/skripte/modem/ModemTrennen.sh,/usr/share/bongosurfer/skripte/capi/CapiVerbinden.sh,/usr/share/bongosurfer/skripte/capi/CapiTrennen.sh,/usr/share/bongosurfer/skripte/capi/Capi1x.sh,/usr/share/bongosurfer/skripte/capi/Capi2x.sh,/usr/share/bongosurfer/skripte/time/synchronizeClock.sh"

    echo "User_Alias BONGO2_ACCOUNTS=$BONGO2_ACCOUNTS"        >> $SYSTEM_SUDO
    echo "$COMMAND_ALIAS"                                     >> $SYSTEM_SUDO
    echo "BONGO2_ACCOUNTS ALL=(ALL) NOPASSWD:BONGO2_COMMANDS" >> $SYSTEM_SUDO
    
    # Check, ob erfolgreich
    if ( grep -q 'BONGO2' $SYSTEM_SUDO ); then
	echo "OK"
    else
	echo "Fehler!"
    fi
    
    # Rechte /etc/sudoers neu setzen
    sudoers_rights_saved
}
##############################################################################
# Setup starten
##############################################################################
sudoers_setup () {
    echo
    echo "  BongoSurfer Setup"
    echo "  ================="
    echo
    echo "  BongoSurfer kann auf 2 verschiedene Weisen ausreichende"
    echo "  Rechte bekommen, um Internetverbindungen herzustellen."
    echo
    echo
    echo "1) Die erste Methode ist die Verwendung von sudo und das Editieren"
    echo "   der Datei /etc/sudoers. Es kann so ganz genau definiert werden,"
    echo "   welche User eine Internetverbindung herstellen duerfen."
    echo "   Diese Methode ist am restriktivsten und wird daher empfohlen."
    echo
    echo "2) Die zweite Methode ist das setzen eines suid-bits auf"
    echo "   /usr/sbin/pppd. Dieser verleiht Usern der Gruppe dialout bzw."
    echo "   dip eingeschraenkte aber ausreichende Rechte ueber pppd."
    echo "   mit dieser Methode ist eine Einwahl über ISDN mit dem Hysax-"
    echo "   Treiber (I4L) nicht moeglich und die Zeitsynchronisierungs-"
    echo "   Funktion wird nicht verfuegbar sein, weil die jeweiligen"
    echo "   Kommandos hierfuer root-Rechte benoetigen."
    echo
    echo -n " weiter: beliebige Taste... "
    read -n 1
    echo
    echo
    echo " Welche Methode soll verwendet werden? ([1] wird empfohlen)"
    echo
    echo " 1: sudo"
    echo " 2: suid-bit auf pppd"
    echo
    while [[ ! ("$methode" = "1" || "$methode" = "2") ]]; do
	read -n 1 methode
	if [[ ! ("$methode" = "1" || "$methode" = "2") ]]; then
	    echo "falsche Eingabe, nochmal!"
	fi
    done
    echo
    if [ "$methode" = "1" ]; then
	echo "setze Einwahlmethode: sudo"
	echo "sudo=true" > $BONGO_CONF
	# suid-Bit pppd entfernen?
	sudoers_pppd_nosuid
	# User und Gruppen definieren
	sudoers_define
	# /etc/sudoers neu schreiben 
	sudoers_write
    else
	echo "setze Einwahlmethode: suid"
	echo "sudo=false" > $BONGO_CONF
	# suid-Bit pppd setzen
	sudoers_pppd_suid
	# Alte Eintraege von Bongosurfer entfernen
	sudoers_delete
	# Rechte /etc/sudoers neu setzen
	sudoers_rights_saved
    fi
    echo "Bongosetup beendet. Starten Sie BongoSurfer neu, falls es noch laeuft."
}
##############################################################################
# Update starten
##############################################################################
# Diese Funktion schreibt BONGO2_COMMANDS neu, eventuell notwendig bei Updates
##############################################################################
sudoers_update () {
        if ( grep -q 'sudo=true' ${BONGO_CONF} ); then
	    ### alte Eintraege abfragen
	    OLD_ENTRYS=`grep '^User_Alias BONGO2_ACCOUNTS' $SYSTEM_SUDO | sed 's/User_Alias BONGO2_ACCOUNTS=//' 2>/dev/null`
	    if [ -z "${OLD_ENTRYS}" ]; then
		# dieser Fall darf eigentlich nie eintreten ... ;-)
                # Alte Eintraege von Bongosurfer entfernen
                sudoers_delete
    		echo "Fertig."
		exit 0
	    else
		# Alte Eintraege von Bongosurfer entfernen
		sudoers_delete
		# /etc/sudoers schreibbar machen
		sudoers_rights_for_write

		echo "Zugelassene Nutzer: ${OLD_ENTRYS}"
		echo "Update Einwahlmethode: sudo"

		# SUDO einrichten fuer ISDN+Modem
		echo -n "Update $SYSTEM_SUDO... "
		COMMAND_ALIAS="Cmnd_Alias BONGO2_COMMANDS=/usr/share/bongosurfer/skripte/i4l/I4lVerbinden.sh,/usr/share/bongosurfer/skripte/i4l/I4lTrennen.sh,/usr/share/bongosurfer/skripte/i4l/I4l1x.sh,/usr/share/bongosurfer/skripte/i4l/I4l2x.sh,/usr/share/bongosurfer/skripte/modem/ModemVerbinden.sh,/usr/share/bongosurfer/skripte/modem/ModemTrennen.sh,/usr/share/bongosurfer/skripte/capi/CapiVerbinden.sh,/usr/share/bongosurfer/skripte/capi/CapiTrennen.sh,/usr/share/bongosurfer/skripte/capi/Capi1x.sh,/usr/share/bongosurfer/skripte/capi/Capi2x.sh,/usr/share/bongosurfer/skripte/time/synchronizeClock.sh"

		echo "User_Alias BONGO2_ACCOUNTS=$OLD_ENTRYS"             >> $SYSTEM_SUDO
		echo "$COMMAND_ALIAS"                                     >> $SYSTEM_SUDO
		echo "BONGO2_ACCOUNTS ALL=(ALL) NOPASSWD:BONGO2_COMMANDS" >> $SYSTEM_SUDO

		# Check, ob erfolgreich
		if ( grep -q 'BONGO2' $SYSTEM_SUDO ); then
    		    echo "OK"
		else
    		    echo "Fehler!"
		fi
		# Rechte /etc/sudoers neu setzen
		sudoers_rights_saved
		echo "Fertig."
		exit 0
	    fi
	else
	    echo "setze Einwahlmethode: suid"
	    echo "sudo=false" > $BONGO_CONF
	    # Alte Eintraege von Bongosurfer entfernen
	    sudoers_delete
	    # Rechte fuer PPPD suid setzen
	    sudoers_pppd_suid
	fi
}
##############################################################################
# MAIN - Parameter checken und Aktion starten
##############################################################################

# alten Status von /etc/sudoers sichern
checkSudoersMod

case "$1" in
    '-a')  ##### automatischer Setup ###################################
	# a wie automatisch
	###################
	echo "Starte automatischen Setup ..."
	# Programm sudo checken
	sudoers_check_sudo
	# configfiles checken
	sudoers_init_files
	# Default Rechte auf die Gruppe dialout
	BONGO2_ACCOUNTS="%dialout"
	# Default Methode auf sudo setzen
	echo "setze Einwahlmethode: sudo"
	echo "sudo=true" > $BONGO_CONF
	# /etc/sudoers automatisch schreiben
	sudoers_write
	echo "Fertig."
        ;;	
    '-c')  ##### Deinstallation ########################################
	# c wie clean
	#############
	# Alte Eintraege von Bongosurfer entfernen
	echo "Starte automatische Bereinigung von /etc/sudoers ..."
	if [ -w $BONGO_CONF ]; then
	    echo "sudo=false" > $BONGO_CONF
	fi
        sudoers_delete
	echo "Fertig."
        ;;
    '-i')  ##### interaktiver Setup ####################################
	# i wie interaktiv
	##################
	# Programm sudo checken
	sudoers_check_sudo
	# configfiles checken
	sudoers_init_files
	# Setup starten
	sudoers_setup
        ;;
    '-s')  ##### Status anzeigen #######################################
        # s wie status 
        ##################    
	sudoers_status
	;;	
    '-u')  ##### stilles Update ########################################
	# u wie update
	##############
	echo "Starte Update von /etc/sudoers ..."
	# Programm sudo checken
	sudoers_check_sudo
        # configfiles checken
        sudoers_init_files
        # Update starten
        sudoers_update
	echo "Fertig."
        ;;	
      *)  ##### Usage ausgeben #########################################
        sudoers_usage
        ;;
esac

exit 0
##############################################################################
# eof
##############################################################################
