#!/bin/bash
#
# Copyright (c) 2016 Frank Schuette fschuett@gymhim.de
# All rights reserved.
#


#
# check if we are started as root
# only one of UID and USER must be set correctly
#

if test "$UID" != 0 -a "$USER" != root; then
    echo "You must be root to start $0."
    exit 1
fi

if test ! -x /usr/bin/sudo; then
    echo "You need /usr/bin/sudo for $0."
    exit 1
fi

if test ! -x /usr/bin/php; then
    echo "You need /usr/bin/php to start $0."
    exit 1
fi

r="$ROOT"

patchFile(){
file=$1
[ "$file" == "" ] && return;
sed \
-e "s/#SCHOOL_EXT_NAME#/$SCHOOL_EXT_NAME/g;" \
-e "s/#SCHOOL_DOMAIN#/$SCHOOL_DOMAIN/g;" \
-e "s/#SCHOOL_BASEDN#/$SCHOOL_BASEDN/g;" \
-e "s/#SCHOOL_NAME#/$SCHOOL_NAME/g;" \
-e "s/#SCHOOL_COUNTRY#/$SCHOOL_COUNTRY/g;" \
-e "s/#SCHOOL_CCODE#/$SCHOOL_CCODE/g;" \
-e "s/#SCHOOL_CITY#/$SCHOOL_CITY/g;" \
-e "s/#SCHOOL_NETBIOSNAME#/$SCHOOL_NETBIOSNAME/g;" \
-e "s/#SCHOOL_SERVER#/$SCHOOL_SERVER/g;" \
-e "s/#SCHOOL_PROXY#/$SCHOOL_PROXY/g" \
-i $file
}

# $1 file name to edit in place
# $2 lines to insert into file
# $3 marker to insert before
#
insertLines(){
    local FILE=$1
    local LCB="# oss-moodle-BEGIN"
    local LCE="# oss-moodle-ENDE"
    local LINES="$2"
    local MARKER="$3"
    [ -z "${MARKER}" ] && MARKER="# End of file"
    sed -e "/$LCB/,/$LCE/ d" -i $FILE
    if grep -q "^${MARKER}" $FILE; then
        LINES=$(echo "${LINES}"| sed '{:a;N;$!ba;s/\n/\\\n/g;}')
        sed "
/^${MARKER}.*/ {
        i\
${LCB}\n\
${LINES}\n\
${LCE}
}" -i $FILE
    else
        echo "$LCB" >>$FILE
        echo "$LINES" >>$FILE
        echo "$LCE" >>$FILE
        echo "$MARKER" >>$FILE
    fi
}

#
# load config files
#
ossmoodlesysconf="$r/etc/sysconfig/oss-moodle"
test -f $ossmoodlesysconf || {
    echo "ERROR - can not find $ossmoodlesysconf!!"
    echo "This should not happen.  Exit..."
    exit 1
}
. $ossmoodlesysconf

osssysconf="$r/etc/sysconfig/schoolserver"
test -f $osssysconf || {
    echo "ERROR - can not find $osssysconf!!"
    echo "This should not happen.  Exit..."
    exit 1
}
. $osssysconf

moodledist="$r/usr/share/oss-moodle/config/dist.conf"
test -f $moodledist || {
    echo "ERROR - can not find $moodledist!!"
    echo "This should not happen.  Exit..."
    exit 1
}

. $moodledist

ossmoodleconf="$r/etc/oss-moodle/config.php"
if [ -e $ossmoodleconf ]
then
  SCHOOL_EXT_NAME_OLD=$(cat $ossmoodleconf|sed 's/'\''//g'|sed -n 's/^\$CFG->wwwroot[[:space:]]*=[[:space:]]*https:\/\/\(.*\)\/moodle;$/\1/p')

  # fetch moodle db password from old config.php
  pattern="^([[:space:]]*[^#].*->dbpass[[:space:]]*=[[:space:]]*')([^']*)('.*)"
  while read line; do
    [[ $line =~ $pattern ]] || continue;
    randompw="${BASH_REMATCH[2]}"
    break;
  done < $ossmoodleconf;
fi

if [ -z "$SCHOOL_EXT_NAME" -a -n "$SCHOOL_NETBIOSNAME" -a -n "$SCHOOL_DOMAIN" ]; then
  SCHOOL_EXT_NAME=${SCHOOL_NETBIOSNAME}.${SCHOOL_DOMAIN}
fi
cp $ossmoodleconf.in $ossmoodleconf
patchFile $ossmoodleconf

# set absolute path for db_replace utility
echo "Setting absolute path for config.php into db_replace.php."
sed -e "/^[[:space:]]*[^#]*config.php/s#\$CFG->dirroot#\'$MOODLEDIR\'#" -i $r$MOODLEDIR/admin/cli/db_replace.php

# Care about the repository
if [ -d $r$MOODLEFILEDIR ]; then
    # set the owner and change rights accordingly
    chown -R wwwrun:www $r$MOODLEFILEDIR
    chmod 0755 $r$MOODLEFILEDIR
fi

# ensure postgres/moodle access
PGACCESS=$(cat $r/var/lib/pgsql/data/pg_hba.conf|grep '^local[[:space:]]\+all[[:space:]]\+postgres[[:space:]]\+trust$')
MDLACCESS=$(cat $r/var/lib/pgsql/data/pg_hba.conf|grep '^host[[:space:]]\+moodle[[:space:]]\+moodle[[:space:]]\+127\.0\.0\.1\/32[[:space:]]\+md5$')
PGLINES="local all postgres trust
host moodle moodle 127.0.0.1/32 md5"

if [[ "$PGACCESS" == "" || "$MDLACCESS" == "" ]]; then
    insertLines $r/var/lib/pgsql/data/pg_hba.conf "$PGLINES" "local[[:space:]]\+all[[:space:]]\+all[[:space:]]\+peer"
    service postgresql reload
fi

# moodle user and db existing ?
MOODLEUSER=$(psql -U postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='moodle'")
if [ "$MOODLEUSER" == "" ]; then
    # create new user
    createuser -U postgres -S -D -R moodle
fi

MOODLEDB=$(psql -U postgres -l|cut -d\| -f1 |grep moodle)
if [ "$MOODLEDB" == "" ]; then
    createdb -U postgres -O moodle -T template0 -E UTF8 moodle
fi

# create random password
[ -n "$randompw" ] || randompw=`pwgen -s 8 1`
# patch dbpass & admin login
sed -e "s/\$CFG->dbpass =.*/\$CFG->dbpass = \'$randompw\';/" -i $ossmoodleconf
if [ "$MOODLEUSER" == "" ]; then
    # set random password for db access
    psql -U postgres -d template1 -qc "ALTER USER moodle WITH PASSWORD '"$randompw"';"
fi
# unset random password
unset randompw

# create upload virus quarantine dir
[ -d $r${MOODLEFILEDIR}/quarantine ] || mkdir -p $r${MOODLEFILEDIR}/quarantine
chown wwwrun:www $r${MOODLEFILEDIR}/quarantine
# wwwroot tweak
[ -L $r${MOODLEDIR}/moodle ] || ln -s . $r${MOODLEDIR}/moodle

# secure permissions of config.php
chown root:www $ossmoodleconf
chmod 440 $ossmoodleconf

# check config.php link
if [ ! -L $r${MOODLEDIR}/config.php ]; then
    [ -e $r${MOODLEDIR}/config.php ] && rm -rf $r${MOODLEDIR}/config.php
    pushd $r
      ln -s ${MOODLESYSCONFDIR}/config.php ${MOODLEDIR}/config.php
    popd
fi

if [ "$MOODLEDB" == "" ]; then
    # create random password
    randompw=`pwgen -s 8 1`
    echo wwwadmin:${randompw} >$r/etc/oss-moodle.secrets
    chmod 600 $r/etc/oss-moodle.secrets
    chown root.root $r/etc/oss-moodle.secrets
    sudo -u wwwrun /usr/bin/php $r${MOODLEDIR}/admin/cli/install_database.php \
	--lang=$(echo ${SCHOOL_CCODE}|tr '[:upper:]' '[:lower:]') \
	--adminuser=wwwadmin --adminpass=${randompw} --agree-license --fullname="${SCHOOL_NAME}" \
	--shortname="${SCHOOL_NETBIOSNAME}"
    # unset random password
    unset randompw
    cp $r/usr/share/oss-moodle/moodle_install.sql.in $r/usr/share/oss-moodle/moodle_install.sql
    patchFile $r/usr/share/oss-moodle/moodle_install.sql
    psql -U postgres -d moodle -f $r/usr/share/oss-moodle/moodle_install.sql
fi

# put into maintenance mode
sudo -u wwwrun /usr/bin/php $r${MOODLEDIR}/admin/cli/maintenance.php --enable

# upgrade database
sudo -u wwwrun /usr/bin/php $r${MOODLEDIR}/admin/cli/upgrade.php --non-interactive

# update settings
cp $r/usr/share/oss-moodle/moodle_update.sql.in $r/usr/share/oss-moodle/moodle_update.sql
patchFile $r/usr/share/oss-moodle/moodle_update.sql
psql -U postgres -d moodle -f $r/usr/share/oss-moodle/moodle_update.sql

# update school ext name
if [ -n "$SCHOOL_EXT_NAME" -a -n "$SCHOOL_EXT_NAME_OLD" -a "$SCHOOL_EXT_NAME" != "$SCHOOL_EXT_NAME_OLD" ]; then
  echo -n "Replacing $SCHOOL_EXT_NAME_OLD with $SCHOOL_EXT_NAME in moodle db..."
  /usr/bin/sudo -u wwwrun /usr/bin/php $r${MOODLEDIR}/admin/cli/db_replace.php --search="$SCHOOL_EXT_NAME_OLD" --replace="$SCHOOL_EXT_NAME" 2>&1 >/dev/null
  echo "finished."
fi

# leave maintenance mode
sudo -u wwwrun /usr/bin/php $r${MOODLEDIR}/admin/cli/maintenance.php --disable
