#! /bin/sh

usage() {
	echo "$0: [-interact] [-help] [-debug] [-confdir confdir] [-input conffile] [-output conffile] [-httpdconf gforgehttpdconf] [-httpdsecrets gforgehttpdsecrets] [-localinc gforgelocalinc] [-example|-fhs] [-clean] [-noapache] [-dovhost] [-home homepath] [-group grouppath] [-listen80|nolisten80] [-nossl]"
}

getval(){
	echo -n $1 \[$2\] ?
	read $1
}

computedefault(){
	echo "Calculating defaults"
	# This is used to make a default working gforge.conf
	DEFAULTsystem_name=MyGForge
	DEFAULTdomain_name=`hostname -f`
	DEFAULTserver_admin=webmaster@$DEFAULTdomain_name
	DEFAULTdb_host=`hostname -i`
	DEFAULTdb_port=5432
	DEFAULTdb_name=gforge
	DEFAULTdb_user=gforge
	DEFAULTdb_password=$(dd if=/dev/urandom count=256 bs=1 2> /dev/null | md5sum | cut -b1-8)
	DEFAULTip_address=`hostname -i`
	DEFAULTscm_host=scm.$DEFAULTdomain_name
	DEFAULTshell_host=shell.$DEFAULTdomain_name
	DEFAULTusers_host=users.$DEFAULTdomain_name
	DEFAULTlists_host=lists.$DEFAULTdomain_name
	# The following three have to be synced when domain_name changes
	# and docs_host is supposed not to be used
	#DEFAULTdocs_host=gfdocs.$DEFAULTdomain_name
	DEFAULTjabber_host=jabber.$DEFAULTdomain_name
	DEFAULTupload_host=upload.$DEFAULTdomain_name
	#
	DEFAULTdownload_host=download.$DEFAULTdomain_name
	# The following is upload host and dir for FRS
	DEFAULTftpuploadhost=upload.$DEFAULTdomain_name
	DEFAULTftpuploaddir=$GFGDIR/var/lib/gforge/chroot/ftproot
	#
	DEFAULTstatsadmin_groupid=2
	DEFAULTnewsadmin_groupid=3
	DEFAULTpeerrating_groupid=4
	DEFAULTtemplate_project=5
	DEFAULTadmin_login=admin
	DEFAULTadmin_password=$(dd if=/dev/urandom count=256 bs=1 2> /dev/null | md5sum | cut -b1-8)
	DEFAULTskill_list="Ada;C;C++;HTML;LISP;Perl;PHP;Python;SQL"
	DEFAULTdefault_trove_cat=18
	DEFAULTldap_host=localhost
	DEFAULTldap_base_dn="dc=`echo $DEFAULTdomain_name | sed 's/\./,dc=/g'`"
	DEFAULTldap_web_add_password=$(dd if=/dev/urandom count=256 bs=1 2> /dev/null | md5sum | cut -b1-8)
	DEFAULTsys_path_to_mailman=$(if test -d /usr/lib/mailman; then echo /usr/lib/mailman; else echo /var/mailman; fi)
	DEFAULTcgidir=$CGIDIR
	DEFAULTcronolog_path=$(findcronolog)
	DEFAULTsys_sendmail_path=$(findsendmail)
	DEFAULTsys_path_to_jpgraph=/usr/share/jpgraph/
	DEFAULTsys_path_to_scmweb=/usr/share/gforge/bin/
	DEFAULTgforge_chroot=$CHROOT
	DEFAULTgforge_etc=$ETCDIR
	DEFAULTsys_custom_path=$ETCDIR/custom
	DEFAULTgroupdir=$GROUPPATH
	DEFAULThomedir=$HOMEPATH
	DEFAULTcvsdir=$CVSPATH
	DEFAULTsvndir=$SVNPATH
	# The place where file uploaded with http are stored for download
	DEFAULTuploaddir=$GFGDIR/var/lib/gforge/download/
	DEFAULTsys_urlroot=$SHAREDIR/www/
	DEFAULTsys_jabber_pass=$(dd if=/dev/urandom count=256 bs=1 2> /dev/null | md5sum | cut -b1-8)
	DEFAULTusr_share_gforge=$SHAREDIR
	DEFAULTusr_lib_gforge=$LIBDIR
	DEFAULTvar_lib_gforge=$GFGDIR/var/lib/gforge
	DEFAULTvar_log_gforge=$GFGDIR/var/log/gforge
	DEFAULTsys_show_source=0
	DEFAULTsys_force_login=0
	DEFAULTsys_session_key=$(dd if=/dev/urandom count=256 bs=1 2> /dev/null | md5sum | cut -b1-32)
	DEFAULTsys_session_expire='60 * 60 * 24 * 7'
	DEFAULTsys_show_contact_info=1
	DEFAULTsys_themeroot=$SHAREDIR/www/themes/
	DEFAULTsys_theme=gforge
	DEFAULTsys_lang=English
	DEFAULTsys_default_timezone=GMT
	DEFAULTsys_default_country_code=US
	DEFAULTsys_account_manager_type=$SYSTEM
	DEFAULTsys_use_jabber=0
	DEFAULTsys_use_auth_ldap=1
	# Couldn't find where this is used, maybe some rest of ext auth
	#DEFAULTsys_ldap_auth_host=localhost
	DEFAULTsys_ldap_auth_port=389
	DEFAULTsys_ldap_auth_version=3
	DEFAULTsys_ldap_auth_dn="dc=`echo $DEFAULTdomain_name | sed 's/\./,dc=/g'`"
	DEFAULTsys_scm_tarballs_path=$GFGDIR/var/lib/gforge/scmtarballs
	DEFAULTsys_scm_snapshots_path=$GFGDIR/var/lib/gforge/scmsnapshots
	DEFAULTsys_use_scm=true
	DEFAULTsys_use_tracker=true
	DEFAULTsys_use_forum=true
	DEFAULTsys_use_pm=true
	DEFAULTsys_use_docman=true
	DEFAULTsys_use_news=true
	DEFAULTsys_use_mail=true
	DEFAULTsys_use_survey=true
	DEFAULTsys_use_frs=true
	DEFAULTsys_use_fti=false
	DEFAULTsys_use_ftp=true
	DEFAULTsys_use_trove=true
	DEFAULTsys_use_snippet=true
	DEFAULTsys_use_shell=true
	DEFAULTsys_use_ratings=true
	DEFAULTsys_use_ssl=false
	DEFAULTsys_use_people=true
	DEFAULTsys_use_ftpuploads=false
	DEFAULTsys_use_diary=true
	DEFAULTsys_use_bookmarks=true
	DEFAULTsys_use_project_tags=true
	DEFAULTsys_use_project_full_list=true
	DEFAULTsys_use_gateways=true
	DEFAULTsys_use_project_vhost=true
	DEFAULTsys_use_project_database=false
	DEFAULTsys_use_project_multimedia=false
	DEFAULTsys_use_private_project=true
	DEFAULTsys_project_reg_restricted=false
	DEFAULTsys_user_reg_restricted=false
	DEFAULTsys_localinc=$ETCDIR/local.inc
	DEFAULTsys_jabber_pass=$(dd if=/dev/urandom count=256 bs=1 2> /dev/null | md5sum | cut -b1-8)
	DEFAULTsys_plugins_path=$SHAREDIR/plugins/
	DEFAULTsys_sslcrt=$(findcrt)
	DEFAULTsys_sslkey=$(findkey)
	DEFAULTnoreply_to_bitbucket=true
	DEFAULTsys_simple_dns=true
	DEFAULTsys_apache_user=$(findapacheowner)
	DEFAULTsys_apache_group=$(findapacheowner)
	DEFAULTsys_forum_return_domain=$DEFAULTdomain_name
	#
	# TODO
	#usr_lib_gforge=$GFGDIR
	#vhost_name
	#docdir
}

findcrt(){
	if [ -e /etc/gforge/ssl-cert.pem ] ; then
	    echo /etc/gforge/ssl-cert.pem
	elif [ -f /etc/apache2/ssl/apache.pem ] ; then
	    echo /etc/apache2/ssl/apache.pem
	elif [ -f /etc/apache/ssl.crt/server.crt ] ; then
	    echo /etc/apache/ssl.crt/server.crt
	fi
}
findkey(){
	if [ -e /etc/gforge/ssl-cert.key ] ; then
	    echo /etc/gforge/ssl-cert.key
	elif [ -f /etc/apache2/ssl/apache.pem ] ; then
	    echo /etc/apache2/ssl/apache.pem
	elif [ -f /etc/apache/ssl.key/server.key ] ; then
	    echo /etc/apache/ssl.key/server.key
	fi
}
findcronolog(){
	if [ -x /usr/bin/cronolog ]
	then 
		echo /usr/bin/cronolog
	else
		if [ -x /usr/sbin/cronolog ]
		then
			echo /usr/sbin/cronolog
		else
			which cronolog
		fi
	fi
}
findsendmail(){
	if [ -x /usr/sbin/sendmail ]
	then
		echo /usr/sbin/sendmail
	else
		which sendmail
	fi
}
findapacheowner(){
	if grep 'Red Hat' /etc/issue > /dev/null; then
		echo apache
	elif grep SuSE /etc/issue > /dev/null; then
		echo apache
	elif grep Debian /etc/issue > /dev/null; then
		echo www-data
	else
		echo apache
	fi
}

writedefault(){
	# Here is the fun
	# This create a default conf file in $1 
	tmpfile=$1.$$computedefault
	echo "cat >$1<<-EOF" > $tmpfile
	cat $0 | grep "^	DEFAULT" | sed 's/	DEFAULT\(.[^=]*\)=.*/\1=\${\1:-\$DEFAULT\1}/' >> $tmpfile
	echo 'EOF' >> $tmpfile
	. $tmpfile
	rm -f $tmpfile
}

readdefault() {
	cat $1 | sed 's/\(.[^=]*\)=\(.*\)/DEFAULT\1="\2"/' |
		grep -v '^DEFAULTcronolog_path' > $1.$$readdefault
	. $1.$$readdefault

	if [ ! -z "$DEFAULTsys_sslcrt" -a ! -f "$DEFAULTsys_sslcrt" ]
	then
		unset DEFAULTsys_sslcrt
		DEFAULTsys_sslcrt=$(findcrt)
	else
		if [ -z "$DEFAULTsys_sslcrt" ]
		then
			DEFAULTsys_sslcrt=$(findcrt)
		fi
	fi
	if [ ! -z "$DEFAULTsys_sslkey" -a ! -f "$DEFAULTsys_sslkey" ]
	then
		unset DEFAULTsys_sslkey
		DEFAULTsys_sslkey=$(findkey)
	else
		if [ -z "$DEFAULTsys_sslkey" ]
		then
			DEFAULTsys_sslkey=$(findkey)
		fi
	fi
	if [ ! -d "$DEFAULTsys_themeroot/$DEFAULTsys_theme" ]
	then
		if [ -d "$DEFAULTsys_themeroot/gforge" ]
		then
			DEFAULTsys_theme=gforge
		fi
	fi
	rm -f $1.$$readdefault
}

setupinout(){

	computedefault

	writedefault $CONFFILEIN.new

	if [ -f $CONFFILEIN ]
	then
		echo "Reading defaults from $CONFFILEIN"
		readdefault $CONFFILEIN
	else
		readdefault $CONFFILEIN.new
	fi
	
	if [ "$interact" = true ]
	then
		echo "Enter values or type enter for defaults:"
		# Here is the fun II
		# This ask for change of default
		tmpfile=$1.$$getval
		cat $0 | grep "^	DEFAULT" | sed 's/	DEFAULT\(.[^=]*\)=.*/getval \1 "\${DEFAULT\1}"/' > $tmpfile
	else
		cat $0 | grep "^	DEFAULT" | sed 's/	DEFAULT\(.[^=]*\)=.*/\1="\${DEFAULT\1}"/' > $tmpfile
	fi
	. $tmpfile
	rm -f $tmpfile
	
	echo "Creating $CONFFILEOUT"
	[ ! -d `dirname $CONFFILEOUT` ] && (mkdir -p `dirname $CONFFILEOUT` || (echo "Could not create `dirname $CONFFILEOUT`" && exit 1))
	writedefault $CONFFILEOUT.new
	mv $CONFFILEOUT.new $CONFFILEOUT
	
	
	# Remove trailing space
	cat $CONFFILEIN | sed 's/ *$//' > $CONFFILEIN.new
	mv $CONFFILEIN.new $CONFFILEIN
	
	# Fill in the blanks
	EXCLUDEVHOST=' -not -name 55vhost'
	if [ "$dovhost" = true ]
	then
		EXCLUDEVHOST='' 		
	fi
	#
	rm -f $ETCDIR/httpd.d/10cvs
	rm -f $ETCDIR/httpd.d/10scmcvs
	rm -f $ETCDIR/httpd.d/10scmcvsauth
	rm -f $ETCDIR/httpd.d/07maindirhttps
	rm -f $ETCDIR/httpd.d/11scmcvshttp
	rm -f $ETCDIR/httpd.d/11scmsvnhttp
	rm -f $ETCDIR/httpd.d/12scmcvshttp.ssl
	#rm -f $ETCDIR/httpd.d/20list
	#

	find $ETCTEMPLATEDIR/httpd.d  -follow -type f -regex "$ETCTEMPLATEDIR/httpd.d/\([a-z0-9]+\|_?([a-z0-9_.]+-)+[a-z0-9]+\|[a-z0-9][a-z0-9-]*\)\(\|.ssl\|.secrets\)" $EXCLUDEVHOST | sort | while read i
	do
		if [ "$ETCTEMPLATEDIR" != "$ETCDIR" -a -f $ETCDIR/httpd.d/`basename $i` ]
		then
			if diff -q $i $ETCDIR/httpd.d/`basename $i` 
			then
				rm -f $ETCDIR/httpd.d/`basename $i`
			else
				i=$ETCDIR/httpd.d/`basename $i`
			fi
		fi
		$BINDIR/fill-in-the-blanks.pl $i $ETCDIR/`basename $i`.gforge-new $CONFFILEOUT
	done
	
	if [ $listen80 = false ]
	then
		rm -f $ETCDIR/00listen80.gforge-new
	fi

	if [ $usessl = false -o -z "$(findkey)" -o -z "$(findcrt)" ]
	then
		echo "SSL Disabled"
		rm -f $ETCDIR/[0-9][0-9]*.ssl.gforge-new
	else
		echo "SSL Enabled"
	fi

	echo "Creating $HTTPDCONF"
	ls $ETCDIR/[0-9][0-9]*.gforge-new | sort | xargs cat > $HTTPDCONF
	rm $ETCDIR/[0-9][0-9]*.gforge-new
	echo "Creating $HTTPDSECRETS"
	cat $ETCDIR/httpd.secrets.gforge-new > $HTTPDSECRETS
	rm $ETCDIR/httpd.secrets.gforge-new
	
	echo "Creating $LOCALINC"
	find $ETCTEMPLATEDIR/local.d -follow -type f -regex "$ETCTEMPLATEDIR/local.d/\([a-z0-9]+\|_?([a-z0-9_.]+-)+[a-z0-9]+\|[a-z0-9][a-z0-9-]*\)\(\|.$database\)" | sort | while read i
	do
		if [ "$ETCTEMPLATEDIR" != "$ETCDIR" -a -f $ETCDIR/local.d/`basename $i` ]
		then
			if diff -q $i $ETCDIR/local.d/`basename $i` 
			then
				rm -f $ETCDIR/local.d/`basename $i`
			else
				i=$ETCDIR/local.d/`basename $i`
			fi
		fi
		$BINDIR/fill-in-the-blanks.pl $i $CONFFILEOUTDIR/`basename $i` $CONFFILEOUT
	done
	(find $CONFFILEOUTDIR  -follow -type f -regex "$CONFFILEOUTDIR/\([a-z0-9]+\|_?([a-z0-9_.]+-)+[a-z0-9]+\|[a-z0-9][a-z0-9-]*\)\(\|.$database\)" | sort | xargs cat ) > $LOCALINC
	find $CONFFILEOUTDIR  -follow -type f -regex "$CONFFILEOUTDIR/\([a-z0-9]+\|_?([a-z0-9_.]+-)+[a-z0-9]+\|[a-z0-9][a-z0-9-]*\)\(\|.$database\)" -print0 | xargs -0 rm

	echo "Creating other includes"
	#for i in $ETCDIR/templates/[a-z]*
	find $ETCTEMPLATEDIR/templates -follow -type f -regex "$ETCTEMPLATEDIR/templates/[a-z].*"  | while read i
	do
		if [ "$ETCTEMPLATEDIR" != "$ETCDIR" -a -f $ETCDIR/templates/`basename $i` ]
		then
			if diff -q $i $ETCDIR/templates/`basename $i` 
			then
				rm -f $ETCDIR/templates/`basename $i`
			else
				i=$ETCDIR/templates/`basename $i`
			fi
		fi
		$BINDIR/fill-in-the-blanks.pl $i $CONFFILEOUTDIR/`basename $i` $CONFFILEOUT
	done
	chmod 600 $HTTPDSECRETS $CONFFILEIN $CONFFILEOUT
	chmod 640 $CONFFILEOUTDIR/local.pl $CONFFILEOUTDIR/database.inc
	chown gforge:gforge $CONFFILEOUTDIR/local.pl $CONFFILEOUTDIR/database.inc
}
	
doapache() {	
	APACHECONF=/etc/apache/httpd.conf
	GFORGE_ETC_SEARCH=$HTTPDCONF
	export GFORGE_ETC_SEARCH
	if [ -f $APACHECONF -a -f $BINDIR/install-apache.sh ] ; then
		if [ ! -f /etc/apache/conf.d/gforge.httpd.conf ] ; then
			if ! grep -q "^Include $GFORGE_ETC_SEARCH" $APACHECONF ; then
				$BINDIR/install-apache.sh setup
			else 
				echo "Found Include $GFORGE_ETC_SEARCH in $APACHECONF"
			fi
		else
			LINK=`ls -l /etc/apache/conf.d/gforge.httpd.conf | sed 's/.*-> \(.*\)$/\1/'`
			if [ "$LINK" != "$GFORGE_ETC_SEARCH" ] ; then
				echo Need to readjust Symlink
				$BINDIR/install-apache.sh setup
			fi
			if ! grep -q "^Include $GFORGE_ETC_SEARCH" $APACHECONF ; then
				echo "Found /etc/apache/conf.d/gforge.httpd.conf"
			else 
				# There is a link and an include
				$BINDIR/install-apache.sh setup
			fi
		fi
	fi
}


ETCDIR=`pwd`/etc
ETCTEMPLATEDIR=`pwd`/etc
BINDIR=`pwd`/utils
CGIDIR=`pwd`/cgi-bin
GFGDIR=`pwd`
CHROOT=''
HOMEPATH=/home
GROUPPATH=/home/groups
CVSPATH=/cvsroot
if [ ! -e /cvsroot ] && [ -e /var/lib/gforge/chroot/cvsroot ] ; then
    CVSPATH=/var/lib/gforge/chroot/cvsroot
fi
SVNPATH=/svnroot
if [ ! -e /svnroot ] && [ -e /var/lib/gforge/chroot/svnroot ] ; then
    SVNPATH=/var/lib/gforge/chroot/svnroot
fi
SHAREDIR=`pwd`
LIBDIR=`pwd`
CONFFILEOUTDIR=$ETCDIR
CONFFILEIN=$ETCDIR/gforge.conf
CONFFILEOUT=$ETCDIR/gforge.conf
LOCALINC=$ETCDIR/local.inc
HTTPDCONF=$ETCDIR/httpd.conf
HTTPDSECRETS=$ETCDIR/httpd.secrets
SYSTEM=pgsql
export ETCDIR ETCTEMPLATEDIR BINDIR GFGDIR CONFFILEOUTDIR CONFFILEIN CONFFILEOUT LOCALINC HTTPDCONF HTTPDSECRETS DOAPACHE SYSTEM
interact=false
noapache=false
database=env
dovhost=false
listen80=true
usessl=true

while [ $# -ne 0 ]
do
	case "$1" in
		-interact )
			interact=true
			;;
		-help )
			usage
			exit 0
			;;
		-httpdsecrets )
			shift
			HTTPDSECRETS=$1
			;;
		-httpdconf )
			shift
			HTTPDCONF=$1
			;;
		-localinc )
			shift
			LOCALINC=$1
			;;
		-input )
			shift
			CONFFILEIN=$1
			;;
		-output )
			shift
			CONFFILEOUT=$1
			;;
		-system )
			shift
			SYSTEM=$1
			;;
		-confdir )
			shift
			CONFFILEOUTDIR=$1
			CONFFILEIN=$1/gforge.conf
			CONFFILEOUT=$1/gforge.conf
			LOCALINC=$1/local.inc
			HTTPDCONF=$1/httpd.conf
			HTTPDSECRETS=$1/httpd.secrets
			echo Using $1 as config directory
			;;
		-fhs )
			shift
			ETCDIR=/etc/gforge
			ETCTEMPLATEDIR=/usr/share/gforge/etc
			BINDIR=/usr/share/gforge/bin
			CGIDIR=/usr/share/gforge/cgi-bin
			GFGDIR=''
			HOMEPATH=/home/users
			GROUPPATH=/home/groups
			CHROOT=/var/lib/gforge/chroot
			SHAREDIR=/usr/share/gforge
			LIBDIR=/usr/share/gforge
			CONFFILEOUTDIR=/etc/gforge
			CONFFILEIN=/etc/gforge/gforge.conf
			CONFFILEOUT=/etc/gforge/gforge.conf
			LOCALINC=/etc/gforge/local.inc
			HTTPDCONF=/etc/gforge/httpd.conf
			HTTPDSECRETS=/etc/gforge/httpd.secrets
			;;
		-simple )
			database=simple
			;;
		-noapache )
			noapache=true
			;;
		-dovhost )
			dovhost=true
			;;
		-listen80 )
			listen80=true
			;;
		-nolisten80 )
			listen80=false
			;;
		-nossl )
			usessl=false
			;;
		-example )
			shift
			CONFFILEIN=$ETCDIR/gforge.conf.example
			CONFFILEOUT=$ETCDIR/gforge.conf.example
			LOCALINC=$ETCDIR/local.inc.example
			HTTPDCONF=$ETCDIR/httpd.conf.example
			HTTPDSECRETS=$ETCDIR/httpd.secrets.example
			database=simple
			noapache=true
			;;
		-home )
			shift
			HOMEPATH=$1
			;;
		-group )
			shift
			GROUPPATH=$1
			;;
		-clean )
			[ -f $CONFFILEIN ] && echo Removing $CONFFILEIN && rm -f $CONFFILEIN
			[ -f $CONFFILEOUT ] && echo Removing $CONFFILEOUT && rm -f $CONFFILEOUT
			[ -f $LOCALINC ] && echo Removing $LOCALINC && rm -f $LOCALINC
			[ -f $HTTPDCONF ] && echo Removing $HTTPDCONF && rm -f $HTTPDCONF
			[ -f $HTTPDSECRETS ] && echo Removing $HTTPDSECRETS && rm -f $HTTPDSECRETS
			exit 0
			;;
		-debug )
			set -x
			;;
		*)
			echo "Bad Parameter"
			usage
			exit 1
			;;
	esac
	shift
done
setupinout
[ "$noapache" != true ] && doapache
