#!/bin/bash

# kan: 30/03/2021
# koi: créer les users dans le système KAZ, le KazWorld, to become a kaznaute, a kaaaaaaaznaute!
# ki : fab
# test git du 02/10/2023 depuis snster

# !!! need by htpasswd
# apt-get install apache2-utils dos2unix

# rechercher tous les TODO du script pour le reste à faire
##########################################################

# fonctionnement :
# vérification de l'existence du fichier des demandes et création si absent
# on garnit les variables
# on vérifie les variables
# on créé un mdp utilisable par tous les services (identifiant : email kaz)
# pour chacun des services KAZ (NC / WP / DOKUWIKI)
# * on vérifie si le sous-domaine existe, on le créé sinon
# * on créé le user et le met admin si nécessaire
# * s'il existe déjà, rollback (y compris sur les autres services)
# pour paheko, on vérifie si le sous-domaine existe, on le créé sinon
# pour mattermost, on créé le user et l'équipe si nécé=essaire, sur l'agora de base
# tout est ok, on créé l'email
# on créé le mail d'inscription avec tout le détail des services créés (url/user)
# on inscrit le user dans la liste infos@${domain_sympa}
# on avertit contact@kaz.bzh et on post dans l'agora/creation_compte

# TODO : utilisez la req sql pour attaquer paheko et créer createUser.txt en auto et modifier le champ dans paheko ACTION de "à créer" à "aucune"

# on récupère toutes les variables et mdp
# on prend comme source des repertoire le dossier du dessus ( /kaz dans notre cas )
KAZ_ROOT=$(cd "$(dirname $0)/.."; pwd)
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
setKazVars

cd "${KAZ_ROOT}"
. "${DOCKERS_ENV}"
. "${KAZ_KEY_DIR}/SetAllPass.sh"

# DOCK_DIR="${KAZ_COMP_DIR}" # ???

SETUP_MAIL="docker exec -ti mailServ setup"

# on détermine le script appelant, le fichier log et le fichier source, tous issus de la même racine
PRG=$(basename $0)
RACINE=${PRG%.sh}

CREATE_ORGA_CMD="${KAZ_CONF_DIR}/orgaTmpl/orga-gen.sh"

mkdir -p "${KAZ_ROOT}/tmp" "${KAZ_ROOT}/log"

# fichier source dans lequel se trouve les infos sur les utilisateurs à créer
FILE="${KAZ_ROOT}/tmp/${RACINE}.txt"
# fichier de log pour
LOG="${KAZ_ROOT}/log/${RACINE}.log"
# TODO : risque si 2 admins lance en même temps

CMD_LOGIN="${KAZ_ROOT}/tmp/${RACINE}_cmds_to_run-1-LOGIN.sh"
CMD_SYMPA="${KAZ_ROOT}/tmp/${RACINE}_cmds_to_run-2-SYMPA.sh"
CMD_ORGA="${KAZ_ROOT}/tmp/${RACINE}_cmds_to_run-3-ORGA.sh"
CMD_PROXY="${KAZ_ROOT}/tmp/${RACINE}_cmds_to_run-4-PROXY.sh"
CMD_FIRST="${KAZ_ROOT}/tmp/${RACINE}_cmds_to_run-5-FIRST.sh"
CMD_INIT="${KAZ_ROOT}/tmp/${RACINE}_cmds_to_run-6-INIT.sh"
CMD_PAHEKO="${KAZ_ROOT}/tmp/${RACINE}_cmds_to_run-7-PAHEKO.sh"
CMD_MSG="${KAZ_ROOT}/tmp/${RACINE}_cmds_to_run-8-MSG.sh"
TEMP_PAHEKO="${KAZ_ROOT}/tmp/${RACINE}.TEMP_PHAEKO.cvs"

URL_SITE="${domain}"
URL_WEBMAIL="${webmailHost}.${domain}"
URL_LISTE="${sympaHost}.${domain}"
URL_AGORA="${matterHost}.${domain}"
URL_MDP="${ldapUIHost}.${domain}"
# URL_PAHEKO="kaz-${pahekoHost}.${domain}"
URL_PAHEKO="${httpProto}://${paheko_API_USER}:${paheko_API_PASSWORD}@kaz-paheko.${domain}"

availableProxyComposes=($(getList "${KAZ_CONF_DIR}/container-proxy.list"))

NL_LIST=infos@${domain_sympa}

# indiqué dans le mail d'inscription
# (mail+cloud base+agora : max=3, min=2)
NB_SERVICES_BASE=0
# max : 5, min : 0
NB_SERVICES_DEDIES=0
# note qu'on rajoute dans le mail pour les orgas
MESSAGE_MAIL_ORGA_1=""
MESSAGE_MAIL_ORGA_2=""
MESSAGE_MAIL_ORGA_3=""

############################
# Traitement des arguments #
############################

CREATE_ORGA="true"
SIMULATION=YES

usage () {
    echo "${PRG} [-h] [-s] [-e] [-v] [-u]"
    echo " version 1.0"
    echo "    Create users in kaz world using ${FILE} as source file. All logs in ${LOG}"
    echo "    -h Display this help."
    echo "    -s Simulate. none user created but you can see the result in ${KAZ_ROOT}/tmp/${RACINE}_cmds_to_run-*.sh"
    echo "    -e Execute commands. user or orga will be created !!!"
    echo "    -u create only user (don't create orga)"
    echo "    -v or -V display site informations"
}

for ARG in $*; do
    case "${ARG}" in
	'-h' | '-help' )
	    usage
	    shift
	    exit;;
	-s)
	    shift;;
	-e)
	    SIMULATION=NO
	    shift;;
	-u)
	    # only user => no orga
	    CREATE_ORGA=
	    shift;;
	'-v' | '-V' )
	    echo "${PRG}, root : ${KAZ_ROOT}, on domain : ${URL_SITE}"
	    exit
	    ;;
	*)
	    usage
	    echo "${PRG}: ${RED}unknown parameter${NC}"
	    shift
	    exit;;
    esac
done

##################################
# Inventaire des comptes à créer #
##################################

# la recherche des comptes à créé avec la commande :
# bin/interoPaheko.sh

# création d'un fichier vide
# TODO : même code ici et dans interoPaheko.sh => risque de divergence
if [ ! -s "${FILE}" ];then
    echo "${RED}"
    echo "ERREUR : le fichier ${FILE} n'existait pas"
    echo "Il vient d'être créé. Vous pouvez le compléter."
    echo "${NC}"
    cat > "${FILE}"  <<EOF
# -- fichier de création des comptes KAZ
# --
# -- 1 ligne par compte
# -- champs séparés par ";". les espaces en début et en fin sont enlevés
# -- laisser vide si pas de donnée
# -- pas d'espace dans les variables
# --
# -- ORGA           : nom de l'organisation (max 23 car), vide sinon
# -- ADMIN_ORGA     : O/N indique si le user est admin de l'orga (va le créer comme admin du NC de l'orga et admin de l'équipe agora)
# -- NC_ORGA        : O/N indique si l'orga a demandé un NC
# -- PAHEKO_ORGA  : O/N indique si l'orga a demandé un paheko
# -- WP_ORGA        : O/N indique si l'orga a demandé un wp
# -- AGORA_ORGA     : O/N indique si l'orga a demandé un mattermost
# -- WIKI_ORGA      : O/N indique si l'orga a demandé un wiki
# -- NC_BASE        : O/N indique si le user doit être inscrit dans le NC de base
# -- GROUPE_NC_BASE : soit null soit le groupe dans le NC de base
# -- EQUIPE_AGORA   : soit null soit equipe agora  (max 23 car)
# -- QUOTA          = (1/10/20/...) en GB
# --
# NOM ; PRENOM ; EMAIL_SOUHAITE ; EMAIL_SECOURS ; ORGA ; ADMIN_ORGA ; NC_ORGA ; PAHEKO_ORGA ; WP_ORGA ; AGORA_ORGA ; WIKI_ORGA ; NC_BASE ; GROUPE_NC_BASE ; EQUIPE_AGORA ; QUOTA

# exemple pour un compte découverte :
# loufoque ;   le_mec; loufoque.le-mec@kaz.bzh ; gregomondo@kaz.bzh; ; N; N; N; N; N; N;N;;; 1

# exemple pour un compte asso de l'orga gogol avec le service dédié NC uniquement + une équipe dans l'agora
# loufoque ;   le_mec; loufoque.le-mec@kaz.bzh ; gregomondo@kaz.bzh; gogol ; O; O; N; N; N; N;N;;gogol_team; 10

EOF
    exit
fi
ALL_LINES=$(sed -e "/^[ \t]*#.*$/d" -e "/^[ \t]*$/d" "${FILE}")
if [ -z "${ALL_LINES}" ];then
    usage
    echo "${PRG}: ${RED}nothing to do in ${FILE}${NC}"
    exit
fi

###################
# Initialisations #
###################

# emails et les alias KAZ déjà créés
TFILE_EMAIL="$(mktemp /tmp/${RACINE}.XXXXXXXXX.TFILE_EMAIL)"
# comptes mattermost
TFILE_MM="$(mktemp /tmp/${RACINE}.XXXXXXXXX.TFILE_MM)"
# l'ident NextCloud
TEMP_USER_NC="$(mktemp /tmp/${RACINE}.XXXXXXXXX.TEMP_USER_NC)"
# le groupe NextCloud
TEMP_GROUP_NC="$(mktemp /tmp/${RACINE}.XXXXXXXXX.TEMP_GROUP_NC)"
# l'ident WP
TEMP_USER_WP="$(mktemp /tmp/${RACINE}.XXXXXXXXX.TEMP_USER_WP)"

trap "rm -f '${TFILE_EMAIL}' '${TFILE_MM}' '${TEMP_USER_NC}' '${TEMP_GROUP_NC}' '${TEMP_USER_WP}'" 0 1 2 3 15

for i in "${CMD_LOGIN}" "${CMD_SYMPA}" "${CMD_ORGA}" "${CMD_PROXY}" "${CMD_FIRST}" "${CMD_INIT}" "${CMD_PAHEKO}" "${CMD_MSG}"; do
    echo "#!/bin/bash" > "${i}" && chmod +x "${i}"
done

echo "numero,nom,quota_disque,action_auto" > "${TEMP_PAHEKO}"
echo "curl \"https://${paheko_API_USER}:${paheko_API_PASSWORD}@kaz-paheko.kaz.bzh/api/user/import\" -T \"${TEMP_PAHEKO}\"" >> "${CMD_PAHEKO}"

#echo "récupération des login postfix... "
## on stocke les emails et les alias KAZ déjà créés
#(
#    ${SETUP_MAIL} email list
#    ${SETUP_MAIL} alias list
#) | cut -d ' ' -f 2 | grep @ | sort > "${TFILE_EMAIL}"
# did on supprime le ^M en fin de fichier pour pas faire planter les grep
#dos2unix "${TFILE_EMAIL}"

echo "on récupère tous les emails (secours/alias/kaz) sur le ldap"
FILE_LDIF=/home/sauve/ldap.ldif
/kaz/bin/ldap/ldap_sauve.sh
gunzip ${FILE_LDIF}.gz -f
grep -aEiorh '([[:alnum:]]+([._-][[:alnum:]]+)*@[[:alnum:]]+([._-][[:alnum:]]+)*\.[[:alpha:]]{2,6})' ${FILE_LDIF} | sort -u > ${TFILE_EMAIL}

echo "récupération des login mattermost... "
docker exec -ti mattermostServ bin/mmctl user list --all | grep ":.*(" | cut -d ':' -f 2 | cut -d ' ' -f 2 | sort > "${TFILE_MM}"

dos2unix "${TFILE_MM}"
echo "done"

# se connecter à l'agora pour ensuite pouvoir passer toutes les commandes mmctl
echo "docker exec -ti mattermostServ bin/mmctl auth login ${httpProto}://${URL_AGORA} --name local-server --username ${mattermost_user} --password ${mattermost_pass}" | tee -a "${CMD_INIT}"

# vérif des emails
regex="^(([A-Za-z0-9]+((\.|\-|\_|\+)?[A-Za-z0-9]?)*[A-Za-z0-9]+)|[A-Za-z0-9]+)@(([A-Za-z0-9]+)+((\.|\-|\_)?([A-Za-z0-9]+)+)*)+\.([A-Za-z]{2,})+$"
function validator {
    if ! [[ "$1" =~ ${regex} ]]; then
	# printf "* %-48s \e[1;31m[fail]\e[m\n" "${1}"
	(
	    echo
	    echo "ERREUR : le paramètre ${RED}${BOLD}$1 n'est pas un email valide${NC} - on stoppe tout - aucun utilisateur de créé"
	    echo
	) | tee -a "${LOG}"
	exit 1
    fi
}

######################################
# Boucle lecture des comptes à créer #
######################################
echo -e "$(date '+%Y-%m-%d %H:%M:%S') : ${PRG} - sauvegarde des utilisateurs à créer" | tee "${LOG}"
cat "${FILE}" >> "${LOG}"

LDAP_IP=$(docker inspect -f '{{.NetworkSettings.Networks.ldapNet.IPAddress}}' ldapServ)
ALL_ORGA=

while read ligne; do

    # | xargs permet de faire un trim
    NOM=$(awk -F ";" '{print $1}' <<< "${ligne}" | xargs)
    PRENOM=$(awk -F ";" '{print $2}' <<< "${ligne}" | xargs)

    declare -A tab_email
    tab_email[EMAIL_SOUHAITE]=$(awk -F ";" '{print $3}' <<< "${ligne}" | xargs)
    tab_email[EMAIL_SECOURS]=$(awk -F ";" '{print $4}' <<< "${ligne}" | xargs)

    ORGA=$(awk -F ";" '{print $5}' <<< "${ligne}" | xargs)
    ORGA=${ORGA,,}

    declare -A service
    service[ADMIN_ORGA]=$(awk -F ";" '{print $6}' <<< "${ligne}" | xargs)
    service[NC_ORGA]=$(awk -F ";" '{print $7}' <<< "${ligne}" | xargs)
    service[PAHEKO_ORGA]=$(awk -F ";" '{print $8}' <<< "${ligne}" | xargs)
    service[WP_ORGA]=$(awk -F ";" '{print $9}' <<< "${ligne}" | xargs)
    service[AGORA_ORGA]=$(awk -F ";" '{print $10}' <<< "${ligne}" | xargs)
    service[WIKI_ORGA]=$(awk -F ";" '{print $11}' <<< "${ligne}" | xargs)
    service[NC_BASE]=$(awk -F ";" '{print $12}' <<< "${ligne}" | xargs)

    GROUPE_NC_BASE=$(awk -F ";" '{print $13}' <<< "${ligne}" | xargs)
    GROUPE_NC_BASE="${GROUPE_NC_BASE,,}"
    EQUIPE_AGORA=$(awk -F ";" '{print $14}' <<< "${ligne}" | xargs)
    EQUIPE_AGORA=${EQUIPE_AGORA,,}
    QUOTA=$(awk -F ";" '{print $15}' <<< "${ligne}" | xargs)
    PASSWORD=$(awk -F ";" '{print $16}' <<< "${ligne}" | xargs)

    IDENT_KAZ=$(unaccent utf8 "${PRENOM,,}.${NOM,,}")
    EMAIL_SOUHAITE=${tab_email[EMAIL_SOUHAITE]}
    EMAIL_SECOURS=${tab_email[EMAIL_SECOURS]}

    echo -e "${NL}***************************** traitement de ${ligne}" | tee -a "${LOG}"

    ###########################
    # Vérification des champs #
    ###########################

    for k in "${!tab_email[@]}"; do
	validator "${tab_email[${k}]}"
    done

    # vérif des champs O/N
    for k in "${!service[@]}"; do
	if [ "${service[${k}]}" != "O" -a "${service[${k}]}" != "N" ]; then
	    (
		echo "${RED}"
		echo "${k} : ${service[${k}]}"
		echo "ERREUR : le paramètre ${k} accepte O ou N - on stoppe tout - aucun utilisateur de créé"
		echo "${NC}"
	    ) | tee -a "${LOG}"
	    exit 1
	fi
    done

    # taille ORGA et EQUIPE_AGORA
    TAILLE_MAX="23"
    if [ "${#ORGA}" -gt "${TAILLE_MAX}" ]; then
	(
	    echo "${RED}"
	    echo "ERREUR : le paramètre ORGA est trop grand : ${ORGA} , taille max : ${TAILLE_MAX} - on stoppe tout - aucun utilisateur de créé"
	    echo "${NC}"
	) | tee -a "${LOG}"
	exit 1
    fi
    if [ "${#ORGA}" -gt "0" ]; then
	if [[ "${ORGA}" =~ ^[[:alnum:]-]+$ ]]; then
	    echo "ok"
	else
	    (
		echo "${RED}"
		echo "ERREUR : le paramètre ORGA ne contient pas les caractères autorisés : ${ORGA} - on stoppe tout - aucun utilisateur de créé"
		echo "${NC}"
	    ) | tee -a "${LOG}"
	    exit 1
	fi
    fi

    if [ "${#EQUIPE_AGORA}" -gt "${TAILLE_MAX}" ]; then
	(
	    echo "${RED}"
	    echo "ERREUR : le paramètre EQUIPE_AGORA est trop grand : ${EQUIPE_AGORA} , taille max : ${TAILLE_MAX} - on stoppe tout - aucun utilisateur de créé"
	    echo "${NC}"
	) | tee -a "${LOG}"
	exit 1
    fi

    # vérif quota est entier
    if ! [[ "${QUOTA}" =~ ^[[:digit:]]+$ ]]; then
	(
	    echo
	    echo "ERREUR : ${RED}${BOLD}QUOTA n'est pas numérique : ${QUOTA}${NC} - on stoppe tout - aucun utilisateur de créé"
	) | tee -a "${LOG}"
    fi

    ####################################################
    # cree un mdp acceptable par postfix/nc/mattermost #
    ####################################################
    if [ -z ${PASSWORD} ]; then
      PASSWORD=_`apg -n 1 -m 10 -M NCL -d`_
    fi
    SEND_MSG_CREATE=
    if [ -n "${ORGA}" -a -z "${CREATE_ORGA}" ]; then
	# skeep orga
	continue
    fi

    ####################################################################
    # TODO: Test de l'identKAZ du ldap, il faut l'unicité. si KO, STOP #
    ####################################################################

    ###################################
    # Création du compe de messagerie #
    ###################################
    # le mail existe t-il déjà ?
    if grep -q "^${EMAIL_SOUHAITE}$" "${TFILE_EMAIL}"; then
	echo "${EMAIL_SOUHAITE} existe déjà" | tee -a "${LOG}"
    else
	SEND_MSG_CREATE=true
	echo "${EMAIL_SOUHAITE} n'existe pas" | tee -a "${LOG}"
	echo "${SETUP_MAIL} email add ${EMAIL_SOUHAITE} ${PASSWORD}" | tee -a "${CMD_LOGIN}"
	echo "${SETUP_MAIL} quota set ${EMAIL_SOUHAITE} ${QUOTA}G" | tee -a "${CMD_LOGIN}"
	# LDAP, à tester
	user=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $1}')
	domain=$(echo ${EMAIL_SOUHAITE} | awk -F '@' '{print $2}')
	pass=$(mkpasswd -m sha512crypt ${PASSWORD})
	echo "echo -e '\n\ndn: cn=${EMAIL_SOUHAITE},ou=users,${ldap_root}\n\
changeType: add\n\
objectclass: inetOrgPerson\n\
objectClass: PostfixBookMailAccount\n\
objectClass: nextcloudAccount\n\
objectClass: kaznaute\n\
sn: ${PRENOM} ${NOM}\n\
mail: ${EMAIL_SOUHAITE}\n\
mailEnabled: TRUE\n\
mailGidNumber: 5000\n\
mailHomeDirectory: /var/mail/${domain}/${user}/\n\
mailQuota: ${QUOTA}G\n\
mailStorageDirectory: maildir:/var/mail/${domain}/${user}/\n\
mailUidNumber: 5000\n\
mailDeSecours: ${EMAIL_SECOURS}\n\
identifiantKaz: ${IDENT_KAZ}\n\
quota: ${QUOTA}\n\
nextcloudEnabled: TRUE\n\
nextcloudQuota: ${QUOTA} GB\n\
mobilizonEnabled: TRUE\n\
agoraEnabled: TRUE\n\
userPassword: {CRYPT}${pass}\n\n' | ldapmodify -c -H ldap://${LDAP_IP} -D \"cn=${ldap_LDAP_ADMIN_USERNAME},${ldap_root}\" -x -w ${ldap_LDAP_ADMIN_PASSWORD}" | tee -a "${CMD_LOGIN}"
    fi
#userPassword: {CRYPT}\$6\$${pass}\n\n\" | ldapmodify -c -H ldap://${LDAP_IP} -D \"cn=${ldap_LDAP_CONFIG_ADMIN_USERNAME},${ldap_root}\" -x -w ${ldap_LDAP_CONFIG_ADMIN_PASSWORD}" | tee -a "${CMD_LOGIN}"

    CREATE_ORGA_SERVICES=""

    #############
    # NEXTCLOUD #
    #############
    # on recalcul l'url de NC
    if [ "${ORGA}" != "" -a "${service[NC_ORGA]}" == "O" ]; then
	URL_NC="${ORGA}-${cloudHost}.${domain}"

	# si le cloud de l'orga n'est pas up alors on le créé
	nb=$(docker ps | grep "${ORGA}-${cloudHost}" | wc -l)
	if [ "${nb}" == "0" ];then
	    echo " * +cloud +collabora ${ORGA}"
	    CREATE_ORGA_SERVICES="${CREATE_ORGA_SERVICES} +cloud +collabora"
	    # installe les plugins initiaux dans "/kaz/bin/gestClouds.sh"
	fi

	NB_SERVICES_DEDIES=$((NB_SERVICES_DEDIES+1))

    else
	URL_NC="${cloudHost}.${domain}"
	NB_SERVICES_BASE=$((NB_SERVICES_BASE+1))
    fi

    MESSAGE_MAIL_ORGA_1="${MESSAGE_MAIL_ORGA_1}${NL}* un bureau virtuel pour stocker des fichiers/calendriers/contacts et partager avec vos connaissances : ${httpProto}://${URL_NC}"

    # le user existe t-il déjà sur NC ?
    curl -o "${TEMP_USER_NC}" -X GET -H 'OCS-APIRequest:true' "${httpProto}://admin:${nextcloud_NEXTCLOUD_ADMIN_PASSWORD}@${URL_NC}/ocs/v1.php/cloud/users?search=${IDENT_KAZ}"
    if grep -q "<element>${IDENT_KAZ}</element>" "${TEMP_USER_NC}"; then
	echo "${IDENT_KAZ} existe déjà sur ${URL_NC}" | tee -a "${LOG}"
    else

      # on créé l'utilisateur sur NC sauf si c'est le NC général, on ne créé jamais l'utilisateur7
	  if [ ${URL_NC} != "${cloudHost}.${domain}" ]; then
	
	    echo "curl -X POST -H 'OCS-APIRequest:true' ${httpProto}://admin:${nextcloud_NEXTCLOUD_ADMIN_PASSWORD}@${URL_NC}/ocs/v1.php/cloud/users \
-d userid='${IDENT_KAZ}' \
-d displayName='${PRENOM} ${NOM}' \
-d password='${PASSWORD}' \
-d email='${EMAIL_SOUHAITE}' \
-d quota='${QUOTA}GB' \
-d language='fr' \
" | tee -a "${CMD_INIT}"

      fi

	# s'il est admin de son orga, on le met admin
	if [ "${service[ADMIN_ORGA]}" == "O" -a "${ORGA}" != "" -a "${service[NC_ORGA]}" == "O" ]; then
	    echo "curl -X POST -H 'OCS-APIRequest:true' ${httpProto}://${nextcloud_NEXTCLOUD_ADMIN_USER}:${nextcloud_NEXTCLOUD_ADMIN_PASSWORD}@${URL_NC}/ocs/v1.php/cloud/users/${IDENT_KAZ}/groups -d groupid='admin'" | tee -a "${CMD_INIT}"
	fi

	# faut-il mettre le user NC dans un groupe particulier sur le NC de base ?
	if [ "${GROUPE_NC_BASE}" != "" -a  "${service[NC_BASE]}" == "O" ]; then
	    # le groupe existe t-il déjà ?
	    curl -o "${TEMP_GROUP_NC}" -X GET -H 'OCS-APIRequest:true' "${httpProto}://admin:${nextcloud_NEXTCLOUD_ADMIN_PASSWORD}@${URL_NC}/ocs/v1.php/cloud/groups?search=${GROUPE_NC_BASE}"
	    nb=$(grep "<element>${GROUPE_NC_BASE}</element>" "${TEMP_GROUP_NC}" | wc -l)
	    if [ "${nb}" == "0" ];then
		echo "curl -X POST -H 'OCS-APIRequest:true' ${httpProto}://admin:${nextcloud_NEXTCLOUD_ADMIN_PASSWORD}@${URL_NC}/ocs/v1.php/cloud/groups -d groupid=${GROUPE_NC_BASE}" | tee -a "${CMD_INIT}"
	    fi
	    # puis attacher le user au groupe
	    echo "curl -X POST -H 'OCS-APIRequest:true' ${httpProto}://admin:${nextcloud_NEXTCLOUD_ADMIN_PASSWORD}@${URL_NC}/ocs/v1.php/cloud/users/${IDENT_KAZ}/groups -d groupid=${GROUPE_NC_BASE}" | tee -a "${CMD_INIT}"
	fi
    fi

    #############
    # WORDPRESS #
    #############

    # TODO : pour l'utilisation de l'api : https://www.hostinger.com/tutorials/wordpress-rest-api

    if [ "${ORGA}" != "" -a "${service[WP_ORGA]}" == "O" ]; then

	URL_WP_ORGA="${ORGA}-${wordpressHost}.${domain}"

	# si le wp de l'orga n'est pas up alors on le créé
	nb=$(docker ps | grep "${ORGA}-${wordpressHost}" | wc -l)
	if [ "${nb}" == "0" ];then
	    echo " * +wp ${ORGA}"
	    CREATE_ORGA_SERVICES="${CREATE_ORGA_SERVICES} +wp"
	fi

	NB_SERVICES_DEDIES=$((NB_SERVICES_DEDIES+1))
	MESSAGE_MAIL_ORGA_1="${MESSAGE_MAIL_ORGA_1}${NL}* un site web de type wordpress : ${httpProto}://${URL_WP_ORGA}/wp-admin/"

	# TODO : vérif existance user
	# 			# le user existe t-il déjà sur le wp ?
	# 			curl -o "${TEMP_USER_WP}" -X GET "${httpProto}://${wp_WORDPRESS_ADMIN_USER}:${wp_WORDPRESS_ADMIN_PASSWORD}@${URL_WP_ORGA}/ocs/v1.php/cloud/users?search=${IDENT_KAZ}"
	# 			nb_user_wp_orga=$(grep "<element>${IDENT_KAZ}</element>" "${TEMP_USER_WP}" | wc -l)
	# 			if [ "${nb_user_wp_orga}" != "0" ];then
	# 				(
	# 						echo "${RED}"
	# 						echo "ERREUR : ${IDENT_KAZ} existe déjà sur ${URL_WP_ORGA} - on stoppe tout - aucun utilisateur de créé"
	# 						echo "${NC}"
	# 				) | tee -a "${LOG}"
	#
	# 				# ROLLBACK - on vire le user de NC
	# 				if [ "${nb_user_nc_orga}" != "0" ];then
	# 					(
	# 						echo "${RED}"
	# 						echo "ERREUR : ${IDENT_KAZ} existe déjà sur ${URL_NC} - on stoppe tout - aucun utilisateur de créé"
	# 						echo "${NC}"
	# 					) | tee -a "${LOG}"
	#
	# 					# on supprime l'utilisateur sur NC.
	# 					echo "curl -X DELETE -H 'OCS-APIRequest:true' ${httpProto}://admin:${nextcloud_NEXTCLOUD_ADMIN_PASSWORD}@${URL_NC}/ocs/v1.php/cloud/users \
	    # 					-d userid='${IDENT_KAZ}' \
	    # 					" | tee -a "${CMD_INIT}"
	# 				fi
	#
	# 				exit 1
	# 			fi

	# TODO : créer le user et le mettre admin si nécessaire
	# 			if [ "${service[ADMIN_ORGA]}" == "O" ]; then
	# 				:
	# 			else
	# 				:
	# 			fi
    fi

    ############
    # PAHEKO #
    ############


    if [ "${ORGA}" != "" -a "${service[PAHEKO_ORGA]}" == "O" ]; then

	URL_PAHEKO_ORGA="${ORGA}-${pahekoHost}.${domain}"

	# il n'y a pas de docker spécifique paheko (je cree toujours paheko)
	echo " * +paheko ${ORGA}"
	CREATE_ORGA_SERVICES="${CREATE_ORGA_SERVICES} +paheko"

	NB_SERVICES_DEDIES=$((NB_SERVICES_DEDIES+1))
	MESSAGE_MAIL_ORGA_1="${MESSAGE_MAIL_ORGA_1}${NL}* un service de gestion adhérents/clients : ${httpProto}://${URL_PAHEKO_ORGA}"

	if [ "${service[ADMIN_ORGA]}" == "O" ]; then
	    MESSAGE_MAIL_ORGA_1="${MESSAGE_MAIL_ORGA_1} (l'installation est à terminer en vous rendant sur le site)"
	fi
    fi


    ############
    # DOKUWIKI #
    ############

    if [ "${ORGA}" != "" -a "${service[WIKI_ORGA]}" == "O" ]; then

	URL_WIKI_ORGA="${ORGA}-${dokuwikiHost}.${domain}"

	# si le wiki de l'orga n'est pas up alors on le créé
	nb=$(docker ps | grep "${ORGA}-${dokuwikiHost}" | wc -l)
	if [ "${nb}" == "0" ];then
	    echo " * +wiki ${ORGA}"
	    CREATE_ORGA_SERVICES="${CREATE_ORGA_SERVICES} +wiki"
	fi

	NB_SERVICES_DEDIES=$((NB_SERVICES_DEDIES+1))
	MESSAGE_MAIL_ORGA_1="${MESSAGE_MAIL_ORGA_1}${NL}* un wiki dédié pour votre documentation : ${httpProto}://${URL_WIKI_ORGA}"


	# TODO : ??? à voir https://www.dokuwiki.org/devel:xmlrpc:clients

	if grep -q "^${IDENT_KAZ}:" "${DOCK_VOL}/orga_${ORGA}-wikiConf/_data/users.auth.php" 2>/dev/null; then
	    echo "${IDENT_KAZ} existe déjà sur ${URL_WIKI_ORGA}" | tee -a "${LOG}"
	else
	    echo "echo \"${IDENT_KAZ}:$(htpasswd -bnBC 10 "" ${PASSWORD}):${PRENOM} ${NOM}:${EMAIL_SOUHAITE}:admin,user\" >> \"${DOCK_VOL}/orga_${ORGA}-wikiConf/_data/users.auth.php\"" | tee -a "${CMD_INIT}"
	fi
    fi

    ##############
    # MATTERMOST #
    ##############

    # on ne gère pas la création du docker dédié mattermost
    if [ "${ORGA}" != "" -a "${service[AGORA_ORGA]}" == "O" ]; then
	echo "# ******************************************************************************" | tee -a "${CMD_INIT}"
	echo "# **************************** ATTENTION ***************************************" | tee -a "${CMD_INIT}"
	echo "# ******************************************************************************" | tee -a "${CMD_INIT}"
	echo "# Mattermost dédié : on ne fait rien." | tee -a "${CMD_INIT}"
	echo "# ******************************************************************************" | tee -a "${CMD_INIT}"
    fi

    if grep -q "^${IDENT_KAZ}$" "${TFILE_MM}" 2>/dev/null; then
	echo "${IDENT_KAZ} existe déjà sur mattermost" | tee -a "${LOG}"
    else
	# on créé le compte mattermost
	echo "docker exec -ti mattermostServ bin/mmctl user create --email ${EMAIL_SOUHAITE} --username ${IDENT_KAZ} --password ${PASSWORD}" | tee -a "${CMD_LOGIN}"
	# et enfin on ajoute toujours le user à l'équipe KAZ et aux 2 channels publiques
	echo "docker exec -ti mattermostServ bin/mmctl team users add kaz ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
	echo "docker exec -ti mattermostServ bin/mmctl channel users add kaz:une-question--un-soucis ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
	echo "docker exec -ti mattermostServ bin/mmctl channel users add kaz:cafe-du-commerce--ouvert-2424h ${EMAIL_SOUHAITE}" | tee -a "${CMD_LOGIN}"
	NB_SERVICES_BASE=$((NB_SERVICES_BASE+1))
    fi

    if [ "${EQUIPE_AGORA}" != "" -a "${EQUIPE_AGORA}" != "kaz" ]; then
	# l'équipe existe t-elle déjà ?
	nb=$(docker exec mattermostServ bin/mmctl team list | grep -w "${EQUIPE_AGORA}" | wc -l)
	if [ "${nb}" == "0" ];then # non, on la créé en mettant le user en admin de l'équipe
	    echo "docker exec -ti mattermostServ bin/mmctl team create --name ${EQUIPE_AGORA} --display_name ${EQUIPE_AGORA} --email ${EMAIL_SOUHAITE}" --private | tee -a "${CMD_INIT}"
	fi
	# puis ajouter le user à l'équipe
	echo "docker exec -ti mattermostServ bin/mmctl team users add ${EQUIPE_AGORA} ${EMAIL_SOUHAITE}" | tee -a "${CMD_INIT}"
    fi

    if [ -n "${CREATE_ORGA_SERVICES}" ]; then
	SEND_MSG_CREATE=true
	echo "${CREATE_ORGA_CMD}" --create ${CREATE_ORGA_SERVICES} "${ORGA}" | tee -a "${CMD_ORGA}"
	echo "${CREATE_ORGA_CMD}" --init ${CREATE_ORGA_SERVICES} "${ORGA}" | tee -a "${CMD_FIRST}"
	ALL_ORGA="${ALL_ORGA} ${ORGA}"
    fi

    ##########################
    # Inscription newsletter #
    ##########################

    # TODO : utiliser liste sur dev également

    # on inscrit le user sur sympa, à la liste infos@${domain_sympa}
    # docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=https://listes.kaz.sns/sympasoap --trusted_application=SOAP_USER --trusted_application_password=SOAP_PASSWORD --proxy_vars="USER_EMAIL=contact1@kaz.sns" --service=which
    if [[ "${mode}" = "dev" ]]; then
	echo "# DEV, on teste l'inscription à sympa"| tee -a "${CMD_SYMPA}"
	LISTMASTER=$(echo ${sympa_LISTMASTERS} | cut -d',' -f1)
	echo "docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${sympa_SOAP_USER} --trusted_application_password=${sympa_SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\""  | tee -a "${CMD_SYMPA}"
    else
	echo "# PROD, on inscrit à sympa"| tee -a "${CMD_SYMPA}"
	LISTMASTER=$(echo ${sympa_LISTMASTERS} | cut -d',' -f1)
	echo "docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${sympa_SOAP_USER} --trusted_application_password=${sympa_SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SOUHAITE}\""  | tee -a "${CMD_SYMPA}"
	echo "docker exec -ti sympaServ /usr/lib/sympa/bin/sympa_soap_client.pl --soap_url=${httpProto}://${URL_LISTE}/sympasoap --trusted_application=${sympa_SOAP_USER} --trusted_application_password=${sympa_SOAP_PASSWORD} --proxy_vars=\"USER_EMAIL=${LISTMASTER}\" --service=add --service_parameters=\"${NL_LIST},${EMAIL_SECOURS}\""  | tee -a "${CMD_SYMPA}"
    fi

    if [ "${service[ADMIN_ORGA]}" == "O" ]; then
	MESSAGE_MAIL_ORGA_2="${MESSAGE_MAIL_ORGA_2}Comme administrateur de votre organisation, vous pouvez créer des listes de diffusion en vous rendant sur ${httpProto}://${URL_LISTE}"
    fi

    ###################
    # update paheko #
    ###################

    # TODO : problème si 2 comptes partagent le même email souhaité (cela ne devrait pas arriver)
    curl -s "https://${paheko_API_USER}:${paheko_API_PASSWORD}@kaz-paheko.kaz.bzh/api/sql" -d "SELECT numero,nom,quota_disque from users WHERE email='${EMAIL_SOUHAITE}'" | jq '.results[] | .numero,.nom,.quota_disque ' | tr \\n ',' | sed 's/,$/,Aucune\n/' >> "${TEMP_PAHEKO}"

    ####################
    # Inscription MAIL #
    ####################

    if [ "${NB_SERVICES_DEDIES}" != "0" ];then
	MESSAGE_MAIL_ORGA_1="${NL}	dont ${NB_SERVICES_DEDIES} service(s) dédié(s) pour votre organisation:${NL}	${MESSAGE_MAIL_ORGA_1}"
    fi

    if [ -z "${SEND_MSG_CREATE}" ]; then
	# rien de créé => pas de message
	continue
    fi

	#si admin alors msg pour indiquer qu'il faut nous renvoyer ce qu'il souhaite comme service.
	if [ "${service[ADMIN_ORGA]}" == "O" ]; then
		MESSAGE_MAIL_ORGA_3="${MESSAGE_MAIL_ORGA_3}En tant qu'association/famille/société. Vous avez la possibilité d'ouvrir, quand vous le voulez, des services kaz, il vous suffit de nous le demander.

Pourquoi n'ouvrons-nous pas tous les services tout de suite ? parce que nous aimons la sobriété et que nous préservons notre espace disque ;) 
A quoi sert d'avoir un site web si on ne l'utilise pas, n'est-ce pas ? 

Par retour de mail, dites-nous de quoi vous avez besoin tout de suite entre:
* une comptabilité : un service de gestion adhérents/clients 
* un site web de type WordPress
* un cloud : bureau virtuel pour stocker des fichiers/calendriers/contacts et partager avec vos connaissances

Une fois que vous aurez répondu à ce mail, votre demande sera traitée manuellement.
"
	fi

    # on envoie le mail de bienvenue
    MAIL_KAZ="Bonjour,

Bienvenue chez KAZ!

Vous disposez de $((${NB_SERVICES_BASE} + ${NB_SERVICES_DEDIES})) services kaz avec authentification :

* une messagerie classique : ${httpProto}://${URL_WEBMAIL}
* une messagerie instantanée pour discuter au sein d'équipes : ${httpProto}://${URL_AGORA} 

Votre email et identifiant pour tous ces services : ${EMAIL_SOUHAITE}
Le mot de passe : ${PASSWORD}

Pour changer votre mot de passe de messagerie, c'est ici: ${httpProto}://${URL_MDP}
Si vous avez perdu votre mot de passe, c'est ici: ${httpProto}://${URL_MDP}/?action=sendtoken

Vous pouvez accéder à votre messagerie :
* soit depuis votre webmail : ${httpProto}://${URL_WEBMAIL}
* soit depuis votre bureau virtuel : ${httpProto}://${URL_NC}
* soit depuis un client de messagerie comme thunderbird

${MESSAGE_MAIL_ORGA_3}

Vous avez quelques docs intéressantes sur le wiki de kaz:

* Migrer son site internet wordpress vers kaz
https://wiki.kaz.bzh/wordpress/start#migrer_son_site_wordpress_vers_kaz

* Migrer sa messagerie vers kaz
https://wiki.kaz.bzh/messagerie/gmail/start

* Démarrer simplement avec son cloud
https://wiki.kaz.bzh/nextcloud/start

Votre quota est de ${QUOTA}GB. Si vous souhaitez plus de place pour vos fichiers ou la messagerie, faites-nous signe !

Pour accéder à la messagerie instantanée et communiquer avec les membres de votre équipe ou ceux de kaz : ${httpProto}://${URL_AGORA}/login

${MESSAGE_MAIL_ORGA_2}

Enfin, vous disposez de tous les autres services KAZ où l'authentification n'est pas nécessaire : ${httpProto}://${URL_SITE}

En cas de soucis, n'hésitez pas à poser vos questions sur le canal 'Une question ? un soucis' de l'agora dispo ici : ${httpProto}://${URL_AGORA}

Si vous avez besoin d'accompagnement pour votre site, votre cloud, votre compta, votre migration de messagerie,... nous proposons des formations mensuelles gratuites. Si vous souhaitez être accompagné par un professionnel, nous pouvons vous donner une liste de pros, référencés par KAZ.

À bientôt ;)

La collégiale de KAZ. "

    echo "docker exec -i mailServ mailx -a 'Content-Type: text/plain; charset=\"UTF-8\"' -r contact@kaz.bzh -s \"KAZ: confirmation d'inscription\" ${EMAIL_SOUHAITE} ${EMAIL_SECOURS} << EOF
${MAIL_KAZ}
EOF" | tee -a "${CMD_MSG}"

    # on envoie le mail de confirmation d'inscription à contact
    MAIL_KAZ="*****POST AUTOMATIQUE******
Hello,
${NOM} ${PRENOM} vient d'être inscrit avec l'email ${EMAIL_SOUHAITE}
quota             : ${QUOTA}GB

NC_BASE           : ${service[NC_BASE]}
groupe NC base    : ${GROUPE_NC_BASE}
équipe agora base : ${EQUIPE_AGORA}
email de secours  : ${EMAIL_SECOURS}

ORGA              : ${ORGA}
ADMIN_ORGA        : ${service[ADMIN_ORGA]}
NC_ORGA           : ${service[NC_ORGA]}
PAHEKO_ORGA       : ${service[PAHEKO_ORGA]}
WP_ORGA           : ${service[WP_ORGA]}
AGORA_ORGA        : ${service[AGORA_ORGA]}
WIKI_ORGA         : ${service[WIKI_ORGA]}

bisou!"
    echo "docker exec -i mailServ mailx -a 'Content-Type: text/plain; charset=\"UTF-8\"' -r contact@kaz.bzh -s \"KAZ: confirmation d'inscription\" ${EMAIL_CONTACT} << EOF
${MAIL_KAZ}
EOF" | tee -a "${CMD_MSG}"

    echo " # on envoie la confirmation d'inscription sur l'agora " | tee -a "${CMD_MSG}"
    echo "docker exec -ti mattermostServ bin/mmctl post create kaz:Creation-Comptes --message \"${MAIL_KAZ}\"" | tee -a "${CMD_MSG}"

    # fin des inscriptions
done <<< "${ALL_LINES}"

if [[ -n "${ALL_ORGA}" ]]; then
    echo "sleep 2" | tee -a "${CMD_PROXY}"
    echo "${KAZ_BIN_DIR}/container.sh start ${ALL_ORGA}" | tee -a "${CMD_PROXY}"
	for item in "${availableProxyComposes[@]}"; do
    	echo "cd \"${KAZ_COMP_DIR}/${item}/\"; ./proxy-gen.sh; docker-compose up -d; ./reload.sh " | tee -a "${CMD_PROXY}"
    done
fi

###########################
# Lancement des commandes #
###########################
if [ "${SIMULATION}" == "NO" ]; then
    echo "on exécute"
    "${CMD_LOGIN}"
    # on attend qques secondes que le mail soit bien créé avant de continuer (prob de lecture de la BAL : à investiguer)
    # je rallonge à 20s car je vois que le docker sympa ne connait pas toujours l'email kaz créé
    echo "on attend 20s pour que la création des emails soit certaine"
    sleep 20
    "${CMD_SYMPA}"
    "${CMD_ORGA}"
    "${CMD_PROXY}"
    "${CMD_FIRST}"
    "${CMD_INIT}"
    "${CMD_PAHEKO}"
    "${CMD_MSG}"
else
    echo "Aucune commande n'a été lancée : Possibilité de le faire à la main. cf ${KAZ_ROOT}/tmp/${RACINE}_cmds_to_run-*.sh"
fi

# END