#!/usr/bin/env bash

# ============================================================
# SMR-SRV-OT-SHARE
# Регистрация интерфейсных DNS-имён многосетевого сервера
# в авторитетном BIND9 через RFC 2136 / nsupdate.
#
# Каждый сетевой интерфейс получает отдельное FQDN:
#
#   Legacy        -> smr-srv-ot-share.legacy.ot-samara.baltika.ru
#   Pivo          -> smr-srv-ot-share.pivo.ot-samara.baltika.ru
#   Rozliv        -> smr-srv-ot-share.rozliv.ot-samara.baltika.ru
#   Utilities     -> smr-srv-ot-share.utilities.ot-samara.baltika.ru
#   ASTUE         -> smr-srv-ot-share.astue.ot-samara.baltika.ru
#
# Обычные одноинтерфейсные узлы продолжают использовать
# общую зону:
#
#   <hostname>.ot-samara.baltika.ru
#
# BIND разрешает DDNS только от проектных OT-сетей,
# поэтому перед UPDATE проверяем, что обращение к DNS
# действительно будет выполнено с ожидаемого source IP.
# ============================================================

set -euo pipefail

TTL=3600
ZONE="ot-samara.baltika.ru."

register_dns()
{
    local iface="$1"
    local ip="$2"
    local dns="$3"
    local fqdn="$4"
    local ptr="$5"

    echo
    echo "============================================================"
    echo "Interface : $iface"
    echo "IP        : $ip"
    echo "DNS       : $dns"
    echo "FQDN      : $fqdn"
    echo "============================================================"

    # Проверяем, что ожидаемый IP действительно назначен интерфейсу.
    if ! ip -4 addr show dev "$iface" | grep -qw "$ip"; then
        echo "ERROR: IP $ip отсутствует на интерфейсе $iface"
        return 1
    fi

    # Проверяем выбор исходного адреса до DNS.
    route_info="$(ip route get "$dns" | head -n1)"

    echo "Route     : $route_info"

    if ! grep -qw "src $ip" <<< "$route_info"; then
        echo "ERROR: запрос к $dns пойдёт не с source IP $ip"
        return 1
    fi

    # --------------------------------------------------------
    # A-запись
    # --------------------------------------------------------
    nsupdate <<EOF
server $dns
zone $ZONE
update delete $fqdn A
update add $fqdn $TTL A $ip
send
EOF

    # --------------------------------------------------------
    # PTR-запись
    # --------------------------------------------------------
    nsupdate <<EOF
server $dns
update delete $ptr PTR
update add $ptr $TTL PTR $fqdn
send
EOF

    # --------------------------------------------------------
    # Контроль A
    # --------------------------------------------------------
    result_a="$(dig +short +norecurse @"$dns" "$fqdn" A | head -n1)"

    if [[ "$result_a" != "$ip" ]]; then
        echo "ERROR: A verification failed: '$result_a'"
        return 1
    fi

    # --------------------------------------------------------
    # Контроль PTR
    # --------------------------------------------------------
    result_ptr="$(dig +short +norecurse @"$dns" -x "$ip" | head -n1)"

    if [[ "$result_ptr" != "$fqdn" ]]; then
        echo "ERROR: PTR verification failed: '$result_ptr'"
        return 1
    fi

    echo "OK: A   $fqdn -> $ip"
    echo "OK: PTR $ip -> $fqdn"
}


# Legacy OT / VLAN 1
register_dns \
    "ens23" \
    "10.255.0.229" \
    "10.255.0.53" \
    "smr-srv-ot-share.legacy.ot-samara.baltika.ru." \
    "229.0.255.10.in-addr.arpa."


# Пивопроизводство.
# Пока 172.16.66.229 находится на ens23.
# После миграции VLAN2030 здесь нужно будет заменить ens23 на ens21.
register_dns \
    "ens23" \
    "172.16.66.229" \
    "172.16.66.53" \
    "smr-srv-ot-share.pivo.ot-samara.baltika.ru." \
    "229.66.16.172.in-addr.arpa."


# Розлив / VLAN2002
register_dns \
    "ens20" \
    "172.16.68.229" \
    "172.16.68.53" \
    "smr-srv-ot-share.rozliv.ot-samara.baltika.ru." \
    "229.68.16.172.in-addr.arpa."


# Утилиты / VLAN2040
register_dns \
    "ens22" \
    "172.16.70.229" \
    "172.16.70.53" \
    "smr-srv-ot-share.utilities.ot-samara.baltika.ru." \
    "229.70.16.172.in-addr.arpa."


# АСТУЭ / VLAN2006
register_dns \
    "enp2s1" \
    "172.17.14.229" \
    "172.17.14.53" \
    "smr-srv-ot-share.astue.ot-samara.baltika.ru." \
    "229.14.17.172.in-addr.arpa."


echo
echo "============================================================"
echo "OT DDNS registration completed successfully."
echo "============================================================"
