#! /bin/sh -efu

#
# Moodle install tools
#
# @package   mt-install
# @copyright 2012 Aleksey Avdeev <solo@altlinux.ru>
# @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v2 or later
#

PROG="${0##*/}"

PATH="/usr/sbin:$PATH"

moodledir='/var/www/webapps/moodle'
configfilename='config.php'
configfile="$moodledir/$configfilename"
dataroot="/var/lib/moodle/default"
datarootprefixdir="/var/lib/moodle"
datarootauto=
perm=2770
lang='en'
dbtype=
dbhost='localhost'
dbsocket='auto'
basedbname=
dbname=
dbuser='moodleuser'
dbpass=
dbrootforce=
dbmoodleuser=
prefix='mdl_'
wwwroot=
wwwrootproto=
wwwrootsitename=
wwwrootport=
wwwrootpath=
adminuser=
adminpass=
adminpasshash=
passwordsaltmain=
fullname=
shortname=
msg=
ldaphosturl=
ldapcontexts=
authcomand=
authlist=

. shell-error

TEMP=`getopt -n "$PROG" -o -c:,a:,h:,b:,t:,n:,u:,d:,p:,s:,m,f,l:,r:,w: -l config:,adminuser:,adminpass:,adminpasshash:,passwordsaltmain:,dbtype:,dbhost:,dbsocket:,basedbname:,dbname:,dbuser:,dbpass:,dbmoodleuser,dbrootforce,prefix:,lang:,chmod:,datarootauto,dataroot:,wwwroot:,wwwrootproto:,wwwrootsitename:,wwwrootport:,wwwrootpath:,fullname:,shortname:,msg:,ldaphosturl:,ldapcontexts:,authadd:,authinsert:,authset:,authrm: -- "$@"`
eval set -- "$TEMP"

while :; do
	case "$1" in
		--)
			shift
			break
			;;
		-c|--config)
			shift
			configfile="$1"
			;;
		-a|--adminuser)
			shift
			adminuser="$1"
			;;
		--adminpass)
			shift
			adminpass="$1"
			;;
		-h|--adminpasshash)
			shift
			adminpasshash="$1"
			;;
		-s|--passwordsaltmain)
			shift
			passwordsaltmain="$1"
			;;
		-t|--dbtype)
			shift
			dbtype="$1"
			;;
		-n|--dbhost)
			shift
			dbhost="$1"
			;;
		--dbsocket)
			shift
			dbsocket="$1"
			;;
		-b|--basedbname)
			shift
			basedbname="$1"
			;;
		-d|--dbname)
			shift
			dbname="$1"
			;;
		-u|--dbuser)
			shift
			dbuser="$1"
			;;
		-p|--dbpass)
			shift
			dbpass="$1"
			;;
		-m|--dbmoodleuser)
			dbmoodleuser='yes'
			;;
		-f|--dbrootforce)
			dbrootforce='yes'
			;;
		--prefix)
			shift
			prefix="$1"
			;;
		-l|--lang)
			shift
			lang="$1"
			;;
		--chmod)
			shift
			perm="$1"
			;;
		-r|--dataroot)
			shift
			dataroot="$1"
			datarootauto=
			;;
		--datarootauto)
			datarootauto='yes'
			dataroot=
			;;
		-w|--wwwroot)
			shift
			wwwroot="$1"
			;;
		--wwwrootproto)
			shift
			wwwrootproto="$1"
			;;
		--wwwrootsitename)
			shift
			wwwrootsitename="$1"
			;;
		--wwwrootport)
			shift
			wwwrootport="$1"
			;;
		--wwwrootpath)
			shift
			wwwrootpath="$1"
			;;
		--fullname)
			shift
			fullname="$1"
			;;
		--shortname)
			shift
			shortname="$1"
			;;
		--msg)
			shift
			msg="$1"
			;;
		--ldaphosturl)
			shift
			ldaphosturl="$1"
			;;
		--ldapcontexts)
			shift
			ldapcontexts="$1"
			;;
		--authadd)
			shift
			authcomand='--add'
			authlist="$1"
			;;
		--authinsert)
			shift
			authcomand='--insert'
			authlist="$1"
			;;
		--authset)
			shift
			authcomand='--set'
			authlist="$1"
			;;
		--authrm)
			shift
			authcomand='--rm'
			authlist="$1"
			;;
		*) fatal "Unrecognized option: $1"
			;;
	esac
	shift
done

# Set dbsocket
if [ -n "$dbsocket" ]; then
	case "$dbsocket" in
		yes)
			;;
		no)
			dbsocket=
			;;
		*)
			if [ -n "$dbhost" ] && [ "$dbhost" = 'localhost' ]; then
				dbsocket='yes'
			else
				dbsocket=
			fi
			;;
	esac
fi

# Remove old configfile
if [ -e "$configfile" ]; then
	if [ ! -L "$configfile" ]; then
		mt-install-configfiletosymlink ${configfile:=--config="$configfile"}
	fi

	rm -f "$configfile"
fi

# Create new DB
if [ "$dbhost" = 'localhost' ]; then
	dbname=`mt-install-rundbscript ${dbtype:+--dbtype="$dbtype"} -- \
		mt-DB-setdb ${basedbname:+--basedbname="$basedbname"} \
			${dbname:+--dbname="$dbname"} \
			${dbuser:+--dbuser="$dbuser"} \
			${dbpass:+--dbpass="$dbpass"} \
			${dbmoodleuser:+--dbmoodleuser} \
			${dbrootforce:+--dbrootforce} \
			-- $@`
fi

[ -n "$dbname" ] || fatal "No dbname sets"

if [ -z "$wwwroot" ]; then
	# Set wwwroot
	if [ -n "$wwwrootsitename" ]; then
		wwwroot=`mt-install-wwwroot \
			${wwwrootproto:+--wwwrootproto=$wwwrootproto} \
			--wwwrootsitename=$wwwrootsitename \
			${wwwrootport:+--wwwrootport=$wwwrootport} \
			${wwwrootpath:+--wwwrootpath=$wwwrootpath}`
	fi
fi

if [ -n "$datarootauto" ]; then
	# Generate dataroot
	wwwrootproto=`mt-install-wwwroot-getproto --wwwroot=$wwwroot`
	wwwrootsitename=`mt-install-wwwroot-getsitename --wwwroot=$wwwroot`
	wwwrootport=`mt-install-wwwroot-getport --wwwroot=$wwwroot`

	dataroot="$datarootprefixdir/$wwwrootproto.$wwwrootsitename${wwwrootport:+.$wwwrootport}.$dbtype.$dbname"
fi

# Create new dataroot
mt-newdataroot --no-config-update --no-distrolib-update "$dataroot"

configfiledir=`printf "%s\n" "$configfile" \
	| sed -rn 's@^[[:space:]]*([^[:space:]]*/)?[^/[:space:]]+[[:space:]]*$@\1.@p'`

if [ -n "$passwordsaltmain" ] && [ -n "$adminpasshash" ] && [ -z "$adminpass" ]; then
	# Set fake password
	adminpass=`pwgen -cyn 16 1`
fi

pushd "$configfiledir"

# Run moodle install script
php admin/cli/install.php  --non-interactive --agree-license ${lang:+--lang="$lang"} ${perm:+--chmod="$perm"} ${wwwroot:+--wwwroot="$wwwroot"} ${dataroot:+--dataroot="$dataroot"} ${dbtype:+--dbtype="$dbtype"} ${dbhost:+--dbhost="$dbhost"} ${dbname:+--dbname="$dbname"} ${dbuser:+--dbuser="$dbuser"} ${dbpass:+--dbpass="$dbpass"} ${dbsocket:+--dbsocket} ${prefix:+--prefix="$prefix"} ${adminuser:+--adminuser="$adminuser"} ${adminpass:+--adminpass="$adminpass"} ${fullname:+--fullname="$fullname"} ${shortname:+--shortname="$shortname"} \
	|| exit $?

# Create symlink for configfile
mt-install-configfiletosymlink --config="$configfiledir/$configfilename"

if [ -n "$passwordsaltmain" ] && [ -n "$adminpasshash" ]; then
	# Remove fake password
	adminpass=
fi

if [ -n "$passwordsaltmain" ]; then
	mt-install-setpassword ${configfile:+--config="$configfile"} --user=$adminuser ${passwordsaltmain:+--passwordsaltmain="$passwordsaltmain"} ${adminpass:+--password="$adminpass"} ${adminpasshash:+--passwordhash="$adminpasshash"} ${msg:+--msg="$msg"}
fi

# Set params for plugins
mt-plugins-setparams \
	${ldaphosturl:+--ldaphosturl="$ldaphosturl"} \
	${ldapcontexts:+--ldapcontexts="$ldapcontexts"}

# Set auth
if [ -n "$authcomand" ]; then
	mt-plugins-setauth $authcomand="$authlist"
fi
popd
