#! /bin/bash
#------------------------------------------------------------------------------
#see licence at the end
MoeVersion="0.1.0 - 19 sept 2015 rev 1.0 Last Update : `stat -c %z $0 | cut -d"." -f1`"
Date=`date +%y_%m_%e_%H_%M_%S`
CurrentUser=`whoami`
AllParameters="$*"

#------------------------------------------------------------------------------
#StartConfig
#------------------------------------------------------------------------------
#Adapt following values to your context
#
#MoeMode : see --help"
#MoeMode="remote"
MoeMode="test"
MoeSiteMode="maintenance"

#Other parameters you may look for :
#
#moe background tasks parameters
#-------------------------------
MoeDir="/usr/local/etc/moe"
MoeConfig="$MoeDir/moe.conf"
MoeSpool="$MoeDir/moe_spool"
MoeData="$MoeDir/moe_data"
MoeCodes="$MoeData/codes.data"
MoeDatabases="$MoeData/databases.data"
MoeAdminCodes="$MoeData/admin.data"
MoeLogFile="$MoeDir/moe.log"
MoeReport="$MoeDir/moe.report"
MoeModeFile="$MoeDir/moe.mode"
MoeSiteModeFile="$MoeDir/moe_site.mode"
MoeContact="Pour contacter le support technique de SISalp, merci d'indiquer code et nom de base eventuel sur la page http://sisalp.fr/index.php/contact"

#Site parameters which are useless here
#--------------------------------------
HttpUser="www-data"
TopImage="images/background.gif"
TopLogo="images/top_background.jpg"
TapeImage="images/tape.png"
DiskImage="images/disk.png"
ServiceImage="images/disk.png"
SiteCss="moe.css"
SiteUrl="."
SiteAbout="http://sisalp.fr/index.php/post/Hebergement-OpenERP-et-Tryton-par-SISalp-Le-panneau-d-administration-du-serveur-VDS"
SiteSupport="http://sisalp.fr/index.php/contact"
PageTop="<![CDATA[<a href=\"$SiteUrl\"><img src=\"images/top.png\" alt=\"Page top\" title=\"Page top\" /></a>]]>"
PageBack1="<a href=\"$SiteUrl\"><img src=\"images/back.png\" alt=\"Back to main page\" title=\"Back to main page\" /></a>"
PageBack2="$PageBack1<hr/>"
SiteImages="images"
ImageSource="http://download.sisalp.net/moe/images/"
MoeDownloadSource="http://download.sisalp.net/moe/moe"

#------------------------------------------------------------------------------
#EndConfig
#------------------------------------------------------------------------------
if [ -f $MoeModeFile ] ; then
	MoeMode=`cat $MoeModeFile`
fi
if [ -f $MoeSiteModeFile ] ; then
	MoeSiteMode=`cat $MoeSiteModeFile`
fi
NbServicesPerVserver=`cat $MoeConfig | grep "^NbServicesPerVserver:" | cut -f2`
NbDatabasePerService=`cat $MoeConfig | grep "^NbDatabasePerService:" | cut -f2`
Pace=`cat $MoeConfig | grep "^Pace:" | cut -f2`
LocalReferenceData=`cat $MoeConfig | grep "^LocalReferenceData:" | cut -f2`

#------------------------------------------------------------------------------

#Fonctions
#------------------------------------------------------------------------------
LOG_MESSAGE ()
#------------------------------------------------------------------------------
{
case "$1" in
-short)
	shift
	echo -n "$*" >> $MoeLogFile
	echo "return" > /tmp/moe.log.return
	chmod 777 /tmp/moe.log.return
	;;
*)
	if [ -f /tmp/moe.log.return ] ; then
		rm /tmp/moe.log.return
		echo "" >> $MoeLogFile
	fi
	echo "$HOSTNAME|moe|`date +%A_%x-%H:%M:%S:%3N`|INFO |$CurrentUser|$$|$*" >> $MoeLogFile
	;;
esac
}
#LOG_MESSAGE $LINENO -g  ZONE_TO_SERVICE service $Service database $Database templatefile $TemplateFile
#-------------------------------------------------------------------------
NEW_PASSWORD ()
#-------------------------------------------------------------------------
{
if [ -z "$1" ] ; then
	pw_nb_digits=12
else
	pw_nb_digits="$*"
fi
pw_letters=(a b c d e f g h i j k m n o p q r s t u v w x y z A B C D E F G H I J K L M N P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 )
pw_range="${#pw_letters[*]}"
NEW_PWD=""
for nb_digit in $pw_nb_digits ; do
	if [ ! -z "$NEW_PWD" ] ; then NEW_PWD="${NEW_PWD}""_" ; fi
	for ((  pw_digit = 1 ;  pw_digit <= $nb_digit ;  pw_digit++  )) ; do
		pw_index="$(($RANDOM%$pw_range))"
		NEW_PWD="${NEW_PWD}""${pw_letters[$pw_index]}"
	done
done
echo "${NEW_PWD}"
}
#------------------------------------------------------------------------------
EXECUTE_COMMAND ()
#------------------------------------------------------------------------------
{
LOG_MESSAGE $LINENO "EXECUTE_COMMAND $*"
Target="$1"
shift
case "$MoeMode" in
local)
	$*
	;;
remote)
	SshCommand=`cat $MoeConfig | grep "^mooc_server:$Target:" | cut -f4`
	if [ -z "$SshCommand" ] ; then
		LOG_MESSAGE $LINENO "SSH command in not found for mooc_server:$Target: in $MoeConfig"
	else
		LOG_MESSAGE $LINENO "SSH command ssh $SshCommand command $*"
		ssh $SshCommand  "$*"
	fi
	;;
test)
	SshCommand=`cat $MoeConfig | grep "^mooc_server:$Target:" | cut -f4`
	LOG_MESSAGE $LINENO "Test mode: the following command is not executed on $Target : [ssh $SshCommand ] $*"
	;;
esac
}
#------------------------------------------------------------------------------
NEW_BASE_CODE ()
#------------------------------------------------------------------------------
{
	
	personnalkey=`NEW_PASSWORD 2 3`
	#check code is unique
	while cat $MoeDatabases | grep -qi "m$personnalkey" ; do
		LOG_MESSAGE $LINENO "NEW_BASE_CODE: bad luck, the database code m$personnalkey is in use, shoot again"
		personnalkey=`NEW_PASSWORD 2 3`
	done
	echo "m$personnalkey"
}
#------------------------------------------------------------------------------
NEW_USER_CODE ()
#------------------------------------------------------------------------------
{
	personnalkey=`NEW_PASSWORD 2 3`
	echo "code_$personnalkey"
	echo "$1	code_$personnalkey" >> $MoeCodes
}
#------------------------------------------------------------------------------
GET_CODE ()
#------------------------------------------------------------------------------
{
	if cat $MoeCodes | grep -iq "^$1" ; then
		cat $MoeCodes | grep -i "^$1" | tail -n 1 | cut -f2
	else
		NEW_USER_CODE $1
	fi
}
#------------------------------------------------------------------------------
LOOP_FOREVER ()
#------------------------------------------------------------------------------
{
	LOG_MESSAGE $LINENO "Starting execution loop forever, use $0 --stop to break this loop"
	while [ ! -f /tmp/moe.loop_control.status ] ; do
		ToDo=`ls $MoeSpool`
		if [ -z "$ToDo" ] ; then
			LOG_MESSAGE -short "."
			sleep $Pace
		else
			$0 --execute
			sleep 2
		fi
	done
	rm -f /tmp/moe.loop_control.status
	LOG_MESSAGE $LINENO "Execution loop is stopped, use /usr/local/bin/moe --background to create this loop"
}
#------------------------------------------------------------------------------
NOT_LOOPING_ONLY ()
#------------------------------------------------------------------------------
{
	runningprocesses=`/bin/ps axo pid,cmd`
	if echo "$runningprocesses" | grep "$0" | grep -q "loop_forever" ; then
		LOG_MESSAGE -short ":"
		exit 0
	fi
}
#------------------------------------------------------------------------------
STOP_LOOP ()
#------------------------------------------------------------------------------
{
	runningprocesses=`/bin/ps axo pid,cmd`
	if echo "$runningprocesses" | grep "$0" | grep -q "loop_forever" ; then
		echo "please stop looping" > /tmp/moe.loop_control.status
		LOG_MESSAGE $LINENO "Process loop is invited to stop"
	fi
}
#------------------------------------------------------------------------------
CORRECT_CODE_ONLY ()
#------------------------------------------------------------------------------
{
	given_mail="$1"
	given_code="$2"
	if [ -z "$given_code" ] ; then
		RETURN_MESSAGE "Vous devez indiquer votre code personnel"
		exit 0
	fi
	registered_code=`cat $MoeCodes | grep -i "^$given_mail" | tail -n 1 | cut -f2`
	allowed_codes=`cat $MoeAdminCodes | grep "^allowed_code:" | cut -f2 | xargs | sed s/' '/'|'/g`
	if [ -z "$allowed_codes" ] ; then
		allowed_codes=`NEW_PASSWORD 64 64`
	fi
	if [ -z "$registered_code" ] ; then
		RETURN_MESSAGE "Vous avez commis une erreur en indiquant votre mail ou votre code personnel. L'action demandée ne va pas être effectuée."
		LOG_MESSAGE $LINENO "Access denied $Mail $Code E-mail not found"
		exit 0
	fi
	case "$given_code" in
	$allowed_codes)
		given_code="$registered_code"
		;;
	esac
	case "$registered_code" in
	revoked)
		RETURN_MESSAGE "Vous utilisez une adresse mail qui n'est plus autorisée. Contactez le support pour plus d'explications"
		exit 0
		;;
	esac
	case "$given_code" in
	$registered_code)
		;;
	*)
		RETURN_MESSAGE "Vous avez commis une erreur en indiquant votre mail ou votre code personnel. L'action demandée ne va pas être effectuée."
		LOG_MESSAGE $LINENO "Access denied $Mail $Code Code is incorrect"
		exit 0
		;;
	esac
}
#------------------------------------------------------------------------------
REVOKE_MAIL ()
#------------------------------------------------------------------------------
{
	echo "$1	revoked" >> $MoeCodes	
}
#------------------------------------------------------------------------------
UNREVOKE_MAIL ()
#------------------------------------------------------------------------------
{
	unrevoked=`cat $MoeCodes | grep -v "^$1	revoked"`
	echo "$unrevoked" > $MoeCodes	
}
#------------------------------------------------------------------------------
ACTION ()
#------------------------------------------------------------------------------
{
ActionTemplate="#! /bin/bash
/usr/local/bin/moe --action $*
rm \$0
exit 0"
echo "$ActionTemplate" > $MoeSpool/action.${Code}$1.sh
chmod 755 $MoeSpool/action.${Code}$1.sh
LOG_MESSAGE $LINENO "action $1 $2 $3 is waiting in spool"
}
#------------------------------------------------------------------------------
RETURN_MESSAGE ()
#------------------------------------------------------------------------------
{
echo "<br/>$*<br/>"
}
#------------------------------------------------------------------------------
STATISTICS ()
#------------------------------------------------------------------------------
{

DatabasesList=`cat $MoeDatabases | grep -v "#"`
if [ -z "$MoocList" ] ; then
	MoocList=`cat $MoeConfig | grep ^mooc_server: | cut -d: -f2 | xargs`
fi
TotalDatabases=0
TotalUnassigned=0
TotalAssigned=0
for mooc_server in $MoocList ; do
	TotalServerDatabases=0
	TotalServerUnassigned=0
	TotalServerAssigned=0
	for ((indexservice=1;indexservice<=$NbServicesPerVserver;indexservice=indexservice+1)) ; do
		contract=`cat $MoeConfig | grep ^mooc_server:$mooc_server: | cut -f2`
		service="srv$indexservice-$contract"
		NbDatabases=`echo "$DatabasesList" | cut -f3 | grep "$service" | wc -l`
		NbUnassigned=`echo "$DatabasesList" | grep "^UNASSIGNED" | cut -f3 | grep "$service" | wc -l`
		NbAssigned=`echo "$DatabasesList" | grep -v "^UNASSIGNED" | cut -f3 | grep "$service" | wc -l`
		echo "Le service $service supporte $NbDatabases bases de données dont $NbAssigned utilisées et $NbUnassigned non attribuées"
		TotalServerDatabases=`echo "$TotalServerDatabases + $NbDatabases" | bc`
		TotalServerUnassigned=`echo "$TotalServerUnassigned + $NbUnassigned" | bc`
		TotalServerAssigned=`echo "$TotalServerAssigned + $NbAssigned" | bc`
	done
	TotalDatabases=`echo "$TotalDatabases + $TotalServerDatabases" | bc`
	TotalUnassigned=`echo "$TotalUnassigned + $TotalServerUnassigned" | bc`
	TotalAssigned=`echo "$TotalAssigned + $TotalServerAssigned" | bc`
	echo "--------------------------------------------------------------------------------------------"
	echo "Le VDS $mooc_server supporte $TotalServerDatabases bases de données dont $TotalServerAssigned utilisées et $TotalServerUnassigned non attribuées"
	echo ""
done
echo "==========================================================================================="
echo "Total hebergement de $TotalDatabases bases de donnees dont $TotalAssigned utilisees et $TotalUnassigned non attribuees"
echo ""
}
#------------------------------------------------------------------------------
NEW_DATABASE ()
#------------------------------------------------------------------------------
{
case "$Mail" in 
UNASSIGNED)
	databasetocreate="yes"
	;;
*)
	if cat $MoeDatabases | grep -qi "^$Mail" ; then
		databasetocreate="no"
	else
		if cat $MoeDatabases | grep -q "^UNASSIGNED" ; then
			databasetocreate="assign"
		else
			databasetocreate="yes"
		fi
	fi
	;;
esac
DatabasesList=`cat $MoeDatabases | grep -v "#"`
case "${databasetocreate}" in
yes)
	ServicesList=""
	MoocList=`cat $MoeConfig | grep ^mooc_server: | cut -d: -f2 | xargs`
	databasecreated=""
	for mooc_server in $MoocList ; do
		for ((indexservice=1;indexservice<=$NbServicesPerVserver;indexservice=indexservice+1)) ; do
			contract=`cat $MoeConfig | grep ^mooc_server:$mooc_server: | cut -f2`
			service="srv$indexservice-$contract"
			serverurl=`cat $MoeConfig | grep ^mooc_server:$mooc_server: | cut -f5`
			NbDatabases=`echo "$DatabasesList" | cut -f3 | grep "$service" | wc -l`
			if [ $NbDatabases -lt $NbDatabasePerService ] ; then
				MoocServer="$mooc_server"
				DatabaseService="$service"
				DatabaseNumber=`echo "$NbDatabases + 1" | bc`
				DatabaseName=`NEW_BASE_CODE`
				DatabaseUrl="srv$indexservice.$serverurl"
				echo "$Mail	$MoocServer	$DatabaseService	$DatabaseName	$DatabaseUrl"	>> $MoeDatabases
				LOG_MESSAGE $LINENO "Create a new database $Mail	$MoocServer	$DatabaseService	$DatabaseName"
				EXECUTE_COMMAND $MoocServer /usr/local/bin/xoe --database -restore -force $DatabaseService $DatabaseName $LocalReferenceData
				#EXECUTE_COMMAND $MoocServer /usr/local/bin/xoe --database -save -no-history $DatabaseService $DatabaseName
				databasecreated="done"
				break
			fi
		done
		case "$databasecreated" in
		done)
			break
			;;
		esac
	done
	case "$databasecreated" in
	done)
		;;
	*)
		LOG_MESSAGE $LINENO "Cannot find a free position for database request from $Mail"
		case "$Mail" in
		UNASSIGNED)
			;;
		*)
			# créer une nouvelle demande dans le spool
			$0 --database_ids $Mail $Code
			;;
		esac
		;;
	esac
	;;
assign)
	AssignedDatabase=`cat $MoeDatabases | grep -m 1 "^UNASSIGNED" | cut -f4`
	DatabaseLine=`cat $MoeDatabases | grep "	$AssignedDatabase	" | tail -n 1`
	MoocServer=`echo "$DatabaseLine" | cut -f2`
	DatabaseService=`echo "$DatabaseLine" | cut -f3`
	DatabaseName=`echo "$DatabaseLine" | cut -f4`
	DatabaseUrl=`echo "$DatabaseLine" | cut -f5`
	NewMoeDatabases=`cat $MoeDatabases | grep -v "	$AssignedDatabase	"`
	mv $MoeDatabases $MoeDatabases.save
	echo "$NewMoeDatabases" > $MoeDatabases
	echo "$Mail	$MoocServer	$DatabaseService	$DatabaseName	$DatabaseUrl"	>> $MoeDatabases
	;;
no)
	;;
esac
}
#------------------------------------------------------------------------------
DROP_DATABASE ()
#------------------------------------------------------------------------------
{
case "$Mail" in
*@*|UNASSIGNED)
	if [ -z "$Service" ] ; then
		DatabasesList=`cat $MoeDatabases | grep -v "#" | grep -i "^$Mail	"`
	else
		DatabasesList=`cat $MoeDatabases | grep -v "#" | grep -i "^$Mail	" | grep "	$Service	"`
	fi
	cp --backup=numbered $MoeDatabases $MoeDatabases.save
	old_IFS=$IFS
	IFS=$'\n'
	for DatabaseLine in $DatabasesList ; do
		IFS=$old_IFS
		MoocServer=`echo "$DatabaseLine" | cut -f2`
		DatabaseService=`echo "$DatabaseLine" | cut -f3`
		DatabaseName=`echo "$DatabaseLine" | cut -f4`
		DatabaseUrl=`echo "$DatabaseLine" | cut -f5`
		NewMoeDatabases=`cat $MoeDatabases | grep -v "	$DatabaseName	"`
		echo "$NewMoeDatabases" > $MoeDatabases
		echo "#$Mail	$MoocServer	$DatabaseService	$DatabaseName	$DatabaseUrl"	>> $MoeDatabases
		chmod 777 $MoeDatabases
		chmod 777 $MoeDatabases.save
		LOG_MESSAGE $LINENO "Drop database $Mail	$MoocServer	$DatabaseService	$DatabaseName"
		EXECUTE_COMMAND $MoocServer /usr/local/bin/xoe --database -drop -db $DatabaseService $DatabaseName
		IFS=$'\n'
	done
	IFS=$old_IFS
	;;
esac
}
#------------------------------------------------------------------------------
CHECK_DATABASE ()
#------------------------------------------------------------------------------
{
if [ -z "$MoocList" ] ; then
	MoocList=`cat $MoeConfig | grep ^mooc_server: | cut -d: -f2 | xargs`
fi
TotalErrorCount=0
for mooc_server in $MoocList ; do
	ErrorCount=0
	for ((indexservice=1;indexservice<=$NbServicesPerVserver;indexservice=indexservice+1)) ; do
		contract=`cat $MoeConfig | grep ^mooc_server:$mooc_server: | cut -f2`
		service="srv$indexservice-$contract"
		DatabasesList=`cat $MoeDatabases | grep -v "#" | grep "	$mooc_server	" | grep "	$service	" | cut -f4 | xargs`
		ExistingList=`EXECUTE_COMMAND $mooc_server /usr/local/bin/xoe --database -list -db $service`
		for database in $DatabasesList ; do
			if echo "$ExistingList" | grep -q " $database " ; then
				echo "Server $mooc_server Service $service : la base $database est declaree et existe" >> $MoeReport
			else
				ErrorCount=`echo "$ErrorCount + 1" | bc`
				echo "Server $mooc_server Service $service : la base $database est declaree et doit etre creee" >> $MoeReport
				case "$Repair" in
				yes)
					echo "EXECUTE_COMMAND $mooc_server /usr/local/bin/xoe --database -restore -force $service $database $LocalReferenceData" >> $MoeReport
					EXECUTE_COMMAND $mooc_server /usr/local/bin/xoe --database -restore -force $service $database $LocalReferenceData
					;;
				esac
			fi
		done
	done
	echo "--------------------------------------------------------------------------------------------" >> $MoeReport
	echo "Nombre d'anomalies detectees sur $mooc_server : $ErrorCount" >> $MoeReport
	echo "" >> $MoeReport
	TotalErrorCount=`echo "$TotalErrorCount + $ErrorCount" | bc`
done
echo "==========================================================================================" >> $MoeReport
echo "Nombre Total d'anomalies detectees : $TotalErrorCount" >> $MoeReport
echo "" >> $MoeReport
}
#------------------------------------------------------------------------------
DECLARE_DATABASE ()
#------------------------------------------------------------------------------
{
if [ -z "$MoocList" ] ; then
	MoocList=`cat $MoeConfig | grep ^mooc_server: | cut -d: -f2 | xargs`
fi
TotalErrorCount=0
for mooc_server in $MoocList ; do
	ErrorCount=0
	for ((indexservice=1;indexservice<=$NbServicesPerVserver;indexservice=indexservice+1)) ; do
		contract=`cat $MoeConfig | grep ^mooc_server:$mooc_server: | cut -f2`
		service="srv$indexservice-$contract"
		DatabasesList=`cat $MoeDatabases | grep -v "#" | grep "	$mooc_server	" | grep "	$service	" | cut -f4 | xargs`
		ExistingList=`EXECUTE_COMMAND $mooc_server /usr/local/bin/xoe --database -list -db $service`
		ExistingNames=`echo "$ExistingNames" | cut -d"|"  -f1 `
		for database in $ExistingNames ; do
			if echo "$DatabaseList" | grep -q " $database " ; then
				echo "Server $mooc_server Service $service : la base $database est declaree" >> $MoeReport
			else
				ErrorCount=`echo "$ErrorCount + 1" | bc`
				echo "Server $mooc_server Service $service : la base $database existe et doit etre declaree" >> $MoeReport
				case "$Repair" in
				yes)
					serverurl=`cat $MoeConfig | grep ^mooc_server:$mooc_server: | cut -f5`
					DatabaseUrl="srv$indexservice.$serverurl"
					echo "UNASSIGNED	$mooc_server	$service	$database	$DatabaseUrl" >> $MoeReport
					echo "UNASSIGNED	$mooc_server	$service	$database	$DatabaseUrl"	>> $MoeDatabases
					;;
				esac
			fi
		done
	done
	echo "--------------------------------------------------------------------------------------------" >> $MoeReport
	echo "Nombre d'anomalies detectees sur $mooc_server : $ErrorCount" >> $MoeReport
	echo "" >> $MoeReport
	TotalErrorCount=`echo "$TotalErrorCount + $ErrorCount" | bc`
done
echo "==========================================================================================" >> $MoeReport
echo "Nombre Total d'anomalies detectees : $TotalErrorCount" >> $MoeReport
echo "" >> $MoeReport
}
#------------------------------------------------------------------------------
PARSING_DATABASE_LINE ()
#------------------------------------------------------------------------------
{
DatabaseLine=`cat $MoeDatabases | grep -i "^$Mail" | tail -n 1`
MoocServer=`echo "$DatabaseLine" | cut -f2`
DatabaseService=`echo "$DatabaseLine" | cut -f3`
DatabaseName=`echo "$DatabaseLine" | cut -f4`
DatabaseUrl=`echo "$DatabaseLine" | cut -f5`
}
#------------------------------------------------------------------------------
SEND_MAIL ()
#------------------------------------------------------------------------------
{
message_type="$1"
shift
case "$message_type" in
-error)
	errortext="$*"
	SenderMail=`cat $MoeConfig | grep ^mail:sender: | cut -f2-`
	case "$MoeMode" in
	local|remote|suspend)
		ToMail=" -b `cat $MoeConfig | grep ^mail:admin: | cut -f2-` $Mail"
		MailFlag=""
		;;
	test|redirect)
		ToMail=`cat $MoeConfig | grep ^mail:test: | cut -f2-`
		MailFlag="- Redirected from $Mail"
		;;
	esac
	MessageSubject="[Mooc_ERP] Votre requete ne peut aboutir"
	MessageText="Bonjour,

Vous avez soumis une demande sur le serveur du Mooc ERP.

Cependant, le serveur a rejete votre demande pour la raison suivante :
$errortext

$MoeContact

Nous vous souhaitons pleine reussite dans votre apprentissage.

"
	echo "$MessageText" | mail -a "From: $SenderMail" -s "$MessageSubject $MailFlag" $ToMail
	;;
-template)
	templatename="$1"
	SenderMail=`cat $MoeConfig | grep ^mail:sender: | cut -f2-`
	case "$MoeMode" in
	local|remote|suspend)
		ToMail=" -b `cat $MoeConfig | grep ^mail:admin: | cut -f2-` $Mail"
		MailFlag=""
		;;
	test|redirect)
		ToMail=`cat $MoeConfig | grep ^mail:test: | cut -f2-`
		MailFlag="- Redirected from $Mail"
		;;
	esac
	mooc_url="mooc url $MoocServer"
	login_url="$DatabaseUrl/web/login?db=$DatabaseName"
	case "$templatename" in
	send_code)
		MessageSubject="[Mooc_ERP] Votre code personnel"
		MessageText="Bonjour,

Vous avez soumis une demande de code personnel sur le serveur du Mooc ERP. Ce code personnel vous a ete attribue.

Votre adresse mail utilisee pour votre identification : $Mail
Votre code personnel : $Code

Ce code va vous permettre de creer votre espace personnel pour effectuer les exercices d'application du Mooc ERP en vous rendant sur la page :
http://mooc.odoo-online.fr

$MoeContact

Nous vous souhaitons pleine reussite dans votre apprentissage.

"
		;;
	revoke)
		MessageSubject="[Mooc_ERP] Revocation de votre adresse mail"
		MessageText="Bonjour,

Vous avez soumis une demande de bannissement d'une adresse mail sur le serveur du Mooc ERP.

L'adresse mail suivante ne sera plus jamais utilisee : $Mail

Si cette adresse mail etait utilisee sans votre consentement, nous vous prions de nous excuser pour la gene occasionnee.
Si vous recevez encore des messages de notre part, merci de contacter service.client@sisalp.fr.

$MoeContact

Nous vous souhaitons pleine reussite dans votre apprentissage.

"
		;;
	unrevoke)
		MessageSubject="[Mooc_ERP] Revalidation de votre adresse mail"
		MessageText="Bonjour,

Vous avez soumis une demande de revalidation d'une adresse mail dont vous aviez demande le bannissement sur le serveur du Mooc ERP.

Il semble que cette demande de bannissement etait due a une erreur ou a ete effectuee a votre insu. Elle a ete revalidee.

L'adresse mail suivante peut de nouveau etre utilisee : $Mail

$MoeContact

Nous vous souhaitons pleine reussite dans votre apprentissage.

"
		;;
	database_ids)
		MessageSubject="[Mooc_ERP] Acces a votre espace personnel"
		MessageText="Bonjour,

Vous avez soumis une demande de mise a dispostion d'un espace personnel sur le serveur du Mooc ERP. Cet espace personnel a ete cree.

Votre page de connexion personnelle : http://$login_url
Le nom de votre espace personnel (nom de la base de donnees) : $DatabaseName

Si le lien ci-dessus n'est pas actif, copiez le dans votre navigateur.
Si vous partagez votre poste avec d'autres utilisateurs, vous pouvez passer d'un espace personnel à l'autre sur la page
http://$DatabaseUrl/web/database/selector
en y indiquant le nom de votre base de donnees.
Les identifiants de connexion a votre espace personnel vous sont indiques dans le cours. La connexion en tant qu'administrateur de la base de donnees se fait en indiquant
- Courriel : admin
- Mot de passe : admin

$MoeContact

Nous vous souhaitons pleine reussite dans votre apprentissage.


"
		;;
	database_save)
		MessageSubject="[Mooc_ERP] Sauvegarde de votre espace personnel"
		MessageText="Bonjour,

Vous avez soumis une demande de sauvegarde de votre espace personnel sur le serveur du Mooc ERP. Cette sauvegarde a ete effectuee.

$MoeContact

Nous vous souhaitons pleine réussite dans votre apprentissage.

"
		;;
	database_restore)
		MessageSubject="[Mooc_ERP] Restauration de votre espace personnel"
		MessageText="Bonjour,

Vous avez soumis une demande de restauration de votre personnel sur le serveur du Mooc ERP. Cette restauration a ete effectuee.

$MoeContact

Nous vous souhaitons pleine réussite dans votre apprentissage.

"

		;;
	database_reset)
		MessageSubject="[Mooc_ERP] Reinitialisation de votre espace personnel"
		MessageText="Bonjour,

Vous avez soumis une demande de reinitialisation de votre espace personnel sur le serveur du Mooc ERP. Cette reinitialisation a ete effectuee.

$MoeContact

Nous vous souhaitons pleine réussite dans votre apprentissage.

"
		;;
	esac
	echo "$MessageText" | mail -a "From: $SenderMail" -s "$MessageSubject $MailFlag" $ToMail
	;;
esac
LOG_MESSAGE $LINENO "send mail $message_type $templatename code $Code db $DatabaseName to $Mail"
}
#------------------------------------------------------------------------------
DATABASE_EXISTS_ONLY ()
#------------------------------------------------------------------------------
{
if ! cat $MoeDatabases | grep -qi "^$Mail" ; then
	LOG_MESSAGE "$LINENO Database of mail $Mail is not found"
	SEND_MAIL -error "Vous devez d'abord creer votre base de donnees d'entrainement en demandant vos identifiants de connexion"
	exit 0
fi	
}
#------------------------------------------------------------------------------
SAVE_DATABASE ()
#------------------------------------------------------------------------------
{
EXECUTE_COMMAND $MoocServer /usr/local/bin/xoe --database -save -no-history $DatabaseService $DatabaseName
}
#------------------------------------------------------------------------------
RESTORE_DATABASE ()
#------------------------------------------------------------------------------
{
EXECUTE_COMMAND $MoocServer /usr/local/bin/xoe --restart $DatabaseService
EXECUTE_COMMAND $MoocServer /usr/local/bin/xoe --database -restore -force $DatabaseService $DatabaseName $LocalReferenceData
}
#------------------------------------------------------------------------------
RESET_DATABASE ()
#------------------------------------------------------------------------------
{
EXECUTE_COMMAND $MoocServer /usr/local/bin/xoe --restart $DatabaseService
EXECUTE_COMMAND $MoocServer /usr/local/bin/xoe --database -restore -force $DatabaseService $DatabaseName $LocalReferenceData
}
#------------------------------------------------------------------------------
CHECK_PERMISSIONS ()
#------------------------------------------------------------------------------
{
for directory in $MoeDir $MoeSpool $MoeData ; do
	if [ ! -d $directory ] ; then
		mkdir $directory
		chmod 777 $directory
	fi
done
for datafile in $MoeConfig $MoeCodes $MoeDatabases $MoeAdminCodes $MoeLogFile ; do
	if [ ! -e $datafile ] ; then
		echo "#$HOSTNAME|moe|`date +%A_%x-%H:%M:%S:%3N`|INFO |$CurrentUser|$$|$* initialization of $datafile" >> $datafile
		chmod 777 $datafile
		LOG_MESSAGE $LINENO "File $datafile is initialized"
	fi
done
}
#------------------------------------------------------------------------------
#
Option="$1"
shift
ActionParameters="$*"
CHECK_PERMISSIONS
#LOG_MESSAGE $LINENO "$Option $*"
case "$Option" in
--code)
	Mail="$1"
	Code=`GET_CODE $Mail`
	CORRECT_CODE_ONLY $Mail $Code
	ACTION -send_code $Mail $Code
	RETURN_MESSAGE "Vous allez recevoir votre code personnel par mail à l'adresse $Mail"
	;;
#------------------------------------------------------------------------------
--revoke)
	Mail="$1"
	Code="$2"
	CORRECT_CODE_ONLY $Mail $Code
	ACTION -revoke $Mail $Code
	RETURN_MESSAGE "Vous allez recevoir une derniere confirmation de votre action par mail à l'adresse $Mail"
	;;
#------------------------------------------------------------------------------
--unrevoke)
	Mail="$1"
	Code="$2"
	ACTION -unrevoke $Mail $Code
	RETURN_MESSAGE "Vous allez recevoir une confirmation de votre action par mail à l'adresse $Mail"
	;;
#------------------------------------------------------------------------------
--database_create)
	DatabaseNumber="$1"
	Code="z_admin"
	ACTION -database_create $DatabaseNumber
	RETURN_MESSAGE "$DatabaseNumber bases de donnees non assignees vont être creees"
	;;
#------------------------------------------------------------------------------
--database_drop)
	Mail="$1"
	Service="$2"
	Code="z_admin"
	ACTION -database_drop $Mail $Service
	RETURN_MESSAGE "Les bases de donnees non assignees vont être supprimees"
	;;
#------------------------------------------------------------------------------
--database_check)
	Parameters="$*"
	Code="z_admin"
	ACTION -database_check $Parameters
	RETURN_MESSAGE "Les bases de donnees déclarées non créées vont être créées"
	;;
#------------------------------------------------------------------------------
--database_declare)
	Parameters="$*"
	Code="z_admin"
	ACTION -database_declare $Parameters
	RETURN_MESSAGE "Les bases de donnees crées non déclarées vont être déclarées"
	;;
#------------------------------------------------------------------------------
--database_ids)
	Mail="$1"
	Code="$2"
	CORRECT_CODE_ONLY $Mail $Code
	ACTION -database_ids $Mail $Code
	RETURN_MESSAGE "Vous allez recevoir vos identifiants de connexion à votre base de données d'entrainement par mail à l'adresse $Mail"
	;;
#------------------------------------------------------------------------------
--database_save)
	Mail="$1"
	Code="$2"
	CORRECT_CODE_ONLY $Mail $Code
	ACTION -database_save $Mail $Code
	RETURN_MESSAGE "Vous allez recevoir une confirmation par mail à l'adresse $Mail quand l'opération de sauvegarde sera terminée"
	;;
#------------------------------------------------------------------------------
--database_restore)
	Mail="$1"
	Code="$2"
	CORRECT_CODE_ONLY $Mail $Code
	ACTION -database_restore $Mail $Code
	RETURN_MESSAGE "Vous allez recevoir une confirmation par mail à l'adresse $Mail quand l'opération de restauration sera terminée"
	;;
#------------------------------------------------------------------------------
--database_reset)
	Mail="$1"
	Code="$2"
	CORRECT_CODE_ONLY $Mail $Code
	ACTION -database_reset $Mail $Code
	RETURN_MESSAGE "Vous allez recevoir une confirmation par mail à l'adresse $Mail quand l'opération de ré-initialisation sera terminée"
	;;
#------------------------------------------------------------------------------
--execute)
	case "$MoeMode" in
	local|remote|test|redirect)
		for action in `ls $MoeSpool` ; do
			$MoeSpool/$action
		done
		;;
	*|suspend)
		LOG_MESSAGE $LINENO "Mode is suspend, spooled actions are not executed"
		;;
	esac
	;;
#------------------------------------------------------------------------------
--background)
	NOT_LOOPING_ONLY
	nohup $0 --loop_forever >> $MoeLogFile 2>&1 &
	;;
#------------------------------------------------------------------------------
--loop_forever)
	LOOP_FOREVER
	;;
#------------------------------------------------------------------------------
--spool)
	ls -lh $MoeSpool
	;;
#------------------------------------------------------------------------------
--stop)
	STOP_LOOP
	;;
#------------------------------------------------------------------------------
--action)
	Command="$1"
	Mail="$2"
	Code="$3"
	case "$Command" in
	-send_code)
		SEND_MAIL -template send_code
		;;
	-revoke)
		SEND_MAIL -template revoke
		REVOKE_MAIL $Mail
		;;
	-unrevoke)
		SEND_MAIL -template unrevoke
		UNREVOKE_MAIL $Mail
		;;
	-database_create)
		Mail="UNASSIGNED"
		NumberToCreate="$2"
		case "$2" in
		[1-9]*)
			for ((  indexdatabase = 1 ;  indexdatabase <= $NumberToCreate ;  indexdatabase++  )) ; do
				NEW_DATABASE
			done
			;;
		esac
		;;
	-database_drop)
		Service="$3"
		#drop database corresponding to mail and service, all services if service is not indicated.
		DROP_DATABASE
		;;
	-database_check)
		shift
		Repair="no"
		case "$1" in
		-repair)
			Repair="yes"
			shift
			;;
		esac
		MoocList="$*"
		CHECK_DATABASE
		;;
	-database_declare)
		shift
		Repair="no"
		case "$1" in
		-repair)
			Repair="yes"
			shift
			;;
		esac
		MoocList="$*"
		DECLARE_DATABASE
		;;
	-database_ids)
		NEW_DATABASE
		PARSING_DATABASE_LINE
		SEND_MAIL -template database_ids
		;;
	-database_save)
		DATABASE_EXISTS_ONLY
		PARSING_DATABASE_LINE
		SAVE_DATABASE
		SEND_MAIL -template database_save
		;;
	-database_restore)
		DATABASE_EXISTS_ONLY
		PARSING_DATABASE_LINE
		RESTORE_DATABASE
		SEND_MAIL -template database_restore
		;;
	-database_reset)
		DATABASE_EXISTS_ONLY
		PARSING_DATABASE_LINE
		RESET_DATABASE
		SEND_MAIL -template database_reset
		;;
	esac
	;;
#------------------------------------------------------------------------------
--report)
	case "$1" in
	-raz)
		rm $MoeReport
		;;
	-live)
		while [ ! -f $MoeReport ] ; do
			sleep 1
		done
		tail -f $MoeReport
		;;
	*)
		less $MoeReport
		;;
	esac
	;;
#------------------------------------------------------------------------------
--info)
	Mail="$1"
	if [ -z "$Mail" ] ; then
		less $MoeCodes
	else
		echo "Informations sur l'utilisateur $Mail :"
		cat $MoeCodes | grep -i "$Mail"
		cat $MoeDatabases | grep -i "$Mail"
		echo "Historique de l'utilisateur $Mail :"
		$0 --log | grep -i "$Mail"
	fi
	;;

#------------------------------------------------------------------------------
--statistics)
	STATISTICS
	;;
#------------------------------------------------------------------------------
--version)
	echo "<!--moe version is $MoeVersion -->"
	;;
#------------------------------------------------------------------------------
--config)
	case `whoami` in
	root)
		cat $0 | grep -m 1 -B 100 "#EndConfig" | grep -A 100 "#StartConfig"
		cat $MoeConfig
		cat /etc/hosts
		;;
	esac
	;;
#------------------------------------------------------------------------------
--log)
	cat -n $MoeLogFile
	;;
#------------------------------------------------------------------------------
--live)
	tail -f $MoeLogFile
	;;

#------------------------------------------------------------------------------
--keypass)
	priviledgekey=`NEW_PASSWORD 13 2`
	echo "allowed_code:	adm_$priviledgekey" >> $MoeAdminCodes
	echo "Your new admin access is adm_$priviledgekey"
	;;
#------------------------------------------------------------------------------
--mode)
	case "$1" in
	test|local|remote|suspend|redirect)
		echo "$1" > $MoeModeFile
		;;
	*)
		echo -n "$MoeMode"
	esac
	;;
#------------------------------------------------------------------------------
--site_mode)
	case "$1" in
	maintenance|on)
		echo "$1" > $MoeSiteModeFile
		;;
	*)
		echo -n "$MoeSiteMode"
	esac
	;;	
#------------------------------------------------------------------------------
--help)
	echo "moe : gestion des bases de données d'entrainement des utilisateurs du mooc
syntaxe :
moe --command [parameters]

command :
--help

commands activated by internet user or administrator:
====================================================

--code			mail_address		#get personnal id code
--database_ids		mail_address	code	#get database connexion ids		
--database_reset	mail_address	code	#reset database
--database_restore	mail_address	code	#restore database
--database_save		mail_address	code	#save database
--revoke		mail_address	code	#blacklist an email address


previous commands generates scripts in $MoeSpool which invoke the following command :

--action -command 	mail_address	code	#execute the action requested by internet user
-command is in 	-send_code|-database-create|-database_ids|-database_save|-database_restore|-database_reset|-revoke

All scripts of the spool are executed periodically in loop activated or re-activated by crontab

--background		#check the loop is active else restart it by --loop_forever
--execute		#execute all spcripts in the pool
--loop_forever		#loop forever on --execute command

commands for the administrator only:
===================================

--config		#prints hardcoded parameters and context files
--database_create	number_of_databases	#create unassigned databases
--database_drop		mail_address|UNASSIGNED [service] #drop databases on a service
--database_check	[-repair][mooc_list]	#check declared database are created
--database_declare	[-repair][mooc_list]	#check existing databases are declared
--unrevoke		mail_address		#revalidate an email address
--info  [mail_address]	#print user information
--keypass		#get a code to supercede any user code
--licence		#print licence
--live			#print last lines and follow moe log file
--log			#print moe log file
--mode [mode]		#set moe execution mode (see below)
--report [-raz|-live]	#report of background actions
--site_mode [mode]	#set moe site execution mode (see below)
--spool			#list waiting scripts in spool
--statistics		#print statistics
--stop			#stop the background loop
--version		#print moe version

command --revoke can be used by the user or the administrator with a keypass code

Allowed codes in $MoeAdminCodes are used to by-pass user authentication

Moe execution modes are used for online maintenance:
local		database and service are local,
remote		database and service are remote,
test		commands on databases are not executed and mail is sent to alternative test mail address
suspend		background actions are delayed
redirect	all mail traffic is redirected to administrator's mail box

Site execution modes are used for online maintenance:
maintenance	web interface is closed,
on		web site is operational

if mode is not indicated, moe returns current mode
Remote requires /etc/hosts to solve host names and key previously exchanged.

Parameters are located in $MoeConfig
"
cat $MoeConfig | grep -v "#"
$0 --version
	;;
#------------------------------------------------------------------------------
--licence)
	echo "This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

Credits
2015-today: moe is an original work from SISalp, http://sisalp.fr"
	;;
#------------------------------------------------------------------------------
*)
	echo "503 Option $Option is not supported by moe command"
	$0 --help
	;;
#------------------------------------------------------------------------------
esac
exit 0
