#!/bin/sh
#
# BEGIN COPYRIGHT BLOCK
# This Program 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 of the License.
# 
# 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.
# 
# In addition, as a special exception, Red Hat, Inc. gives You the additional
# right to link the code of this Program with code not covered under the GNU
# General Public License ("Non-GPL Code") and to distribute linked combinations
# including the two, subject to the limitations in this paragraph. Non-GPL Code
# permitted under this exception must only link to the code of this Program
# through those well defined interfaces identified in the file named EXCEPTION
# found in the source code files (the "Approved Interfaces"). The files of
# Non-GPL Code may instantiate templates or use macros or inline functions from
# the Approved Interfaces without causing the resulting work to be covered by
# the GNU General Public License. Only Red Hat, Inc. may make changes or
# additions to the list of Approved Interfaces. You must obey the GNU General
# Public License in all respects for all of the Program code and other code used
# in conjunction with the Program except the Non-GPL Code covered by this
# exception. If you modify this file, you may extend this exception to your
# version of the file, but you are not obligated to do so. If you do not wish to
# provide this exception without modification, you must delete this exception
# statement from your version and license this file solely under the GPL without
# exception. 
# 
# 
# Copyright (C) 2005 Red Hat, Inc.
# All rights reserved.
# END COPYRIGHT BLOCK
#

###########################
#
# This shell script provides a way to set up a new installation after
# the binaries have already been extracted.  This is typically after
# using native packaging support to install the package e.g. RPM,
# pkgadd, depot, etc.  This script will show the license, readme,
# dsktune, then run the usual setup pre and post installers.  This
# script should be run from the server root directory since it uses
# pwd to get the server root directory.
#
##########################

# get command line arguments

# see if silent mode

counter=0
doMktmp() {
	tmpfile=`mktemp /tmp/${1}XXXXXX 2> /dev/null`
	if ! [ $tmpfile ] ; then
		tmpfile=/tmp/$1.$counter.$$
		counter=`expr $counter + 1`
	fi
	echo $tmpfile
}

doExit() {
	echo "ERROR Exiting . . ." | tee -a $logfile
	if [ $tmpinffile ]; then
		rm -f $inffile
	fi
	echo "Log file is $logfile"
	exit 1
}

askYN() {
	prompt="$1"
	finished=
	while ! [ $finished ]; do
		echo ""
		echo -n "$prompt (yes/no) " | tee -a $logfile
		read ans
		echo $ans >> $logfile
		case "$ans" in
		y*|Y*) finished=1 ;;
		n*|N*) exit 1 ;;
		*) echo "Please answer yes or no" | tee -a $logfile ;;
		esac
	done
}

ask123() {
 	prompt=$2
 	default=$1
 	finished=
 	ans=
 	while ! [ $finished ]; do
		echo -n ""
		echo ""
		echo -n $prompt "" | tee -a $logfile
		read ans
		echo $ans >> $logfile
		if ! [ $ans ]; then
			return $default
		fi
		case "$ans" in
		1|2|3) finished=1 ;;
		*) echo "Please answer 1, 2, or 3" | tee -a $logfile ;;
		esac
	done
	return $ans
}

getFQDN() {
	max=0
	maxhost=
	defhost=`hostname`
	echo "getFQDN: hostname = $defhost" >> $logfile
	hosthost=`host $defhost | grep -v "not found" | awk '{print $1}'`
	echo "getFQDN: host $defhost = $hosthost" >> $logfile
	for host in $defhost $hosthost `hostname -f` `hostname -a` ; do
		len=`echo $host | wc -c`
		echo "getFQDN: host $host has length $len" >> $logfile
		if [ $len -gt $max ]; then
			max=$len
			maxhost=$host
			echo "getFQDN: new max host $host has length $max" >> $logfile
		fi
	done
	echo $maxhost
}

getValFromAdminConf() {
	cattr=$1
	cfile=$2
	rval=`grep -i $cattr $sroot/admin-serv/config/$cfile | awk '{print $2}'`
	echo $rval
}

getValFromAdmpw() {
	cfile=$1
	rval=`head -1 $sroot/admin-serv/config/$cfile | cut -f1 -d\:`
	echo $rval
}

getValFromInf() {
	cattr=$1
	cfile=$2
	rval=`grep -i ^$cattr $cfile | head -1 | sed -e 's/^.*=[ 	]*//'`
	echo $rval
}

logfile=`doMktmp log`
myargs=
silent=
inffile=
tmpinffile=
nextisinffile=
keepinffile=
# set by user or from existing files during upgrade
user=
# set by user or from existing files during upgrade
group=
for arg in "$@" ; do
	if [ "$arg" = "-s" ]; then
		silent=1
	elif [ "$arg" = "-k" ]; then
		keepinffile=1
	elif [ "$arg" = "-f" ]; then
		nextisinffile=1
	elif [ $nextisinffile ]; then
		inffile="$arg"
		nextisinffile=
	else
		myargs="$myargs $arg"
	fi
done

# figure out where we are and make sure we cd to the serverroot dir
setupdir=`dirname $0`
sroot=`dirname $setupdir`
cd $sroot
currentdir=`pwd`

if [ "$currentdir" != "$sroot" ]; then
	# running setup using a relative path
	bname=`basename $setupdir`
	if [ "$bname" = "." ]; then
		setupdir=$currentdir
	else
		setupdir=`echo $currentdir/$bname`
	fi
	sroot=`dirname $setupdir`
	cd $sroot
fi

rm -f $sroot/setup/install.inf

echo "INFO Begin Setup . . ." | tee -a $logfile
# cat LICENSE.txt
if ! [ $silent ]; then
	echo "" | tee -a $logfile
	echo "" | tee -a $logfile
	echo "" | tee -a $logfile
	cat LICENSE.txt | tee -a $logfile
	askYN "Do you accept the license terms?"
fi

# cat README.txt
if ! [ $silent ]; then
	cat README.txt | tee -a $logfile
	askYN "Continue?"
fi

isadminsslon=0
sslparams=""

adminSSLOff() {
	conffile=$1
	confparam=$2
	tmpfile=$3
	if [ -f $conffile ]; then
		security=`grep -i "^$confparam" $conffile | awk '{print $1}'`
		issecure=`grep -i "^$confparam" $conffile | awk '{print $2}'`
		if [ "$issecure" = "on" -o "$issecure" = "ON" -o "$issecure" = "On" -o "$issecure" = "oN" ]
		then
			if [ $isadminsslon -eq 0 ]; then
				$sroot/stop-admin
				isadminsslon=1
			fi
			echo $conffile=$security >> $tmpfile
			cat $conffile | sed -e "s/^\($security\) .*/\1 off/g" > $conffile.01
			mv $conffile.01 $conffile
			chown $user:$group $conffile
			echo "$conffile: SSL off ..."
		fi
	fi
}

adminXmlSSLOff() {
	conffile=$1
	confparam=$2
	tmpfile=$3
	if [ -f $conffile ]; then
		grep -i "\<security=\"on\"" $conffile > /dev/null 2>&1
		rval=$?
		if [ $rval -eq 0 ]
		then
			if [ $isadminsslon -eq 0 ]; then
				$sroot/stop-admin
				isadminsslon=1
			fi
			echo $conffile=$confparam >> $tmpfile
			cat $conffile | sed -e "s/\([Ss][Ee][Cc][Uu][Rr][Ii][Tt][Yy]=\)\"[A-Za-z]*\"/\1\"off\"/g" > $conffile.0
			mv $conffile.0 $conffile
			chown $user:$group $conffile
			echo "$conffile: SSL off ..."
		fi
		sslparams0=`grep -i "<.*SSLPARAMS " $conffile`
		rval=$?
		if [ $rval -eq 0 ]
		then
			if [ $isadminsslon -eq 0 ]; then
				$sroot/stop-admin
				isadminsslon=1
			fi
echo adminXmlSSLOff: SSLPARAMS off
			sslparams1=`echo $sslparams0 | sed -e 's/\//\\\\\//g'`
			sslparams=`echo $sslparams1 | sed -e 's/\"/\\\\\"/g'`
			cat $conffile | sed -e "s/\($sslparams\)/\<\!-- \1 --\>/g" > $conffile.1
			mv $conffile.1 $conffile
			chown $user:$group $conffile
		fi
	fi
}

SSLOff() {
	rm -f dssecure.txt assecure.txt > /dev/null 2>&1
	touch dssecure.txt
	touch assecure.txt

	for dir in $sroot/slapd-* ; do
		if [ -f $dir/config/dse.ldif ]; then
			security=`grep -i "^nsslapd-security:" $dir/config/dse.ldif | awk '{print $1}'`
			issecure=`grep -i "^nsslapd-security:" $dir/config/dse.ldif | awk '{print $2}'`
			if [ "$issecure" = "on" -o "$issecure" = "ON" -o "$issecure" = "On" -o "$issecure" = "oN" ]
			then
				echo $dir >> dssecure.txt
				$dir/stop-slapd
				cat $dir/config/dse.ldif | sed -e "s/\($security\) .*/\1 off/g" > $dir/config/dse.ldif.0
				mv $dir/config/dse.ldif.0 $dir/config/dse.ldif
				chown $user:$group $dir/config/dse.ldif
				echo "$dir/config/dse.ldif: SSL off ..."
			fi
		fi
	done
	if [ -d $sroot/admin-serv/config ]; then
		adminSSLOff $sroot/admin-serv/config/adm.conf security: assecure.txt
		adminSSLOff $sroot/admin-serv/config/local.conf configuration.nsServerSecurity: assecure.txt
        if [ -f $sroot/admin-serv/config/magnus.conf ] ; then
            adminSSLOff $sroot/admin-serv/config/magnus.conf Security assecure.txt
        fi
        if [ -f $sroot/admin-serv/config/server.xml ] ; then
            adminXmlSSLOff $sroot/admin-serv/config/server.xml security assecure.txt
        fi

		if [ $isadminsslon -ne 0 ]; then
			$sroot/start-admin
		fi
	fi
}

adminSSLOn() {
	conffile=$1
	confparam=$2
	if [ -f $conffile ]; then
		cat $conffile | sed -e "s/^\($confparam\) .*/\1 on/g" > $conffile.00
		mv $conffile.00 $conffile
		chown $user:$group $conffile
		echo "$conffile $confparam: SSL on ..."
	fi
}

adminXmlSSLOn() {
	conffile=$1
	if [ -f $conffile ]; then
		cat $conffile | sed -e "s/\([Ss][Ee][Cc][Uu][Rr][Ii][Tt][Yy]=\)\"[A-Za-z]*\"/\1\"on\"/g" > $conffile.2
		mv $conffile.2 $conffile
		chown $user:$group $conffile
	fi
	grep -i "<.*SSLPARAMS " $conffile > /dev/null 2>&1
	rval=$?
	if [ $rval -eq 0 ]
	then
		cat $conffile | sed -e "s/<\!-- *$sslparams *-->/$sslparams/g" > $conffile.3
		mv $conffile.3 $conffile
		chown $user:$group $conffile
	fi
	echo "$conffile: SSL on ..."
}

SSLOn() {
	if [ -f dssecure.txt ]; then
		for dir in `cat dssecure.txt` ; do
			if [ -f $dir/config/dse.ldif ]; then
				security=`grep -i "^nsslapd-security:" $dir/config/dse.ldif | awk '{print $1}'`
				$dir/stop-slapd
				cat $dir/config/dse.ldif | sed -e "s/\($security\) .*/\1 on/g" > $dir/config/dse.ldif.0
				mv $dir/config/dse.ldif.0 $dir/config/dse.ldif
				chown $user:$group $dir/config/dse.ldif
				echo "$dir/config/dse.ldif: SSL on ..."
				echo "Restarting Directory Server: $dir/start-slapd"
				$dir/start-slapd
			fi
		done
		rm -f dssecure.txt > /dev/null 2>&1
	fi

	if [ $isadminsslon -ne 0 ]; then
		$sroot/stop-admin
	fi
	if [ -f assecure.txt ]; then
		for confline in `cat assecure.txt` ; do
			conffile=`echo $confline | awk -F= '{print $1}'`
			confparam=`echo $confline | awk -F= '{print $2}'`
			echo $conffile | grep "\.xml$" > /dev/null 2>&1
			rval=$?
			if [ $rval -eq 0 ]; then
				adminXmlSSLOn $conffile $confparam
			else
				adminSSLOn $conffile $confparam
			fi
		done
		rm -f assecure.txt > /dev/null 2>&1
	fi
	if [ $isadminsslon -ne 0 ]; then
		echo "Restarting Administration Server: $sroot/start-admin"
		$sroot/start-admin
	fi

}

# check whether it is an in-place installation
if [ -f $sroot/admin-serv/config/adm.conf ]; then
	dsinst=`getValFromAdminConf "ldapStart:" "adm.conf" | awk -F/ '{print $1}'`
	if [ -f $sroot/$dsinst/config/dse.ldif ]; then
		user=`ls -l $sroot/$dsinst/config/dse.ldif | awk '{print $3}'`
		group=`ls -l $sroot/$dsinst/config/dse.ldif | awk '{print $4}'`
    fi

	SSLOff

	if [ -f $sroot/$dsinst/config/dse.ldif ]; then
		# it is an in=place installation
		ldaphost=`getValFromAdminConf "ldapHost:" "adm.conf"`
		ldapport=`getValFromAdminConf "ldapPort:" "adm.conf"`
		adminport=`getValFromAdminConf "\<port:" "adm.conf"`
		adminid=`getValFromAdmpw "admpw"`
		sysuser=`getValFromAdminConf "nsSuiteSpotUser:" "local.conf"`
		admindomain=`echo $ldaphost | awk -F. '{print $5 ? $2 "." $3 "." $4 "." $5: $4 ? $2 "." $3 "." $4 : $3 ? $2 "." $3 : $2 ? $2 : ""}'`
		if [ "$admindomain" = "" ]; then
			admindomain=`domainname`
		fi

		echo "In order to reconfigure your installation, the Configuration Directory"
		echo "Administrator password is required.  Here is your current information:"
		echo ""
		echo "Configuration Directory: ldap://$ldaphost:$ldapport/o=NetscapeRoot"
		echo "Configuration Administrator ID: $adminid"
		echo ""
		echo "At the prompt, please enter the password for the Configuration Administrator."
		echo ""
		echo "administrator ID: $adminid"
		siepasswd=""
		while [ "$siepasswd" = "" ]; do
			printf "Password: "
			read siepasswd
		done

		inffile=$sroot/setup/myinstall.inf
		echo "[General]" > $inffile
		echo "FullMachineName=   $ldaphost" >> $inffile
		echo "SuiteSpotUserID=   $user" >> $inffile
		echo "SuitespotGroup=   $group" >> $inffile
		echo "ServerRoot=   $sroot" >> $inffile
		echo "ConfigDirectoryLdapURL=   ldap://$ldaphost:$ldapport/o=NetscapeRoot" >> $inffile
		echo "ConfigDirectoryAdminID=   $adminid" >> $inffile
		echo "AdminDomain=   $admindomain" >> $inffile
		echo "ConfigDirectoryAdminPwd=   $siepasswd" >> $inffile
		echo "" >> $inffile
		echo "[admin]" >> $inffile
		echo "ServerAdminID=   $adminid" >> $inffile
		echo "ServerAdminPwd=   $siepasswd" >> $inffile
		echo "SysUser=   $sysuser" >> $inffile
		echo "Port=   $adminport" >> $inffile
		echo "ServerIpAddress=" >> $inffile

		# set silent mode
		silent=1
	fi
fi

# dsktune
if ! [ $silent ]; then
	bin/slapd/server/dsktune | tee -a $logfile
	askYN "Continue?"
fi

# install mode
if ! [ $silent ]; then
	echo ""
	echo "Please select the install mode:"
	echo "  1 - Express - minimal questions"
	echo "  2 - Typical - some customization (default)"
	echo "  3 - Custom - lots of customization"
	
	ask123 "2" "Please select 1, 2, or 3 (default: 2) "
	installmode=$?
fi

# if silent mode, do not run the pre-installer programs
# otherwise, create a temp file for their use
if ! [ $silent ]; then
	inffile=`doMktmp setup`
	tmpinffile=1

	# put some common answers in the file
	hostname=`getFQDN`
	if ! [ $hostname ] ; then
		hostname=localhost.localdomain
	fi
	echo "" | tee -a $logfile
	echo -n "Hostname to use (default: $hostname) " | tee -a $logfile
	read ans
	echo $ans >> $logfile
	if [ "$ans" ]; then
		hostname="$ans"
	fi

	user=nobody
	group=nobody
	echo ""
	echo -n "Server user ID to use (default: $user) " | tee -a $logfile
	read ans
	echo $ans >> $logfile
	if [ "$ans" ]; then
		user="$ans"
	fi
	echo ""
	echo -n "Server group ID to use (default: $group) " | tee -a $logfile
	read ans
	echo $ans >> $logfile
	if [ "$ans" ]; then
		group="$ans"
	fi

	echo '[General]' >> $inffile
	echo "FullMachineName = $hostname" >> $inffile
	echo "SuiteSpotUserID = $user" >> $inffile
	echo "SuiteSpotGroup = $group" >> $inffile
	echo ServerRoot = `pwd` >> $inffile

	# check if ds instance directory exists or not
	# if it does, run ns-config with the reconfigure option
	doreconfig=""
	ls -d slapd-* > /dev/null 2>&1
	if [ $? -eq 0 ]; then
		doreconfig="-r"
	fi

	# first, run ds
	cd bin/slapd/admin/bin
	./ns-config -f $inffile -l $logfile -m $installmode $doreconfig || doExit
	cd ../../../..

	# next, run admin
	cd bin/admin
	./ns-config -f $inffile -l $logfile -m $installmode $doreconfig || doExit
	cd ../..
fi

# do the post installers
silentarg=""
if ! [ $silent ] ; then
	silentarg="-s"
fi

`pwd`/bin/slapd/admin/bin/ns-update $silentarg $myargs -f $inffile | tee -a $logfile || doExit

`pwd`/bin/admin/ns-update $doreconfig $silentarg $myargs -f $inffile | tee -a $logfile || doExit

SSLOn

# get user, host, port for startconsole
adminport=`getValFromInf Port $inffile`
adminhost=`getValFromInf FullMachineName $inffile`
adminuser=`getValFromInf ConfigDirectoryAdminID $inffile`

echo ""
echo "You can now use the console.  Here is the command to use to start the console:" | tee -a $logfile
echo "cd $sroot" | tee -a $logfile
echo "./startconsole -u $adminuser -a http://$adminhost:$adminport/" | tee -a $logfile
echo""
echo "INFO Finished with setup, logfile is setup/setup.log" | tee -a $logfile
if [ -f setup/setup.log ] ; then
	cat $logfile >> setup/setup.log
else
	cp $logfile setup/setup.log
fi
rm -f $logfile

if [ $tmpinffile ]; then
	if [ $keepinffile ]; then
		if [ -f setup/install.inf ]; then
			cat $inffile >> setup/install.inf
		else
			cp $inffile setup/install.inf
		fi
		chmod 600 setup/install.inf
	fi
	rm -f $inffile
fi

exit 0
