#!/bin/bash

. /etc/eole/samba4-vars.conf

TIMEOUT=120
SLEEP_TIME=10
MAX_ATTEMPT=`expr $TIMEOUT / $SLEEP_TIME`

if [ "$1" = "instance" ] && ([ "${AD_ADDITIONAL_DC}" = 'oui' ] || [ "${AD_SERVER_ROLE}" = 'membre' ])
then
    attempt=0
    is_sync=false
    wanted_peer=false

    while ! $is_sync # on attend la synchronisation avec une sortie (break) si le nombre de tentatives est épuisé
    do
        for assid in $(ntpq -c "as" | sed -e '1,3d' -e 's/\s\+/ /g' -e 's/^\s\+//' | cut -f2 -d ' ')
        do
            for ntp_server in $NTP_SERVERS # liste des serveurs NTP avec lesquels on veut être synchronisé
            do
                if ! [[ ${ntp_server} =~ ^(([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])$ ]]
                then
                    ntp_server_ips="$(host $ntp_server | awk '/has address/ {print $4}')"
                else
                    ntp_server_ips="$ntp_server"
                fi
                for ntp_server_ip in $ntp_server_ips
                do
                    # le serveur NTP est déclaré avec une IP, on récupère les informations de ntp sans résolution de nom
                    sync_data=$(ntpq -n -c "rv $assid reach srcadr offset" | awk -v pat="$ntp_server_ip" '$0~pat {print $0}')
                    if [ -n "${sync_data}" ] # le service ntp a retourné des informations pour ce pair donné
                    then
                        break
                    fi
                done
                if [ -n "${sync_data}" ] # le service ntp a retourné des informations pour ce pair donné
                then
                    wanted_peer=true
                    srcadr=$(echo $sync_data | sed  's/.*srcadr=\([a-zA-Z0-9.]\+\)\(,.*\)\?$/\1/')
                    reach=$(echo $sync_data | sed  's/.*reach=\([0-9]\+\).*/\1/')
                    offset=$(echo $sync_data | sed  -e 's/.*offset=\(-\?[0-9]\+\(\.[0-9]\+\)\?\).*/\1/')
                    if [ "${reach}" = "177" ] || [ "${reach}" = "377" ] # le service NTP atteste la synchronisation
                    then
                        is_sync=true
                        echo "Horloge synchronisée sur ${srcadr} (avec un offset de ${offset}s)"
                    elif [ "${reach}" -gt 0 ] && [ "$(echo ${offset#-} | sed 's/\.//')" -lt "300000" ] # le service NTP n’atteste pas la synchronisation mais le serveur de référence est joignable et l’offset est en deça de la limite admise pour les échanges kerberos (5 minutes exprimées en millisecondes)
                    then
                        is_sync=true
                        echo "Horloge synchronisée sur ${srcadr} (avec un offset non attesté de ${offset}s)"
                    fi
                fi
            done
        done
        if ! $is_sync
        then
            if [ $attempt -lt $MAX_ATTEMPT ] # si on n’a pas épuisé le nombre de tentatives permises, on boucle après avoir affiché, une fois, qu’on attend la synchronisation
            then
                if [ $attempt -eq 0 ]
                then
                    echo -n "En attente de synchronisation "
                else
                    echo -n "."
                fi
                attempt=`expr $attempt + 1`
                sleep $SLEEP_TIME
            else
                echo
                echo "Délai d'attente dépassé"
                break
            echo
            fi
        fi
    done

    if $is_sync
    then
        exit 0
    elif $wanted_peer
    then
        . /usr/lib/eole/diagnose.sh
        echo "Diagnostique de la configuration NTP :"
        TestNTP "$(CreoleGet serveur_ntp)"
        EchoRouge "Impossible de synchroniser l'horloge du serveur"
        exit 1
    else
        . /usr/lib/eole/ihm.sh
        EchoRouge "Le serveur NTP local ne se met pas à l'heure sur les serveurs NTP configurés"
        exit 1
    fi
else
    exit 0
fi
