#!/bin/bash

# Vérifier si le serveur est concerné:
# - de type contrôleur de domaine
# - propriétaire du rôle SchemaMaster
# - un niveau de fonctionnalité est explicitement demandé

REF_FILE="/etc/eole/addc/ad_functional_levels.json"

if [ ! "$(CreoleGet ad_use_custom_functional_level non)" = "oui" ]
then
    exit 0
fi

if [ "$(CreoleGet ad_server_role none)" = "controleur de domaine" ]
then
    self=$(CreoleGet nom_machine)
elif [ "$(CreoleGet ad_local non)" = "oui" ]
then
    self=$(CreoleGet ad_server)
else
    exit 0
fi

SchemaMasterRole_owner=$(CreoleRun "samba-tool fsmo show" addc | sed '/SchemaMasterRole owner:/!d;s/SchemaMasterRole owner: CN=NTDS Settings,CN=\(.*\),CN=Servers.*/\1/')

if [ ! "${self^^}" = "${SchemaMasterRole_owner}" ]
then
    echo "Le serveur ne possède pas le rôle de maître du schéma d’annuaire. Pas de montée de niveau de fonctionnalité effectuée."
    exit 0
fi

# Vérifier si on dispose du fichier de référence
if [ ! -e "$REF_FILE" ]
then
    echo "Fichier de référence des niveaux de fonctionnalité absent. Pas de montée de niveau automatique possible."
    exit 0
fi

# Récupérer les informations de version
unset function_levels
declare -A function_levels
while IFS== read -r key value; do
    function_levels["$key"]="$value"
done <<< $(CreoleRun "samba-tool domain level show -q" addc | sed -E '/^(Forest|Domain)(.*)(2003|2008|2008 R2|2012|2012 R2|2016)/!d;s/^(Forest|Domain)(.*)(2003|2008|2008 R2|2012|2012 R2|2016)/\1=\3/;s/ /_/')

if [[ -z "${function_levels[Domain]}" ]]
then
    echo "Niveau de fonctionnalité courant non disponible. Pas de mise à jour effectuée."
    exit 0
fi

# Vérifier que le niveau demandé est bien supérieur au niveau courant

cible=$(CreoleGet ad_custom_functional_level)
code_cible=$(jq -r --arg jq_cible "$cible" '.versions | map(select(.winname == $jq_cible)) | first | .sambacode' "$REF_FILE")

index_courant=$(cat "$REF_FILE" | jq -r --arg jq_cible "${function_levels[Domain]}" '.versions | map(.sambacode == $jq_cible) | index(true)' )
index_cible=$(cat "$REF_FILE" | jq -r --arg jq_cible "${code_cible}" '.versions | map(.sambacode == $jq_cible) | index(true)' )

if [ $index_cible -le $index_courant ]
then
    echo "Le niveau fonctionnel courant est au moins aussi récent que le niveau demandé. Pas de mise à jour effectuée."
    exit 0
fi

CreoleRun "samba-tool domain functionalprep --function-level=$code_cible" addc
CreoleRun "samba-tool domain level raise --domain-level=$code_cible --forest-level=$code_cible" addc
CreoleRun "systemctl restart samba-ad-dc" addc

# Récupérer les informations de version pour validation
unset function_levels
declare -A function_levels
while IFS== read -r key value; do
    function_levels["$key"]="$value"
done <<< $(CreoleRun "samba-tool domain level show -q" addc | sed -E '/^(Forest|Domain)(.*)(2003|2008|2008 R2|2012|2012 R2|2016)/!d;s/^(Forest|Domain)(.*)(2003|2008|2008 R2|2012|2012 R2|2016)/\1=\3/;s/ /_/')

if [ ! "${function_levels[Domain]}" = "$code_cible" ]
then
    echo "Niveau de fonctionnalité courant différent du niveau cible. Problème à la montée de version."
    exit 0
fi

# Mettre à jour la version courante dans le fichier de référence pour utilisation par l’application de configuration du module
cat <<< $(jq --arg  jq_cible "$code_cible" '.active = $jq_cible' "$REF_FILE") > "$REF_FILE"

exit 0
