#! /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"
distrolib=
install='auto'
dataroot=
datarootauto=
perm=
lang=
dbtype=
dbhost=
dbsocket=
basedbname=
dbname=
dbuser=
dbpass=
dbrootforce=
dbmoodleuser=
prefix=
wwwroot=
wwwrootproto=
wwwrootsitename=
wwwrootport=
wwwrootpath=
wwwrootnew=
adminuser=
adminpass=
adminpasshash=
passwordsaltmain=
fullname=
shortname=
msg=
ldaphosturl=
ldapcontexts=
authcomand=
authlist=
authinstallcomand=
authinstalllist=
pluginssetparams=

. shell-error

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

while :; do
	case "$1" in
		--)
			shift
			break
			;;
		-c|--config)
			shift
			configfile="$1"
			;;
		--distrolib)
			shift
			distrolib="$1"
			;;
		--install)
			shift
			install="$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"
			;;
		--wwwrootnew)
			wwwrootnew='yes'
			;;
		--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"
			;;
		--authinstalladd)
			shift
			authinstallcomand='add'
			authinstalllist="$1"
			;;
		--authinstallinsert)
			shift
			authinstallcomand='insert'
			authinstalllist="$1"
			;;
		--authinstallset)
			shift
			authinstallcomand='set'
			authinstalllist="$1"
			;;
		--authinstallrm)
			shift
			authinstallcomand='rm'
			authinstalllist="$1"
			;;
		--plugins-setparams)
			pluginssetparams='yes'
			;;
		*) fatal "Unrecognized option: $1"
			;;
	esac
	shift
done

otherparams="$@"

# Install or update?
if [ -z "$install" ] || [ "x$install" = 'xauto' ]; then
	if mt-install-lsconfigs | egrep -q -m1 '^[^[:space:]]+[[:space:]]+[Yy][Ee][Ss][[:space:]]' >/dev/null 2>&1; then
		install='no'
	else
		install='yes'
	fi
fi

# Check use passwordsaltmain
if [ -n "$passwordsaltmain" ] && [ -z "$adminpass" ] && [ -z "$adminpasshash" ]; then
	passwordsaltmain=
fi

# Check basedbname
if [ -n "$dbname" ]; then
	basedbname=
fi

mt-install-lsdefaults ${configfile:+--config="$configfile"} ${distrolib:+--distrolib="$distrolib"}\
| sed -n '
	/^fullname\t/p
	/^shortname\t/p
	/^wwwrootproto\t/p
	/^wwwrootsitename\t/p
	/^wwwrootport\t/p
	/^wwwrootpath\t/p
	/^adminuser\t/p
	/^adminpasshash\t/p
	/^passwordsaltmain\t/p
	/^dbtype\t/p
	/^dbhost\t/p
	/^dbsocket\t/p
	/^basedbname\t/p
	/^dbuser\t/p
	/^dbpass\t/p
	/^dbprefix\t/p
	/^lang\t/p
	/^perm\t/p
	' \
| {
	deffullname=""
	defshortname=""
	defwwwrootproto=""
	defwwwrootsitename=""
	defwwwrootport=""
	defwwwrootpath=""
	defadminuser=""
	defadminpasshash=""
	defpasswordsaltmain=""
	defdbtype=""
	defdbhost=""
	defdbsocket=""
	defbasedbname=""
	defdbuser=""
	defdbpass=""
	defprefix=""
	deflang=""
	defperm=""

	str=
	name=
	var=
	while read -r str
	do
		name=`printf "def%s" "$str" | sed -nr 's/^([^[:space:]]+)\t.*$/\1/p'`
		var=`printf "%s" "$str" | sed -nr 's/^[^[:space:]]+\t(.*)$/\1/p'`;
		eval $name="\$var"
	done

	if [ -z "$wwwroot" ]; then
		if [ -z "$wwwrootproto" ] && [ -n "$defwwwrootproto" ]; then
			wwwrootproto="$defwwwrootproto"
		fi
		if [ -z "$wwwrootsitename" ] && [ -n "$defwwwrootsitename" ]; then
			wwwrootsitename="$defwwwrootsitename"
		fi
		if [ -z "$wwwrootport" ] && [ -n "$defwwwrootport" ]; then
			wwwrootport="$defwwwrootport"
		fi
		if [ -z "$wwwrootpath" ] && [ -n "$defwwwrootpath" ]; then
			wwwrootpath="$defwwwrootpath"
		fi
	fi

	if [ -z "$passwordsaltmain" ] && [ -z "$adminpass" ] && [ -z "$adminpasshash" ]; then
		if [ -n "$defpasswordsaltmain" ] && [ -n "$defadminpasshash" ]; then
			passwordsaltmain="$defpasswordsaltmain"
			adminpasshash="$defadminpasshash"
		fi
	fi

	if [ -z "$adminuser" ] && [ -n "$defadminuser" ]; then
		adminuser="$defadminuser"
	fi

	if [ -z "$dbname" ] && [ -z "$basedbname" ] && [ -n "$defbasedbname" ]; then
		basedbname="$defbasedbname"
	fi
	if [ -z "$dbtype" ] && [ -n "$defdbtype" ]; then
		dbtype="$defdbtype"
	fi
	if [ -z "$dbhost" ] && [ -n "$defdbhost" ]; then
		dbhost="$defdbhost"
	fi
	if [ -z "$dbsocket" ] && [ -n "$defdbsocket" ]; then
		case "$dbsocket" in
			true)
				dbsocket='yes'
				;;
			false)
				dbsocket='no'
				;;
			*)
				dbsocket=$defdbsocket
				;;
		esac
	fi
	if [ -z "$dbuser" ] && [ -n "$defdbuser" ]; then
		dbuser="$defdbuser"
	fi
	if [ -z "$dbpass" ] && [ -n "$defdbpass" ]; then
		dbpass="$defdbpass"
	fi
	if [ -z "$prefix" ] && [ -n "$defprefix" ]; then
		prefix="$defprefix"
	fi

	if [ -z "$fullname" ] && [ -n "$deffullname" ]; then
		fullname="$deffullname"
	fi
	if [ -z "$shortname" ] && [ -n "$defshortname" ]; then
		shortname="$defshortname"
	fi

	if [ -z "$lang" ] && [ -n "$deflang" ]; then
		lang="$deflang"
	fi
	if [ -z "$perm" ] && [ -n "$defperm" ]; then
		perm="$defperm"
	fi

	# Install or update?
	if [ "$install" = 'yes' ]; then
		# Set authcomand and authlist
		if [ -n "$authinstallcomand" ]; then
			authcomand="$authinstallcomand"
			authlist="$authinstalllist"
		fi

		mt-install ${configfile:+--config="$configfile"} \
			${dbtype:+--dbtype="$dbtype"} \
			${dbhost:+--dbhost="$dbhost"} \
			${dbsocket:+--dbsocket="$dbsocket"} \
			${basedbname:+--basedbname="$basedbname"} \
			${dbname:+--dbname="$dbname"} \
			${dbuser:+--dbuser="$dbuser"} \
			${dbpass:+--dbpass="$dbpass"} \
			${prefix:+--prefix="$prefix"} \
			${dbmoodleuser:+--dbmoodleuser} \
			${dbrootforce:+--dbrootforce} \
			${lang:+--lang="$lang"} \
			${perm:+--chmod="$perm"} \
			${wwwroot:+--wwwroot="$wwwroot"} \
			${wwwrootproto:+--wwwrootproto="$wwwrootproto"} \
			${wwwrootsitename:+--wwwrootsitename="$wwwrootsitename"} \
			${wwwrootport:+--wwwrootport="$wwwrootport"} \
			${wwwrootpath:+--wwwrootpath="$wwwrootpath"} \
			${dataroot:+--dataroot="$dataroot"} \
			${datarootauto:+--datarootauto} \
			${adminuser:+--adminuser="$adminuser"} \
			${adminpass:+--adminpass="$adminpass"} \
			${adminpasshash:+--adminpasshash="$adminpasshash"} \
			${passwordsaltmain:+--passwordsaltmain="$passwordsaltmain"} \
			${fullname:+--fullname="$fullname"} \
			${shortname:+--shortname="$shortname"} \
			${msg:+--msg="$msg"} \
			${ldaphosturl:+--ldaphosturl="$ldaphosturl"} \
			${ldapcontexts:+--ldapcontexts="$ldapcontexts"} \
			${authcomand:+--auth$authcomand="$authlist"} \
			-- $otherparams
	else
		# Set new wwwroot?
		if [ -n "$wwwrootnew" ]; then
			oldwwwroot=`mt-getCFG ${configfile:+--file="$configfile"} wwwroot 2>/dev/null ||:`

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

			if [ "$newwwwroot" != "$oldwwwroot" ]; then
				mt-setCFG ${configfile:+--file="$configfile"} \
					${msg:+--msg="$msg"} \
					wwwroot "$newwwwroot"
			fi
		fi

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

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

		# Set params for plugins
		if [ -n "$pluginssetparams" ]; then
			mt-plugins-setparams \
				${ldaphosturl:+--ldaphosturl="$ldaphosturl"} \
				${ldapcontexts:+--ldapcontexts="$ldapcontexts"}
		fi

	fi
}
