#!/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin

# Script to configure a new dialin user for either PPP or SLIP

PROTOFILE=/tmp/config_dialin.$$
ADDRMAP=/etc/netscripts/addr-map
SYSFILE=/etc/ppp.sys
HOME_DIR=/etc/netscripts/HOME
SKEL_DIR=/etc/netscripts/SKEL

SYSTEM_NAME=
PROTOCOL=PPP
IP_ADDRESS=DNS
NETMASK=Default

trap "rm -f $PROTOFILE ; exit" 0 1 2 3 15

if [ -z $EDITOR ] ; then
	EDITOR=/dev/null/editor
	while [ ! -x $EDITOR ] ; do
		echo -n "No EDITOR defined.  Which editor? [/usr/bin/vi] "
		EDITOR=$(line)
		if [ -z $EDITOR ] ; then
			EDITOR=/usr/bin/vi
		fi
	done
fi

getyesno()
{
        RESP=$1; shift; ans=

        while [ X"$ans" = X ] ; do
                echo -n $@ "[yes] " ; read ans
                case X"$ans" in
                X | XY* | Xy*)  ans=yes ;;
                XN* | Xn*)      ans=no ;;
                *)              ans= ;;
                esac
        done
        eval $RESP=$ans
}

getreturn()
{
	echo -n "Press <ENTER> to continue (or ^C (interrupt) to exit) "
	line
}

DONE=no
while [ $DONE = no ] ; do
	cat > $PROTOFILE <<!
# Enter information following the ':' for each line
# You may alter the defaults, if needed.

SYSTEM_NAME	: $SYSTEM_NAME
PROTOCOL	: $PROTOCOL
IP_ADDRESS	: $IP_ADDRESS
NETMASK		: $NETMASK
HOME_DIR	: $HOME_DIR

# The Account name will be the SYSTEM_NAME with a 'P' prepended for PPP
# and 'S' for SLIP

# The PROTOCOL may be PPP, SLIP or BOTH (i.e. PPP and SLIP)

# The IP_ADDRESS may be \`\`DNS'', in which case an IP address must already
# be associated with SYSTEM_NAME, \`\`Dynamic'' to use dynamic IP addressing
# (PPP only, see config_ppp(8) to set up dynamic IP addressing) or
# a dotted quad (i.e.  199.198.198.42) which specifieds the IP address.

# Normally NETMASK will be left as \`\`Default'', but if specified,
# it must be a dotted quad (i.e. 255.255.255.192)

# Normally HOME_DIR does not need to be altered.
!
    $EDITOR $PROTOFILE || ( echo "Editor failed.  Aborting." && exit 0 )
    echo
    X_SYSTEM_NAME=
    X_PROTOCOL=
    X_IP_ADDRESS=
    X_NETMASK=
    X_HOME_DIR=
    eval $(cat $PROTOFILE | sed -e 's/:/: /' | grep -v "^#" |
	while read LINE ; do
	    if [ ! X"$LINE" = X ] ; then
		set - $LINE
		if [ $# = 3 -a $2 = ':' ] ; then
		    case $1 in
		    SYSTEM_NAME | PROTOCOL | IP_ADDRESS | NETMASK | HOME_DIR)
			    echo X_$1=$3 \; ;;
		    *) ;;
		    esac
		fi
	    fi
	done
    )
    DONE=yes
    if [ $X_SYSTEM_NAME ] ; then SYSTEM_NAME=$X_SYSTEM_NAME ; else DONE=no ; fi
    if [ $X_PROTOCOL ] ; then PROTOCOL=$X_PROTOCOL ; else DONE=no ; fi
    if [ $X_IP_ADDRESS ] ; then IP_ADDRESS=$X_IP_ADDRESS ; else DONE=no ; fi
    if [ $X_NETMASK ] ; then NETMASK=$X_NETMASK ; else DONE=no ; fi
    if [ $X_HOME_DIR ] ; then HOME_DIR=$X_HOME_DIR ; else DONE=no ; fi
    if [ $DONE = no ] ; then
	echo "All fields must be completed."
	getreturn
	continue
    fi
    DONE=no
    PROTOCOL=$(echo $PROTOCOL | tr "[:lower:]" "[:upper:]")
    case $PROTOCOL in
    PPP | SLIP | BOTH) ;;
    *)
	echo "$PROTOCOL is invalid.  Please use one of PPP, SLIP or BOTH"
	PROTOCOL=PPP
	getreturn
	continue ;;
    esac
    if [ $PROTOCOL = SLIP -o $PROTOCOL = BOTH ] ; then
	if grep -q '^S'$SYSTEM_NAME':' $SYSFILE ; then
	    echo "S$SYSTEM_NAME already has an entry in $SYSFILE"
	    getreturn
	    continue
	fi
	if grep -q '^S'$SYSTEM_NAME':' /etc/passwd ; then
	    echo "S$SYSTEM_NAME is an existing account name."
	    getreturn
	    continue
	fi
    fi
    if [ $PROTOCOL = PPP -o $PROTOCOL = BOTH ] ; then
	if grep -q '^P'$SYSTEM_NAME':' $SYSFILE ; then
	    echo "P$SYSTEM_NAME already has an entry in $SYSFILE"
	    getreturn
	    continue
	fi
	if grep -q '^P'$SYSTEM_NAME':' /etc/passwd ; then
	    echo "P$SYSTEM_NAME is an existing account name."
	    getreturn
	    continue
	fi
    fi
    IP_ADDRESS=$(echo $IP_ADDRESS | tr "[:lower:]" "[:upper:]")
    case $IP_ADDRESS in
    DNS)
	IPADDRESS=$(/usr/libexec/ppputil $SYSTEM_NAME)
	if [ -z $IPADDRESS ] ; then
		echo "No IP address associated with $SYSTEM_NAME"
		getreturn
		continue
	fi
	;;
    DYNAMIC)
	if [ ! $PROTOCOL = PPP ] ; then
		echo "SLIP Cannot use Dynamic IP addressing"
		getreturn
		continue
	fi
	IPADDRESS=DYNAMIC
	;;
    *[^A--/:]* | *.*.*.*.* | *[0-9][0-9][0-9][0-9]* | *[3-9][0-9][0-9]* | \
    *2[6-9][0-9]* | *25[6-9]* )
	echo "Invalid IP address."
	echo "Must be a dotted quad (i.e. 198.197.196.42)"
	getreturn
	continue
	;;
    [0-9]*.[0-9]*.[0-9]*.[0-9]*)
	echo "Make sure that his IP address is entered into your"
	echo "Domain Name System, or in /etc/hosts if you do not use DNS"
	getreturn
	IPADDRESS=$IP_ADDRESS
	;;
    *)	echo "Invalid IP address."
	echo "Must be a dotted quad (i.e. 198.197.196.42)"
	getreturn
	continue
	;;
    esac

    NETMASK=$(echo $NETMASK | tr "[:lower:]" "[:upper:]")
    case $NETMASK in
    DEFAULT) ;;
    *[^A--/:]* | *.*.*.*.* | *[0-9][0-9][0-9][0-9]* | *[3-9][0-9][0-9]* | \
    *2[6-9][0-9]* | *25[6-9]* )
	echo "Invalid NETMASK."
	echo "NETMASK Must be a dotted quad (i.e. 255.255.255.192)"
	getreturn
	continue
	;;
    [0-9]*.[0-9]*.[0-9]*.[0-9]*)
	if [ $IP_ADDRESS = DYNAMIC ] ; then
	    echo "Cannot have a non-default NETMASK and Dynamic IP addressing."
	    getreturn
	    continue
	fi
	;;
    *)	echo "Invalid NETMASK."
	echo "NETMASK Must be a dotted quad (i.e. 255.255.255.192)"
	getreturn
	continue
	;;
    esac

    if [ -e $HOME_DIR -a ! -d $HOME_DIR ] ; then
	echo "HOME_DIR must either not exist or be a directory."
	continue
    fi

    case $PROTOCOL in
    BOTH)
	echo "Ready to setup a PPP account for P$SYSTEM_NAME and a SLIP account for S$SYSTEM_NAME"
	;;
    PPP)
	echo "Ready to setup a PPP account for P$SYSTEM_NAME"
	;;
    SLIP)
	echo "Ready to setup a SLIP account for S$SYSTEM_NAME"
	;;
    esac

    case $IP_ADDRESS in
    DNS)
	echo "Using the Domain Name System or /etc/hosts for the IP address ($IPADDRESS)."
	;;
    DYNAMIC)
	echo "Using dynamic IP addressing."
	;;
    *)
	echo "With an IP address of $IPADDRESS."
	;;
    esac
    if [ ! $NETMASK = DEFAULT ] ; then
	echo "With a netmask set to $NETMASK."
    fi
    echo "With a home directory of $HOME_DIR."
    getyesno DONE "Is this correct?"
done
rm -f $PROTOFILE
if [ $NETMASK = DEFAULT ] ; then
	NETMASK=
fi

if [ $PROTOCOL = PPP -o $PROTOCOL = BOTH ] ; then
    adduser -g netdial \
	    -G "PPP for $SYSTEM_NAME" \
	    -S $SKEL_DIR \
	    -H $HOME_DIR \
	    -m 0555 \
	    -s /usr/bin/ppp \
	    P$SYSTEM_NAME
    echo To later remove this account use the command: rmuser P$SYSTEM_NAME
    echo "P$SYSTEM_NAME:tc=Dialin:" >> $SYSFILE
fi
if [ $PROTOCOL = SLIP -o $PROTOCOL = BOTH ] ; then
    adduser -g netdial \
	    -G "SLIP for $SYSTEM_NAME" \
	    -S $SKEL_DIR \
	    -H $HOME_DIR \
	    -m 0555 \
	    -s /usr/bin/ppp \
	    S$SYSTEM_NAME
    echo To later remove this account use the command: rmuser S$SYSTEM_NAME
    echo "S$SYSTEM_NAME:tc=Dialin:sl:im:id#0:" >> $SYSFILE
fi

if [ $NETMASK ] ; then
    NETMASK=" netmask $NETMASK"
fi

if [ ! $IPADDRESS = DYNAMIC ] ; then
    if [ $PROTOCOL = PPP -o $PROTOCOL = BOTH ] ; then
	echo "P$SYSTEM_NAME	$IP_ADDRESS$NETMASK" >> $ADDRMAP
    fi
    if [ $PROTOCOL = SLIP -o $PROTOCOL = BOTH ] ; then
	echo "S$SYSTEM_NAME	$IP_ADDRESS$NETMASK link2 " >> $ADDRMAP
    fi
    echo "IP address added to $ADDRMAP"
fi
