#!/bin/sh
#
#ident  "@(#)snconfig.SRC 1.8     96/06/05 SMI"
#
# Copyright (c) 1993-1994 by Sun Microsystems, Inc.
#
# Description:
#	This script performs the SolarNet server side startup
#	configuration. It is designed to set up initial SolarNet
#	nameservice appropriate data storage, the initial
#	DHCP (Dynamic Host Configuration Protocol) configuration
#	information, and starts up the SolarNet server daemons.
#	The script will prompt the administrator for information
#	as it executes.	 
#
#	snconfig command line syntax:
#
#	snconfig [-Q]		Quiet mode to suppress milestone messages
#				(defaults to print messages)
#		 [-L]		Log mode to write errors to syslog
#				(defaults is to write errors to terminal)
#		 [-F]		Force updating datastores with default
#				configurations (defaults to adding only
#				missing configuration information)
#
#	snconfig -h		displays the snconfig Usage help line.
#
#	snconfig -v		displays the snconfig version number.
#
##########################################################################
# Get error handling set up first
SCRIPT=`basename ${0}`
INTERRUPTS="1 2 3 15"
trap errorhand ${INTERRUPTS}
###########################################
#	Error Handler - trap interrupts
###########################################
errorhand() {
	trap " " ${INTERRUPTS}

	: ${NOTRAP:="1"}
	if [ ${NOTRAP} -eq 0 ] ; then
		echo "${SCRIPT}: Interrupt wird ignoriert."
		return 0
	else
# add any cleanup here
		if [ -z "${1}" ] ; then
			EXIT=1
		else
			EXIT="${1}"
		fi
		: ${ERROR:="${SCRIPT}: Interrupt!"}
		echo ${ERROR} | sed 's/XX/\
		/g' >&2
			exit ${EXIT}
	fi
}
###########################################
#
# Global variables
#
###########################################
#
VERSION=1.5.1.1
SOLARNETDIR=/opt/SUNWpcnet
NETINTLIST=""
#
ERR=0
NULL="\"\""
TRUE=0
FALSE=1
WARNING=1
SUCCESS=0
ERRRET=2
MAXRETRIES="XXX"
SNWAITTIME=3
NL="\015"
#
# Following variables control error messages and log messages
# Default is to see errors and not log
# To suppress errors, set QUIET to "-Q"; to log, set LOG to "-L"
#
QUIET=
LOG=
#
# Following variables control updating existing information
# Default is to not overwrite existing data, but only add missing info
#
UPDATE=
#
# Following variables control debugging information...
#
MYQUIET=$FALSE
MYLOG=$FALSE
DEBUG=$FALSE
#
# Following variables control processing.  Each variable controls
# a functional section of the script.  If variable is "$TRUE",
# it is executed.  If "$FALSE", the section is skipped.
# Sections include:
#
#  VARIABLE		ACTION
#  ----------------	-------------------------------------------------
#  DO_SETUP		Set up SolarNet name service
#  DO_ADMIN		Set up SolarNet primary administrator
#  DO-CREATE		Creaete and verify initial data tables
#  DO_EXPORT		Export SolarNet client executables and config files
#  DO_DHCP_SETUP	Set up DHCP default dhcptab symbols and macros
#  DO_DHCP_NETWORK	Set up DHCP client per network IP tables
#  DO_SOLARNET_START	Install script and start SolarNet servers
#			(solarnetd, in.dhcpd)
#  DO_PCNFSD_START	Start Pcnfsd servers (script installed by package)
#			(pcnfsd, msgserv, plumd)
#  DO_ADD_LICENSES	Add client licenses to plum
#  DO_SERVER_ADV	Advertise SolarNet services
#
DO_SETUP=$TRUE
DO_ADMIN=$TRUE
DO_CREATE=$TRUE
DO_EXPORT=$TRUE
DO_DHCP_SETUP=$TRUE
DO_DHCP_NETWORK=$TRUE
DO_SOLARNET_START=$TRUE
DO_PCNFSD_START=$TRUE
DO_ADD_LICENSES=$TRUE
DO_SERVER_ADV=$TRUE
#
# Following variables are the default values for SolarNet prompting.
# Variables include:
#
#  VARIABLE		MEANING
#  ----------------	-------------------------------------------------
#  DFLT_NAME_SERVICE	Name service for SolarNet table data stores
#  DFLT_ADMIN		User identity for SolarNet primary administrator
#  DFLT_CLIENT_OPTION	Allocate dynamic PC client IP addresses for subnets
#  DFLT_CLIENT_COUNT	Number of dynamic PC client IP addresses to allocate
#  DFLT_CLIENT_RANGE	Range of IP addresses in each subnet to search.
#			Value must be "-f nnn" or "-l nnn".  See snsubnet.
#  DFLT_ADDLICENSES	User wishes to add client licenses to plum.
#  DFLT_NUMLICENSES	User has a license agreement for this number of licenses.
#  DFLT_LICENSECODE	There is no default license CODE1/CODE2. All are unique.
#
# If a default value is $NULL, there is no default and a value must be
# entered for the associated prompt.
#
DFLT_NAME_SERVICE="nisplus"
DFLT_ADMIN=$NULL
DFLT_NIS_ADMIN="root"
DFLT_NIS_SOURCE="/etc/yp"
DFLT_CLIENT_OPTION="ja"
DFLT_CLIENT_COUNT="16"
DFLT_CLIENT_RANGE="-l 64"
DFLT_ADDLICENSES="ja"
DFLT_NUMLICENSES="1"
DFLT_LICENSECODE=$NULL
SUNW_PCW_LAN=":SNCpath=\"/opt/SUNWpcnet/%CLNT_VERS%/site\":SNCboot=\"pcnfspro\\\\boot.snc\":SNClogin=\"pcnfspro\\\\login.snc\":SNClgout=\"pcnfspro\\\\logout.snc\":"
#
# Following variables are default SolatNet directories and scripts
#
SNMAILPATH=${SOLARNETDIR}/pcnfs/bin
SNMAILFILE=email.ini
PCNFSDIR=/opt/SUNWpcnfs
SNSCRIPTPATH=${SOLARNETDIR}/etc/init.d
PCSCRIPTPATH=${PCNFSDIR}/scripts
SNSCRIPT=solarnet
SNSCRIPTTMP="solarnet.tmp"
PCSCRIPT=pcnfs
PCNFSSTART=32${PCSCRIPT}
SOLARNETSTART=33${SNSCRIPT}
PLUMTMP="plum.tmp"
#
# Following variables are commands used in this script
#
LOGGER=/usr/ucb/logger
SNSETUP=${SOLARNETDIR}/bin/snsetup
SNADMIN=${SOLARNETDIR}/bin/snadmin
SNTABLE=${SOLARNETDIR}/bin/sntable 
SNDHCPINIT=${SOLARNETDIR}/bin/sndhcpinit
SNDHCPADD=${SOLARNETDIR}/bin/sndhcpadd
SNSUBNET=${SOLARNETDIR}/bin/snsubnet
SNCLNTINIT=${SOLARNETDIR}/bin/snclntinit
SNSERVADD=${SOLARNETDIR}/bin/snservadd
PLUM=${PCNFSDIR}/bin/plum
NISUPDATE=${SOLARNETDIR}/bin/nisupdate
#
# Following variables to export SolarNet directories and install scripts
#
SHARENFS_PART1="share -F nfs -o rw -d SolarNet"
DFSTAB=/etc/dfs/dfstab
INITD=/etc/init.d
RC3D=/etc/rc3.d
RC2D=/etc/rc2.d
RC1D=/etc/rc1.d
RC0D=/etc/rc0.d
#
# Following variables are section headers printed during execution
#
SEC_HDR_STOP="Abschnitt 1  - Alle aktiven PC-NFS- und SolarNet-Dmonen stoppen"
SEC_HDR_NS="Abschnitt 2	 - Namensdienst fr SolarNet-Tabellen festlegen"
SEC_HDR_TBL="Abschnitt 3  - SolarNet-Tabellen erstmalig erstellen"
SEC_HDR_ADM="Abschnitt 4  - SolarNet-Primrverwalter festlegen"
SEC_HDR_DHCP="Abschnitt 5  - DHCP-Netzwerk-Standardkonfigurationen erstellen"
SEC_HDR_CLNT="Abschnitt 6  - Jedes Teilnetz fr DHCP konfigurieren"
SEC_HDR_EXP="Abschnitt 7  - SolarNet-Dateisysteme exportieren"
SEC_HDR_SND="Abschnitt 8  - SolarNet-Dmonen starten"
SEC_HDR_PCD="Abschnitt 9  - PC-NFS-Dmonen starten"
SEC_HDR_CAP="Abschnitt 10 - Informationen ber SolarNet-Dienste"
#
# Following variables are messages used in this script
#
MSGVERSION="Die aktuelle Version ist "
MSGNOSUBNETS="Fr die Netzwerkschnittstellen dieses Systems existieren keine verwendbaren Teilnetze."
MSGSUBNETLIST="Fr jedes der folgenden Teilnetze kann festgelegt werden:\n  - ob der DHCP-Dmon DHCP-Anforderungen im entsprechenden Teilnetz berwachen soll\n  - und wieviele PC-Clients dynamisch zugewiesene IP-Adressen erhalten sollen.\n"
MSGDOSUBNET1="Soll der DHCP-Dmon auf diesem Server das Teilnetz berwachen"
MSGDOSUBNET2="\nbei PCs, die DHCP-Netzwerkkonfigurationen anfordern? (ja, nein, ?, beenden)"
HELPDOSUBNET="Sie knnen festlegen, da der DHCP-Dmon ein angegebenes Teilnetz auf Anforderungen von PC-Client-Systemen nach ihren Netzwerkkonfigurationen berwacht.  Der DHCP-Server berprft dann seine Datenbanken und gibt die Netzwerkkonfigurationen seiner Clients zurck. Sowohl dynamische als auch permanente PC-Clients knnen konfiguriert werden.\n  Geben Sie	\"Ja\" ein, um DHCP-Anforderungen auf dem angegbenen Teilnetz zu berwachen.\n  Geben Sie \"Nein\" ein, um das Teilnetz zu berspringen."
MSGNUMCLIENTS="Wollen Sie in diesem Teilnetz dynamische PC-Clients hinzufgent?\nFalls ja, wie viele?. (nein, Anzahl, ?, beenden)"
HELPNUMCLIENTS="Gibt die Anzahl der IP-Adressen an, die Sie in diesem Teilnetz fr dynamische SolarNet-Clients reservieren mchten - das heit fr die Clients, die jedesmal, wenn sie gestartet werden, die nchste verfgbare IP-Adresse erhalten. Bei der Berechnung der Anzahl drfen Sie PC-NFS-Systeme, die zu SolarNet-Clients aufgerstet werden, nicht mitzhlen; ihre IP-Adressen sind bereits reserviert.\n\nDie Adressenanzahl kann spter verringert oder erhht werden, indem Sie den Befehl snconfig erneut ausfhren."
MSGRANGE="Welchen IP-Adressenbereich wollen Sie in diesem Teilnetz nach zuweisbaren ungenutzten Adressen durchsuchen? (IP_Adresse_1 IP_Adresse_2, ?, beenden)"
HELPRANGE="Geben Sie zwei IP-Adressen ein (z. B. 129.148.5.100 129.148.5.200), um den Bereich zu definieren, der nach unbenutzten Adressen durchsucht werden soll. Sie knnen vor- und rckwrts suchen; die SolarNet-Suche beginnt mit der ersten eingegebenen Adresse und wird zur zweiten hin fortgesetzt."
MSGNSCONTFILES="Wollen Sie weiter mit diesem Namensdienst arbeiten, oder ihn beenden, um nisplus zu starten? (fortsetzen,?,beenden)"
CONTINUE="fortsetzen"
HELPNS="Der SolarNet-Server kann entweder nisplus oder files als Namensdienst verwenden."
HELPNS1="Der Namensdienst nisplus mu bereits aktiv sein, damit der SolarNet-Server ihn verwenden kann."
HELPNS2="Der Namensdienst nis mu bereits aktiv sein, damit der SolarNet-Server ihn verwenden kann."
MSGNAMESERVICE="Geben Sie den Namensdienst ein, den SolarNet verwenden soll:(nisplus, files, ?, beenden)?"
MSGADMIN="Geben Sie den Benutzernamen des primren SolarNet-Verwalters ein:(Benutzername,?,beenden)"
HELPADMIN="Sie mssen den Benutzernamen eines existierenden Accounts eingeben. Wenn Sie den Namensdienst NIS+ verwenden, drfen Sie nicht die Superuser-Berechtigung whlen."
MSGNISSOURCE="Geben Sie den Namen des Verzeichnisses mit den NIS-Tabellen-Quelldateien an  "
HELPNISSOURCE="Sie mssen den Namen des Verzeichnisses mit den NIS-Master's NIS-Tabellen-Quelldateien angeben. Wenn Sie /etc. auswhlen , werden Ihre lokalen Konfigurationsdateien verwendet. Die Dateien knnen in einem entfernt gemounteten Verzeichnis sein."
MSGNISSOURCECONT="Mchten Sie mit einem anderen Pfad fortfahren oder beenden, um die NIS-Quelldateien einzurichten? (weiter,?,beenden)"
MSGDOLIC1="Mchten Sie dem Plum-Lizenz-Server Client-Lizenzen hinzufgen? (ja, nein, ?, beenden)"
HELPADDLICENSES="SolarNet PC-Admin wird mit Client-Lizenzen geliefert, die in den PLUM (PC-NFS-License Usage Manager)-Lizenz-Server eingegeben werden knnen."
MSGNUMLICENSES="Bitte geben Sie die Anzahl der Lizenzen Ihrer Lizenzvereinbarung ein. (0, Anzahl an Lizenzen, ?, beenden)"
HELPNUMLICENSES="Dies ist die Anzahl der Lizenzen in Ihrer Lizenzvereinbarung. Geben Sie 0 ein, um das Hinzufgen von Lizenzen zu beenden und mit der Konfiguration fortzufahren."
MSGLICENSEKEY="Geben Sie den CODE1 Ihrer Lizenzvereinbarung ein. (CODE1, ?, beenden)"
HELPCODE1="Die CODE1-Nummer ist die Lizenz (Ziffer) unten auf Ihrer Lizenzvereinbarung."
MSGLICENSEFIRST="Geben Sie CODE2 Ihrer Lizenzvereinbarung ein. (CODE2, ?, beenden)"
HELPCODE2="Die CODE2-Nummer ist die Start-Lizenznummer unten auf Ihrer Lizenzvereinbarung."
MSGLICADDOK="Lizenz(en) erfolgreich hinzugefgt."
MSGNEXTAGREEMENT="Mchten Sie Lizenzen aus einer anderen Vereinbarung hinzufgen? (ja, nein, ?, beenden)"
MSGUPDATINGNISMAPS="Wiedererstellen von NIS-Tabellen aus aktualisierten Quelldateien."
#
# Following variables are error messages for this script
#
ERRNOCMD="SN6001  Der folgende Komponentenbefehl wurde nicht gefunden: "
ERRNISPLUSNOTRUNNING="SN6002  Nisplus ist im Moment nicht aktiv. Sie knnen mit der Namensdienstoption files fortfahren oder das Skript beenden, nisplus starten und snconfig erneut ausfhren."
ERRNAMESERVICE="SN6003  Zulssige Optionen sind nisplus und files."
ERRBADADMIN="SN6004  Fehler bei der Einrichtung des Primrverwalters. Bitte fhren Sie die Einrichtung erneut durch."
ERRMAXADMIN="SN6005  Zulssige Wiederholungen fr die Einrichtung des Primrverwalters berschritten; Programm wird beendet."
ERRBADNUMBER="SN6006  Unzulssige Clients-Anzahl."
ERRBADRANGE="SN6007  Fehler bei der Initialisierung dynamisch zugewiesener Client-Eintrge fr IP-Adressen."
ERRBADDHCPOPT="SN6008  Unzulssige Option. Antworten Sie mit \"Ja\" oder \"Nein\"."
ERRDHCPINIT="SN6009  Fehler beim Versuch, die DHCP-Tabelle einzurichten; Programm wird beendet."
ERRCLNTINIT="SN6010  Fehler beim Versuch, IP-Adressen einzurichten; Programm wird beendet."
ERRNSSETUP="SN6011  Fehler beim Versuch, den SolarNet-Namensdienst einzurichten;	 Programm wird beendet."
ERRPERMTABLE="SN6012  Fehler beim Versuch, den SolarNet-Verwaltungszugriff einzurichten; Programm wird beendet."
ERRROOT="SN6013  Sie mssen eine Superuser-Berechtigung haben, um snconfig auszufhren."
ERRDFSTAB="SN6014  $DFSTAB nicht gefunden."
ERRSOLARNETDIR="SN6015  $SOLARNETDIR nicht gefunden. Wurde die SolarNet-Installation ohne Fehlermeldungen beendet?"
ERRINITD="SN6016  $INITD existiert nicht oder ist kein Verzeichnis."
ERRRC3D="SN6017  $RC3 existiert nicht oder ist kein Verzeichnis."
ERRRC2D="SN6018  $RC2 existiert nicht oder ist kein Verzeichnis."
ERRRC1D="SN6019  $RC1 existiert nicht oder ist kein Verzeichnis."
ERRRC0D="SN6020  $RC0 existiert nicht oder ist kein Verzeichnis."
ERRNOSOLAR="SN6021  !!! WARNUNG !!! SolarNet-Dmon-Prozesse nicht gestartet!"
ERRNOPCNFS="SN6022  !!! WARNUNG !!! Pcnfs-Dmon-Prozesse nicht gestartet!"
ERRLICADD="SN6023  Error adding licenses to license database."
ERRBADLICOPT="SN6024  Ungltige Anzahl an Lizenzvereinbarungen."
ERRNISNOTRUNNING="SN6025  Nis is not currently running. You can either continue with the files name service option, or exit from this script, start nis, and run snconfig again."
#
###########################################
#	Handle echos: quiet or also to the log
#	Default is echo errors to the screen
#	If log option is specified then log to SYSLOG
###########################################
myecho() {
	if [ $MYQUIET -eq $FALSE ]; then
		echo "$1"
	fi
	if [ $MYLOG -eq $TRUE ]; then
		if [ -f $LOGGER ] ; then
			$LOGGER -i -t $SCRIPT "$1" 2> /dev/null
		fi
	fi
}
###########################################
#	For debugging - be silent when not
###########################################
mydebug() {
	if [ $DEBUG -eq $TRUE ]; then
		echo "$1"
	fi
}
###########################################
#	Print Usage Message
###########################################
Print_Usage() {
	echo >&2 "Syntax: snconfig [-F] [-Q] [-L]"
	echo >&2 "	  snconfig  -v"
	echo >&2 "	  snconfig  -h"
}
###########################################
#	Print Version Message
###########################################
Print_Version() {
	myecho "$VERSION"
}
###########################################
#	Display help messages
###########################################
Display_help() {
	echo "$1"
}
###########################################
#	Anykey - hit any key to continue
###########################################
anykey(){
echo
echo "Drcken Sie die Eingabetaste, um mit der SolarNet-Konfiguration fortzufahren"
read key
case $key in
	*) ;;
esac
}
###########################################
#	Enter help system
###########################################
Show_help() {
	echo "$1"
}
###########################################
#	Display section headers
###########################################
Display_header() {
	if [ "$#" -ne 0 ] ; then
		myecho "" 
		myecho "$1"
		myecho "----------"
		myecho ""
	fi
}
###########################################
#	Display error messages
###########################################
Display_error() {
	if [ "$#" -ne 0 ] ; then
		myecho "" 
		myecho "$1"
		myecho ""
	fi
}
###########################################
#	Prompt the user for input
#	$1:message $2:default $3:helptext
#	Returns what the user types in
#	also logs to syslog where appropriate
###########################################
Query() {
	
	okchoice=0
	while [ $okchoice -eq 0 ]
	do
		echo " "
		if [ "$2" = $NULL ] ; then
			echo $1 
			if [ $MYLOG -eq $TRUE ] ; then
				if [ -f $LOGGER ] ; then
					$LOGGER -i -t $SCRIPT "$1" 2> /dev/null
				fi
			fi
		else
			echo $1 "[" $2 "]" 
			if [ $MYLOG -eq $TRUE ] ; then
				if [ -f $LOGGER ] ; then
					$LOGGER -i -t $SCRIPT "$1" 2> /dev/null
				fi
			fi
		fi
		read choice
		if [ $MYLOG -eq $TRUE ] ; then
				if [ -f $LOGGER ] ; then
					$LOGGER -i -t $SCRIPT "$choice" 2> /dev/null
				fi
		fi
		case "$choice"
		in
			"b"|"B"|"beenden"|"BEENDEN") exit 1
				;;
			"?") Display_help "$3"
#				anykey
				continue;
				;;
			"") if [ "$2" != $NULL ] ; then
					ENTERED="$2"
					myecho "$ENTERED"
					return 0
				else
					Display_help "$3"
#					anykey
					continue;
				fi
					;;
			*) ENTERED=$choice
				return 0
		esac
	done
}
###########################################
#	Setup the DHCP data store: 
#	for the per network information
###########################################
DHCP_Network() {
# set up per network databases
# find out how many interfaces
	ERR1=0
	Display_header "${SEC_HDR_CLNT}"
	if [ ! -f $SNSUBNET ] ; then
		myecho "${ERRNOCMD} $SNSUBNET"
		ERR1=1
		return 1
	fi
	if [ ! -f $SNCLNTINIT ] ; then
		myecho "${ERRNOCMD} $SNCLNTINIT"
		ERR1=1
		return 1
	fi
	NETINTLIST=""
	mydebug "$SNSUBNET -q $LOG -i"
	SUBNETLIST=`$SNSUBNET -Q $LOG -i`
	if [ "$?" -ne 0 ] ; then
		$SNSUBNET -i
		ERR1=1
		return 1
	fi
	if [ "$SUBNETLIST" = "" ] ; then
		set ""
		NUMNETS=0
	else
		set $SUBNETLIST
		NUMNETS="$#"
	fi
	if [ $NUMNETS -eq 0 ] ; then
		myecho "${MSGNOSUBNETS}"
	else
		myecho ""
		myecho "${MSGSUBNETLIST}"
		myecho "${SUBNETLIST}"
	fi
	while [ "$1" != "" ]
	do
		SUBNET=$1
		mydebug "$SNSUBNET $QUIET $LOG -m $SUBNET"
		SUBMASK=`$SNSUBNET $QUIET $LOG -m $SUBNET`
		mydebug "$SNSUBNET $QUIET $LOG -n $SUBNET"
		SUBNAME=`$SNSUBNET $QUIET $LOG -n $SUBNET`
		DOSUBNET=""
		while [ "$DOSUBNET" = "" ]
		do
			Query "${MSGDOSUBNET1} $SUBNET $MSGDOSUBNET2" "${DFLT_CLIENT_OPTION}" "$HELPDOSUBNET"
			ANS=$ENTERED
			if [ "${ANS}" = "ja" -o "${ANS}" = "JA" -o "${ANS}" = "j" -o "${ANS}" = "J" ] ; then
				DOSUBNET=j
			fi
			if [ "${ANS}" = "nein" -o "${ANS}" = "NEIN" -o "${ANS}" = "n" -o "${ANS}" = "N" ] ; then
				DOSUBNET=n
			fi
			if [ "$DOSUBNET" = "" ] ; then
				Display_error "$ERRBADDHCPOPT"
			fi
		done
		if [ $DOSUBNET = "j" ] ; then
# Set the network interface option for the dhcp daemon process
			if [ "${NETINTLIST}" = "" ] ; then
				NETINTLIST="${SUBNAME}"
			else
				NETINTLIST="${NETINTLIST},${SUBNAME}"
			fi
# Set number of dynamic PC clients for this subnet
			NUMCLIENTS=""
			while [ "$NUMCLIENTS" = "" ]
			do
# Get the number of clients
				Query "${MSGNUMCLIENTS}" "$DFLT_CLIENT_COUNT" "$HELPNUMCLIENTS"
				if [ $ENTERED = "nein" -o $ENTERED = "n" -o $ENTERED = "NEIN" -o $ENTERED = "N" ] ; then
					NUMCLIENTS="0"
				else 
					NUMCLIENTS=`expr $ENTERED + 0`
					if [ "$NUMCLIENTS" != "$ENTERED" ] ; then
						Display_error "$ERRBADNUMBER"
						NUMCLIENTS=""
					fi
				fi
# Get the range of IP addresses to search for this subnet
			if [ "${NUMCLIENTS}" != "0" -a "${NUMCLIENTS}" != "" ] ; then
				ADDRRANGE=""
				if [ "${DFLT_CLIENT_RANGE}" != $NULL ] ; then
					mydebug "$SNSUBNET $QUIET $LOG -r $SUBNET -m $SUBMASK $DFLT_CLIENT_RANGE"
					ADDRRANGE=`$SNSUBNET $QUIET $LOG -r $SUBNET -m $SUBMASK $DFLT_CLIENT_RANGE`
				fi
				Query "${MSGRANGE}" "${ADDRRANGE}" "${HELPRANGE}"
				ADDRRANGE=$ENTERED
# Create the specified number of dynamic PC clients
				mydebug "$SNCLNTINIT $QUIET $LOG -s $SUBNET -n $NUMCLIENTS -r $ADDRRANGE "
				$SNCLNTINIT $QUIET $LOG -s $SUBNET -n $NUMCLIENTS -r $ADDRRANGE
				if [ "$?" -eq $ERRRET ] ; then
					Display_error "$ERRBADRANGE"
					NUMCLIENTS=""
				fi
			fi
			done
		fi
		shift 
	done 
	return $ERR1
}
###########################################
#	NameService_Setup
#	Assumes that if a command line option
#	was entered, that it has been checked for legality
###########################################
#
NameService_Setup() {
# Determine the name service to be used
# First query what the system's name service is
# SolarNet server choices: nisplus, nis or files
#
	ERR1=0
	Display_header "${SEC_HDR_NS}"
	if [ ! -f $SNSETUP ] ; then
		myecho "${ERRNOCMD} $SNSETUP"
		ERR1=1
		return 1
	fi
# Get the name service the server is currently using: NIS+,  NIS or /etc files
# If current name service is found, use it as the default
	CURRENTNAMESERVICE=`$SNSETUP $QUIET $LOG -q -D`
	if [ "$?" -eq $ERRRET ]; then
		CURRENTNAMESERVICE=$NULL
		ERR1=1
	fi
	if [ -n "$CURRENTNAMESERVICE" ] ; then
		DFLT_NAME_SERVICE=$CURRENTNAMESERVICE
	fi

# Query for the user's preference of name service
	okchoice=0
	while [ $okchoice -eq 0 ]
	do
		Query "$MSGNAMESERVICE" $DFLT_NAME_SERVICE "$HELPNS"
		case "$ENTERED"
		in
			"files"|"FILES") SNNAMESERVICE="files"
				;;
			"nisplus"|"NISPLUS") SNNAMESERVICE="nisplus"
				;;
			"nis"|"NIS") SNNAMESERVICE="nis"
				;;
			*) Display_error "$ERRNAMESERVICE"
				continue;
				;;
		esac
# For now,  it is a bit of overkill to prompt when the
# only choice is files - but for when we add more name services ...
		if [ "$SNNAMESERVICE" = "nisplus" ] ; then
			if [ "$CURRENTNAMESERVICE" != "nisplus" ] ; then
				Display_error "$ERRNISPLUSNOTRUNNING"
				Query "$MSGNSCONTFILES" $CONTINUE "$HELPNS1"
				case "$ENTERED"
				in
					"fortsetzen"|"FORTSETZEN"|"j"|"J"|"ja"|"JA"|"files"|"FILES") SNNAMESERVICE="files"
						break;
						;;
					*) exit 1
				esac
			else
				break;
			fi
		else
			break;
		fi
		if [ "$SNNAMESERVICE" = "nis" ] ; then
			if [ "$CURRENTNAMESERVICE" != "nis" ] ; then
				Display_error "$ERRNISNOTRUNNING"
				Query "$MSGNSCONTFILES" $CONTINUE "$HELPNS2"
				case "$ENTERED"
				in
					"fortsetzen"|"FORTSETZEN"|"j"|"J"|"ja"|"JA"|"files"|"FILES") SNNAMESERVICE="files"
						break;
						;;
					*) exit 1
				esac
			else
				break;
			fi
		else
			break;
		fi
	done

	# Set the SolarNet name service type.  Exit if error setting it up.
	# For NIS, we need to gather a few parameters first to pass to SNSETUP
	if [ "$SNNAMESERVICE" = "nis" ] ; then

		okchoice=0
		while [ $okchoice -eq 0 ]
		do
			# See if we can determine a path for the NIS sources
			YPDIR=`/usr/bin/grep '^DIR[	]*=' /var/yp/Makefile 2>/dev/null | /usr/bin/cut -f2 -d'='`
			if [ -d "$YPDIR" ] ; then
				DFLT_NIS_SOURCE=$YPDIR
			fi
			# Query for the NIS map source files path
			Query "$MSGNISSOURCE" $DFLT_NIS_SOURCE "$HELPNISSOURCE"
			NISSOURCE=$ENTERED
			# Store the path into the config file
			$SNSETUP $QUIET $LOG -c "$NISSOURCE"
			if [ "$?" -eq $ERRRET ] ; then
				Display_error "$ERRORNISSOURCE"
				Query "$MSGNISSOURCECONT" $CONTINUE "$HELPNISSOURCE"
				case "$ENTERED"
				in
					"FORTSETZEN"|"fortsetzen"|"j"|"J"|"ja"|"JA") 
						;;
					*) exit 1
				esac
			else
				okchoice=1
			fi
		done	

	fi

	$SNSETUP $QUIET $LOG -n $SNNAMESERVICE
	if [ "$?" -eq $ERRRET ] ; then
		Display_error "$ERRORNSSETUP"
		exit 1
	fi

	return $ERR1
}

###########################################
#	InitTables
#	Creates initial tables if they do not exist
#	Verifies user can update tables if they do exist
###########################################
#
InitTables() {
# Initialize minimal name service databases
# Warning means file not found for sntable
# Includes:
#	dhcptab
#	perm
#	servers

	ERR1=0
	Display_header "${SEC_HDR_TBL}"
	myuser=`id | cut -f1 -d\) | cut -f2 -d\(`

# create dhcptab table
	mydebug "$SNTABLE -Q $LOG -t dhcptab"
	$SNTABLE -Q $LOG -t dhcptab
	if [ "$?" -eq $WARNING ] ; then
		mydebug "$SNTABLE $QUIET $LOG -c dhcptab"
		$SNTABLE $QUIET $LOG -c dhcptab
		if [ "$?" -eq $ERRRET ] ; then
			Display_error "$ERRDHCPINIT"
			exit 1
		fi
	else
		if [ "$?" -eq $ERRRET ] ; then
			$SNTABLE $QUIET $LOG -t dhcptab
		fi
	fi
# verify user can update table - errors considered warning
	mydebug "$SNTABLE $LOG -t dhcptab -u $myuser"
	$SNTABLE $LOG -t dhcptab -u $myuser

# create perm table
	mydebug "$SNTABLE -Q $LOG -t perm"
	$SNTABLE -Q $LOG -t perm
	if [ "$?" -eq $WARNING ] ; then
		mydebug "$SNTABLE $QUIET $LOG -c perm"
		$SNTABLE $QUIET $LOG -c perm
		if [ "$?" -eq $ERRRET ] ; then
			Display_error "$ERRPERMTABLE"
			exit 1
		fi
	else
		if [ "$?" -eq $ERRRET ] ; then
			$SNTABLE $QUIET $LOG -t perm
		fi
	fi
# verify user can update table - errors considered warning
	mydebug "$SNTABLE $LOG -t perm -u $myuser"
	$SNTABLE $LOG -t perm -u $myuser

# create servers table
	mydebug "$SNTABLE -Q $LOG -t servers "
	if [ ! -f $SNTABLE ] ; then
		myecho "${ERRNOCMD} $SNSETUP"
		ERR1=1
		return 1
	fi
	$SNTABLE -Q $LOG -t servers
	if [ "$?" -eq $WARNING ] ; then
		mydebug "$SNTABLE $QUIET $LOG -c servers"
		$SNTABLE $QUIET $LOG -c servers
		if [ "$?" -eq $FALSE ] ; then
# Don't exit if unable to set up the servers table
# This does not have to exist to run SolarNet
			Display_error "$ERRSERVERTABLE"
			ERR1=1
		fi
	else
# verify user can update table - errors considered warning
		mydebug "$SNTABLE $LOG -t servers -u $myuser"
		$SNTABLE $LOG -t servers -u $myuser
	fi

return $ERR1
}
###########################################
#	Access_Setup
#	Give the Primary Administrator access
#	to the SolarNet data stores from the PC
###########################################
Access_Setup(){
	
# Query for the primary administrator
	Display_header "${SEC_HDR_ADM}"
	USEADMIN=$DFLT_ADMIN
	Query "$MSGADMIN" $USEADMIN "$HELPADMIN"
	USEADMIN=$ENTERED

	adminok=$SUCCESS
	mydebug "$SNADMIN $QUIET $LOG -a $USEADMIN"
	if [ -f $SNADMIN ] ; then
		$SNADMIN $QUIET $LOG -a $USEADMIN
		adminok="$?"
	fi

	retries=X
	while [ $adminok -eq $ERRRET ]
	do
		if [ ${retries} = ${MAXRETRIES} ] ; then
			Display_error "$ERRMAXADMIN"
			exit 1
		fi
		retries=${retries}X
	# display an error here even if quiet mode to explain prompt
		if [ $MYQUIET -eq $TRUE ] ; then
			Display_error "$ERRBADADMIN"
		fi
		Query "$MSGADMIN" $DFLT_ADMIN "$HELPADMIN"
		USEADMIN=$ENTERED
		mydebug "$SNADMIN $QUIET $LOG -a $USEADMIN"
		if [ -f $SNADMIN ] ; then
			$SNADMIN $QUIET $LOG -a $USEADMIN
			adminok="$?"
		fi
	done

# Make primary admin owner of email.ini file
	if [ $adminok -eq 0 ] ; then
		/usr/bin/chown -f $USEADMIN ${SNMAILPATH}/${SNMAILFILE}
	fi
}

###########################################
#	Add client licenses to plum.
#	Note: this requires access to the existing plum database
#	if there is one.
###########################################
ADD_LICENSES(){

	ERR1=0
# Get the number of licenses
	Query "$MSGNUMLICENSES" "$DFLT_NUMLICENSES" "$HELPNUMLICENSES"
	NUMLICENSES=$ENTERED

	if [ "${NUMLICENSES}" != "0" -a "${NUMLICENSES}" != "" ] ; then

# Get the CODE1 (or key) value
		Query "$MSGLICENSEKEY" "$DFLT_LICENSECODE" "$HELPCODE1"
		CODE1=$ENTERED

# Get the CODE2 (or start) value
		Query "$MSGLICENSEFIRST" "$DFLT_LICENSECODE" "$HELPCODE2"
		CODE2=$ENTERED

# Create a licensing file to use as input to plum 
		if [ -f ${PCSCRIPTPATH}/${PLUMTMP} ] ; then
			/usr/bin/rm ${PCSCRIPTPATH}/${PLUMTMP}
		fi
		echo $NUMLICENSES > ${PCSCRIPTPATH}/${PLUMTMP}
		echo $CODE1 >> ${PCSCRIPTPATH}/${PLUMTMP}
		echo $CODE2 >> ${PCSCRIPTPATH}/${PLUMTMP}


# Enter the licenses into plum from the temporary file
		if [ ! -f $PLUM ] ; then
			myecho "${ERRNOCMD} $PLUM"
			ERR1=1
			return $ERR1
		fi

		myecho "$PLUM -i ${PCSCRIPTPATH}/${PLUMTMP}"
		$PLUM -i ${PCSCRIPTPATH}/${PLUMTMP} 
		ERR1=0

	fi

# plum errors are directly sent to the screen, so they 
# are not reflected here
	return $ERR1
}
###########################################
#	snconfig - server configuration
#	Main program for configuring a
#	SolarNet server
###########################################
#
# make sure running as root
uid=`/bin/id | /bin/cut -d"=" -f2 | /bin/cut -d"(" -f1`
if [ "${uid}" != "0" ] ; then
	Display_error "$ERRROOT"
	exit 1
fi

# Parse input options
#
while getopts vhFQL option
do
	case $option in
		v) Print_Version
			exit 0
			;;
		h) Print_Usage
			exit 0
			;;
		Q) QUIET="-Q"
			MYQUIET=$TRUE
			;;
		L) LOG="-L"
			MYLOG=$TRUE
			;;
		F) UPDATE="-u"
			;;
		?) Print_Usage
			exit 0
			;;
	esac
done

#
# Stop running PC-NFS and SolarNet daemon processes
Display_header "${SEC_HDR_STOP}"
if [ -f ${INITD}/${SNSCRIPT} ] ; then
	${INITD}/${SNSCRIPT} stop
	sleep ${SNWAITTIME}
fi
if [ -f ${INITD}/${PCSCRIPT} ] ; then
	${INITD}/${PCSCRIPT} stop
fi

#
# Setup Name Service for SolarNet data
if [ $DO_SETUP -eq $TRUE ] ; then
	NameService_Setup
	if [ "$?" -ne 0 ] ; then
		ERR=1
	fi
fi

#
# Create and verify SolarNet tables
if [ $DO_CREATE -eq $TRUE ] ; then
	InitTables
	if [ "$?" -ne 0 ] ; then
		ERR=1
	fi
fi

#
# Give the Primary Administrator access to the SolarNet data
if [ $DO_ADMIN -eq $TRUE ] ; then
	Access_Setup
	if [ "$?" -ne 0 ] ; then
		ERR=1
	fi
fi

#
# Set up the network configuration for PCs
# set up DHCPTAB
if [ $DO_DHCP_SETUP -eq $TRUE ] ; then
# DEBUG
	Display_header "${SEC_HDR_DHCP}"
	mydebug "$SNDHCPINIT $QUIET $LOG -i $UPDATE"
	if [ -f $SNDHCPINIT ] ; then
		$SNDHCPINIT $QUIET $LOG -i $UPDATE
# Exit on error from dhcpinit
		if [ "$?" -eq $ERRRET ] ; then
			Display_error "$ERRDHCPINIT"
			exit 1
		fi
	fi

fi

# set up per network databases
if [ $DO_DHCP_NETWORK -eq $TRUE ] ; then
	DHCP_Network
	if [ "$?" -ne 0 ] ; then
		ERR=1
# Exit on error from clntinit
		Display_error "$ERRCLNTINIT"
		exit 1
	fi
fi

#
# Export SolarNet executables, cfg, lang, etc.
# Export and start now, also set up to start at next reboot
# Export all as RW in /etc/dfs/dfstab
# start mountd and nfsd if needed
# see share command
if [ $DO_EXPORT -eq $TRUE ] ; then
	Display_header "${SEC_HDR_EXP}"
	if [ -d $SOLARNETDIR ] ; then
		mydebug "$SNSETUP $QUIET $LOG -p"
		SHAREDIR=`$SNSETUP $QUIET $LOG -p`
		if [ "${SHAREDIR}" = "" ] ; then
			SHAREDIR="$SOLARNETDIR"
		fi
		SHARENFS="${SHARENFS_PART1} ${SHAREDIR}"
		$SHARENFS
# Start mountd and nfsd if not already running
		MOUNTD_PID=`/usr/bin/ps -def | /usr/bin/grep -v grep |
			/usr/bin/grep /usr/lib/nfs/mountd | /usr/bin/awk '{print $2}'`
		if [ "$MOUNTD_PID" = "" ] ; then
			/usr/lib/nfs/mountd
		fi
		NFSD_PID=`/usr/bin/ps -def | /usr/bin/grep -v grep |
			/usr/bin/grep /usr/lib/nfs/nfsd | /usr/bin/awk '{print $2}'`
		if [ "$NFSD_PID" = "" ] ; then
			/usr/lib/nfs/nfsd -a 8
		fi
		
		if [ -f $DFSTAB ] ; then
			DFSTEMP=`egrep "${SHARENFS}" $DFSTAB`
			if [ "${DFSTEMP}" = "" ] ; then
				echo $SHARENFS	>> $DFSTAB &
			fi
		else
			echo $SHARENFS > $DFSTAB &
		fi
	else
		Display_error "$ERRSOLARNETDIR"
	fi
fi
#
# Install and Start SolarNet daemons:  solarnetd, in.dhcpd
# modify start/stop script template for DHCP interface option
# copy modified script to /etc/init.d
# create link to start daemons in /etc/rc3.d
# create links to stop daemons in /etc/rc0.d, rc1.d, and rc2.d
# Wait a configured number of seconds in case solarnetd stopped earlier
# start daemons again
#
if [ $DO_SOLARNET_START -eq $TRUE ] ; then
	ERR1=0
	Display_header "${SEC_HDR_SND}"
	rm -r ${SNSCRIPTPATH}/${SNSCRIPTTMP} 2>/dev/null
	if [ "${NETINTLIST}" != "" ] ; then
		/usr/bin/sed -e "s:INTERFACE_PLACEHOLD:-i ${NETINTLIST}:" \
			     -e "s:#DHCP::" \
		${SNSCRIPTPATH}/${SNSCRIPT} > ${SNSCRIPTPATH}/${SNSCRIPTTMP}
	else
		cp ${SNSCRIPTPATH}/${SNSCRIPT} ${SNSCRIPTPATH}/${SNSCRIPTTMP}
	fi
	if [ -d $INITD ] ; then
		cp ${SNSCRIPTPATH}/${SNSCRIPTTMP} ${INITD}/${SNSCRIPT}
		if [ "$?" -ne 0 ] ; then
			ERR1=1
		else
			chmod 0744 ${INITD}/${SNSCRIPT}
		fi
	else
		Display_error "$ERRINITD"
		ERR1=1
	fi
	if [ $ERR1 -eq 0 ] ; then
		if [ -d $RC3D ] ; then
			if [ -f ${RC3D}/S${SOLARNETSTART} ] ; then
				`rm ${RC3D}/S${SOLARNETSTART}`
			fi
			`ln -s	${INITD}/${SNSCRIPT} ${RC3D}/S${SOLARNETSTART}`
		else
			Display_error "$ERRRC3D"
			ERR1=1
		fi
		if [ -d $RC2D ] ; then
			if [ -f ${RC2D}/K${SOLARNETSTART} ] ; then
				`rm ${RC2D}/K${SOLARNETSTART}`
			fi
			`ln -s ${INITD}/${SNSCRIPT} ${RC2D}/K${SOLARNETSTART}`
		else
			Display_error "$ERRRC2D"
			ERR1=1
		fi
		if [ -d $RC1D ] ; then
			if [ -f ${RC1D}/K${SOLARNETSTART} ] ; then
				`rm ${RC1D}/K${SOLARNETSTART}`
			fi
			`ln -s ${INITD}/${SNSCRIPT} ${RC1D}/K${SOLARNETSTART}`
		else
			Display_error "$ERRRC1D"
			ERR1=1
		fi
		if [ -d $RC0D ] ; then
			if [ -f ${RC0D}/K${SOLARNETSTART} ] ; then
				`rm ${RC0D}/K${SOLARNETSTART}`
			fi
			`ln -s ${INITD}/${SNSCRIPT} ${RC0D}/K${SOLARNETSTART}`
		else
			Display_error "$ERRRC0D"
			ERR1=1
		fi
	fi
	if [ $ERR1 -eq 0 ] ; then
		${INITD}/${SNSCRIPT} start
	else
		Display_error "$ERRNOSOLAR"
	fi
	if [ -f ${SNSCRIPTPATH}/${SNSCRIPTTMP} ] ; then
		rm -r ${SNSCRIPTPATH}/${SNSCRIPTTMP} 2>/dev/null
	fi
fi
#
# Add client licenses to plum
#
if [ $DO_ADD_LICENSES -eq $TRUE ] ; then

# first find out if they want to add licenses at all
	DOLICENSES="1"
	Query "${MSGDOLIC1}" "${DFLT_ADDLICENSES}" "$HELPADDLICENSES" 

	while [ "${DOLICENSES}" != "" ] 
	do
		if [ $ENTERED = "ja" -o $ENTERED = "j" -o $ENTERED = "JA" -o $ENTERED = "J" ] ; then
			ADD_LICENSES
			DOLICENSES="1"
# ask if they want to do additional license agreements
			Query "${MSGNEXTAGREEMENT}" "${DFLT_ADDLICENSES}" "$HELPADDLICENSES" 
		else
			DOLICENSES=""

		fi
	done

fi
#
# Start the Pcnfs daemons:  pcnfsd, msgserv, plumd
#	Note that the start/stop script is installed as part of the
#	SUNWpcnfs package installation.	 A special preinstall script
#	for SolarNet (substituted for the SolarNet version of the SUNWpcnfs
#	package) does NOT start the daemons.  This allows the starting
#	of the daemons to be controlled by this script.
#
if [ $DO_PCNFSD_START -eq $TRUE ] ; then
	Display_header "${SEC_HDR_PCD}"
	ERR1=0
	if [ -f ${INITD}/${PCSCRIPT} ] ; then
		${INITD}/${PCSCRIPT} start
	else
		Display_error "$ERRNOPCNFS"
	fi
fi
#
# If servers table exists, add SolarNet capabilities for this system
# Note that solarnetd daemon must be running to do snservadd commands!
# Ignore errors for now!
#
if [ $DO_SERVER_ADV -eq $TRUE ] ; then
	Display_header "${SEC_HDR_CAP}"
	mydebug "$SNTABLE -Q $LOG -t servers "
	$SNTABLE -Q $LOG -t servers
	if [ "$?" -eq 0 ] ; then
		mydebug "$SNSERVADD -Q $LOG -s solarnet"
		myhost=`uname -n`
		if [ $DO_SOLARNET_START -eq $TRUE ] ; then
			$SNSERVADD -s $myhost -c solarnetd -m "SolarNet server" 2>/dev/null
			$SNSERVADD -s $myhost -c dhcpd -m "DHCP server" 2>/dev/null
		fi
		if [ $DO_PCNFSD_START -eq $TRUE ] ; then
			$SNSERVADD -s $myhost -c pcnfsd -m "PCNFS server" 2>/dev/null
			$SNSERVADD -s $myhost -c msgserv -m "PCNFS message server" 2>/dev/null
			$SNSERVADD -s $myhost -c plumd -m "PCNFS license server" 2>/dev/null
		fi
	fi
	# flush the updates to the nis maps so the clients will see them
	if [ "$SNNAMESERVICE" = "nis" ]
	then
		echo $MSGUPDATINGNISMAPS
		$NISUPDATE -a flush >/dev/null
	fi
fi

# Ignore error from dhcpadd
	mydebug "${SNDHCPADD} -m SUNW.PCW.LAN -d ${SUNW_PCW_LAN} 2>/dev/null"
	if [ -f ${SNDHCPADD} ] ; then
		${SNDHCPADD} -m SUNW.PCW.LAN -d ${SUNW_PCW_LAN} 2>/dev/null
	fi

# Send a SIGHUP to DHCP so that it rereads the dhcptab
	pid=`/usr/bin/ps -ef | 
		/usr/bin/grep /opt/SUNWpcnet/sbin/in.dhcpd |
		/usr/bin/grep -v grep |
		/usr/bin/sed -e 's/^  *//' -e 's/  */ /' |
		/usr/bin/cut -d' ' -f2`
	if [ "${pid}" != "" ] ; then
		echo "Sending SIGHUP to DHCP daemon"
		kill -1 ${pid} > /dev/null 2>&1
	fi

#
exit $ERR
