#!/bin/bash

MODE="all"

usage() {
    echo "Usage: $0 [OPTION]"
    echo
    echo "Options:"
    echo "  all        Affiche tous les domaines (défaut)"
    echo "  ok         Affiche uniquement les domaines OK"
    echo "  ko         Affiche uniquement les domaines KO"
    echo "  dns        Affiche uniquement les domaines sans DNS"
    echo "  -h, --help Affiche cette aide"
    echo
    exit 0
}

case "$1" in
    ok|ko|dns|all)
        MODE="$1"
        ;;
    -h|--help)
        usage
        ;;
    "")
        MODE="all"
        ;;
    *)
        echo "Option invalide: $1"
        usage
        ;;
esac

SERVER_IP=$(hostname -I | awk '{print $1}')

if [ -z "$SERVER_IP" ]; then
    echo "Erreur : impossible de récupérer l'IP locale"
    exit 1
fi

echo "IP locale du serveur : $SERVER_IP"
echo "Mode : $MODE"
echo

resolve_all_ips() {
    local domain=$1

    local ips=$(dig +short A "$domain")

    if [ -z "$ips" ]; then
        local cname=$(dig +short CNAME "$domain")
        if [ -n "$cname" ]; then
            ips=$(dig +short A "$cname")
        fi
    fi

    echo "$ips"
}

should_print() {
    local status=$1

    case "$MODE" in
        all) return 0 ;;
        ok)  [ "$status" = "OK" ] ;;
        ko)  [ "$status" = "KO" ] ;;
        dns) [ "$status" = "DNS" ] ;;
    esac
}

apache2ctl -S 2>/dev/null | \
grep "namevhost" | \
awk '{print $4}' | \
sort -u | while read domain
do
    IPS=$(resolve_all_ips "$domain")

    if [ -z "$IPS" ]; then
        STATUS="DNS"
        DISPLAY="aucune"
    else
        MATCH="NO"

        for ip in $IPS; do
            if [ "$ip" = "$SERVER_IP" ]; then
                MATCH="YES"
                break
            fi
        done

        if [ "$MATCH" = "YES" ]; then
            STATUS="OK"
        else
            STATUS="KO"
        fi

        DISPLAY="$IPS"
    fi

    if should_print "$STATUS"; then
        printf "[%-8s] %-40s -> %s\n" "$STATUS" "$domain" "$DISPLAY"
    fi
done
