#! /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_require_accept_conditions=false DEFAULTsys_require_unique_email=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 DEFAULTsys_block_anonymous_downloads=false DEFAULTsys_urlprefix=/ # # 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