#!/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/#MOODLE_EXT_ADDRESS#/$MOODLE_EXT_ADDRESS/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
  MOODLE_EXT_ADDRESS_OLD=$(cat $ossmoodleconf|sed 's/'\''//g'|sed -n 's/^\$CFG->wwwroot[[:space:]]*=[[:space:]]*https:\/\/\(.*\);$/\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 "$MOODLE_EXT_ADDRESS" -a -n "$SCHOOL_DOMAIN" ]; then
  MOODLE_EXT_ADDRESS=www.${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 - disabled: Hamburg has destroyed file system
#if [ -d $r$MOODLEFILEDIR ]; then
#    # set the owner and change rights accordingly
#    chown -R wwwrun:www $r$MOODLEFILEDIR
#    chmod 0755 $r$MOODLEFILEDIR
#fi

# moodle user and db existing ?
MOODLEUSER="$(echo "SELECT 1 FROM mysql.user WHERE User='moodle' and Host='localhost';"|mysql -N)"
if [ "$MOODLEUSER" == "" ]; then
    # create new user
    echo "CREATE USER 'moodle'@'localhost' IDENTIFIED BY 'password';"|mysql -N
fi

MOODLEDB="$(echo "SHOW DATABASES;"|mysql -N |grep ^moodle$)"
if [ "$MOODLEDB" == "" ]; then
    echo "CREATE DATABASE 'moodle' CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;"|mysql -N
    echo "GRANT ALL PRIVILEGES ON moodle.* TO 'moodle'@'localhost';"|mysql -N
    echo "FLUSH PRIVILEGES;"|mysql -N
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
    echo "ALTER USER 'moodle'@'localhost' IDENTIFIED BY '$randompw';"|mysql -N
fi

# 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
    randomadminpw=`pwgen -s 8 1`
    echo wwwadmin:${randomadminpw} >$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=${randomadminpw} --agree-license --fullname="${SCHOOL_NAME}" \
	--shortname="${SCHOOL_NETBIOSNAME}"
    # unset random admin password
    unset randomadminpw
    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
    mysql --default-character-set=utf8 -u moodle --password=$randompw moodle <$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
mysql --default-character-set=utf8 -u moodle --password=$randompw moodle <$r/usr/share/oss-moodle/moodle_update.sql

# unset random pw
unset randompw

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

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