#!/bin/bash

# shellcheck disable=SC1091
. "$(CreoleGet container_path_domaine)/etc/eole/samba4-vars.conf"

if [ "$1" != "instance" ]
then
    exit 0
fi
 
if [ "${AD_ADDITIONAL_DC}" = 'oui' ] || [ "${AD_SERVER_ROLE}" = 'membre' ]
then
    TIMEOUT=120
    SLEEP_TIME=10
    MAX_ATTEMPT=$(( TIMEOUT / SLEEP_TIME ))

    attempt=0
    is_sync=1
    wanted_peer=false

    # récupére la liste des IP des Server NTP (avec résolution si besoin)
    PATTERN_IPV4="(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
    # le DC de référence doit être en premier !
    NTP_SERVERS_IP="${AD_ADDITIONAL_DC_IP// }\n"
    for ntp_server in $NTP_SERVERS
    do
        if ! [[ "${ntp_server}" =~ ^${PATTERN_IPV4}$ ]]
        then
            ntp_server_ips=$(dig @"$AD_REALM" +short "$ntp_server")
        else
            ntp_server_ips="$ntp_server"
        fi
        NTP_SERVERS_IP="${NTP_SERVERS_IP}${ntp_server_ips}\n"
    done
    
    # on attend la synchronisation avec une sortie (break) si le nombre de tentatives est épuisé
    while [ $is_sync -ne 0 ] 
    do
        synced_on=$(chronyc -n sources | sed '/^\^\*/!d;s/\^\*\s\+\([0-9.]\+\)\s\+[0-9]\s\+[0-9]\s\+\([0-9]\+\).*/\1 \2/')
        if [ -n "$synced_on" ]
        then
            sync_source=${synced_on% *}
            reach=${synced_on/* }
            if [[ "$reach" = "377" ]]
            then
                if [ $attempt -ne 0 ]
                then
                    echo
                fi
                is_sync=0
                if [[ "$NTP_SERVERS_IP" =~ $sync_source ]]
                then
                    echo "Horloge synchronisée sur ${sync_source}"
                    exit 0
                else
                    . /usr/lib/eole/ihm.sh
                    EchoRouge "Le serveur NTP local ne se met pas à l'heure sur les serveurs NTP configurés ($synced_on)"
                    exit 1
                fi
            fi
        fi
        # si on n’a pas épuisé le nombre de tentatives permises, on boucle après avoir affiché, une fois, qu’on attend la synchronisation
        if [ $attempt -lt $MAX_ATTEMPT ] 
        then
            if [ $attempt -eq 0 ]
            then
                echo -n "En attente de synchronisation "
                # on accélère la procédure de synchronisation
                chronyc makestep >/dev/null 2>&1
                for i in $(seq 7)
                do
                    chronyc burst 1/2 >/dev/null 2>&1
                    sleep 1
                done
                echo -n "."
            else
                echo -n "."
            fi
            attempt=$(( attempt + 1))
            sleep $SLEEP_TIME
        else
            echo
            echo "Délai d'attente dépassé"
            exit 1
        fi
    done
fi
