#!/bin/bash

# v1: cleon : 07/05/2014
# v1.1*: Adaptation Eole 2.4
#        cleon : 18/10/2018 :  #25601 admin econnect

RunCmd=CreoleRun
container_path_web=$(CreoleGet container_path_web)
web_url=$(CreoleGet web_url)
proxy_client_adresse=$(CreoleGet proxy_client_adresse "") # ref #11794 valeur par défaut
proxy_client_port=$(CreoleGet proxy_client_port "") # ref #11794 valeur par défaut
time_zone=$(CreoleGet time_zone)
numero_etab=$(CreoleGet numero_etab)
libelle_etab=$(CreoleGet libelle_etab)
activer_sso=$(CreoleGet activer_sso)
eolesso_adresse=$(CreoleGet eolesso_adresse "")
activer_addadmin=$(CreoleGet activer_addadmin "")
uid_addadmin=$(CreoleGet uid_addadmin "")
activer_econnect=$(CreoleGet activer_econnect non)

econnect_admin=$(CreoleGet econnect_admin "")

if [ "$activer_econnect" == "non" ]
then
    exit 0
fi

. /usr/share/envole/eoledb/econnect


DOSSIER="$container_path_web/var/www/html/econnect/conf.d"
BASE="econnect"
LOG="/tmp/econnect"
TOKEN=""
DBPASS=dbpass

# Fonction pour récupérer le token d'authentification
getToken() {
   TOKEN=$(mysql -u econnect -p$dbpassECONNECT -h $dbhostECONNECT --batch --default-character-set=utf8 "$BASE" --column-names=0  -e "select token from user where uid='admin'" 2>/dev/null)
}

# Function pour interroger l'API
api() {
    [ -z "$TOKEN" ] && getToken
    [ -e "$LOG"   ] && /bin/rm -rf $LOG
    cmd="$2"
    method="-X $1"
    FTOKEN="-F token=$TOKEN"
    [ "$1" == "PUT" ] && FTOKEN="-d token=$TOKEN"
    OPTIONS="--insecure -s --output $LOG $method $FTOKEN"

    C=$((${#}-2))

    # ref: #9000 , passage par un fichier pour lancer la commande curl
    CMD="/usr/bin/curl --write-out '%{http_code}\n' $OPTIONS  ${@: -$C:$C} 'https://$web_url/econnect/api/$cmd'"
    echo "#!/bin/bash" > /tmp/econnect.cmd && echo "$CMD" >> /tmp/econnect.cmd && chmod +x /tmp/econnect.cmd
    response=$(/tmp/econnect.cmd)

    [ "$response" != "200" ] && echo "Erreur d'accès à l'API: /$cmd (code=$response), plus de détails dans $LOG" && head $LOG && echo "" && exit 0

}

apiPost() {
	api "POST" $@
}

apiPut() {
	api "PUT" $@
}

setParam() {
	name="$1"
	val="$2"
	apiPut  "parameter/$name" -d value="$val" -d locked="1"
}

# Mis à jour du contexte
apiPost "context/$numero_etab" -F name="\"$libelle_etab\""

# Mis a jour des paramètres en PUT
setParam "timezone" "$time_zone"

# ref #11794 : Verification existance proxy_client
[ ! -z $proxy_client_adresse ] && setParam "proxy"    "$proxy_client_adresse:$proxy_client_port"

# ref #27058 : Suppression du proxy si non défini
[  -z $proxy_client_adresse ] && setParam "proxy"    ""

# --admin <email> permet de désigner un administrateur a partir de son email
if [ "$1" = "--admin" -a ! -z "$TOKEN" ] ; then
        echo '{"admins":[{"email":"'$2'","admin":"global"}]}' > /tmp/econnect-admin
        apiPost "import" -F file=@/tmp/econnect-admin
        exit 0
fi

# ref: #14380 Pourvoir définir un second admin de l'application
if [ "$activer_addadmin" = "oui" ]; then
        echo '{"fluid":true,"admins":[{"uid":"'$uid_addadmin'","admin":"global"}]}' > /tmp/econnect-admin
        apiPost "import" -F file=@/tmp/econnect-admin
fi

# ref: #25601 Pouvoir définir un admin econnect sans dépendre de posh profil
if [ ! -z "$econnect_admin" -a ! "$econnect_admin" = "admin" ]; then
        echo '{"fluid":true,"admins":[{"uid":"'$econnect_admin'","admin":"global"}]}' > /tmp/econnect-admin
        apiPost "import" -F file=@/tmp/econnect-admin
fi

# Si on passe en paramètre un fichier qui existe, on va essayer de l'importer
if [ ! -z "$1" -a -e "$1" ] ; then
        echo "Envole-connecteur, importation de $1"
        apiPost "import" -F file=@$1
        exit 0
fi

#fixes  #25033 12-gar n'est plus nécessaire
[ -e $DOSSIER/12-gar ] && rm -rf $DOSSIER/12-gar


# Intégration des ressources
echo "Envole-connecteur, intégrations des ressources"
for FILE in `ls --ignore='*~' $DOSSIER/`
do
        echo "   - $FILE"
        apiPost "import" -F file=@$DOSSIER"/"$FILE
done

ECONNECT_TOKEN_FILE="/root/.econnect.token"
ECONNECT_URL_FILE="/root/.econnect.url"
ECONNECT_CRON_FILE="/tmp/econnect.cron"

# Si on arrive jusqu'ici l'importation des ressources est OK
# on memorise le token et l'url (sera utilisé dans le cron 31_econnect_sso)
if [ ! -z "$TOKEN" ] ; then
    echo "$TOKEN"   >    $ECONNECT_TOKEN_FILE
    echo "$web_url" >    $ECONNECT_URL_FILE
fi

echo "# Génération de la conf sso pour econnect
#si pas de changement le script ne fait rien
#si changement regénération des fichiers /usr/share/sso/app_filters/econnect_*.ini
*/1 * * * * root /usr/share/eole/postservice/31_econnect_sso >> /tmp/econnect.log" > $ECONNECT_CRON_FILE

if [ "$activer_sso" = "local" ] ; then
    cp  /tmp/econnect.cron  /etc/cron.d/econnect
else
    # SSO Distant, pas de cron en local
    [ -e /etc/cron.d/econnect ] && rm -rf /etc/cron.d/econnect

    ECONNECT_TMP="/tmp/econnect"
    [ -e $ECONNECT_TMP ] && rm -rf $ECONNECT_TMP
    mkdir $ECONNECT_TMP
    cp /usr/share/eole/postservice/31_econnect_sso $ECONNECT_TMP
    cp $ECONNECT_TOKEN_FILE $ECONNECT_TMP
    cp $ECONNECT_URL_FILE   $ECONNECT_TMP
    cp $ECONNECT_CRON_FILE  $ECONNECT_TMP
    cd $ECONNECT_TMP
    tar -cvf /tmp/econnect.tar . >/dev/null 2>&1

    # Création d'un script d'auto extraction pour configurer les filtres SSO
    # sur un seveur distant
    echo "#!/bin/bash

# Vérif existance SSO
[ ! -d /usr/share/sso ] && echo \"EoleSSO n'est pas installé sur ce serveur\" && exit 3

# Dossier temporaire
DEST=/tmp/econnect
[  -e \$DEST ] && rm -rf  \$DEST
mkdir  \$DEST

ARCHIVE=\`awk '/^__START_HERE__/ {print NR + 1; exit 0; }' \$0\`
tail -n+\$ARCHIVE \$0 | tar -C "\${DEST}" -x

cp \$DEST/.econnect.token $ECONNECT_TOKEN_FILE
cp \$DEST/.econnect.url   $ECONNECT_URL_FILE
cp \$DEST/econnect.cron   $ECONNECT_CRON_FILE
cp \$DEST/31_econnect_sso /usr/share/eole/postservice/31_econnect_sso

#Vérification
[ ! -e $ECONNECT_TOKEN_FILE -o ! -e $ECONNECT_URL_FILE ] && echo \"Erreur lors de la mise en place de eConnect\" && exit 1
[ ! -e /usr/share/eole/postservice/31_econnect_sso ]     && echo \"Post Service non créé\" && exit 1

echo \"# -*- coding: utf-8 -*-

import ecs_profil

def calc_info(user_infos):

    uid = user_infos.get('uid', [''])[0]

    FrEduRne = getRneAcad(user_infos)
    if uid==\"admin\":
        ret=\"admin\"
    elif FrEduRne != None:
        ret=\"acad_%s\" % uid
    elif is_ts(user_infos):
        ret=\"ts_%s\" % uid
    else:
        ret=user_infos.get('intid', [uid])[0]

    return [ret]
\" > /usr/share/sso/user_infos/econnect_uniqueid.py


# Création des filtres
/usr/share/eole/postservice/31_econnect_sso --force

# Vérifications
[ ! -e /usr/share/sso/app_filters/econnect_apps.ini ] && echo \"Configuration SSO pour eConnect non trouvée\" && exit 2

echo \"Configuration créée\";

exit 0

__START_HERE__" > /tmp/econnect.bin

cat /tmp/econnect.tar >> /tmp/econnect.bin
chmod +x /tmp/econnect.bin

echo ""
echo "===================================================================="
echo "Le SSO n'est pas local,"
echo " veuillez copier le script /tmp/econnect.bin"
echo " sur votre SSO $eolesso_adresse distant et l'exécuter"
echo "==================================================================="
echo ""

fi

exit 0
