#!/bin/sh

# Setup /etc/resolv.conf for netboot devices,
# and then setup /etc/puavo from DNS.
#
# The following settings are queried and set under /etc/puavo:
#
# /etc/puavo/domain
# /etc/puavo/hostname
# /etc/puavo/kerberos/master
# /etc/puavo/kerberos/realm
# /etc/puavo/kerberos/slave
# /etc/puavo/kerberos/toprealm
# /etc/puavo/ldap/base
# /etc/puavo/ldap/master
# /etc/puavo/ldap/slave
# /etc/puavo/topdomain

set -eu

# Point /etc/resolv.conf to resolvconf-generated resolv.conf.
# For netboot devices this is overridden later in this script.
# For hosts with puavo-vpn /usr/lib/puavo-vpn-client/dnsmasq-wrapper
# overrides these.
ln -fns /run/resolvconf/resolv.conf /etc/resolv.conf

# Setup /etc/resolv.conf and /etc/puavo only for netboot devices
# (we have booted from NBD-server).
test -e /run/puavo/nbd-server || exit 0

query_dns() {
  if ! query_dns_answer=$(host -R 3 -W 5 "$@") \
    || [ -z "$query_dns_answer" ]; then
      echo "Error in setup_etc_puavo_from_dns with DNS lookup $@" >&2
      return 1
  fi

  echo "$query_dns_answer"
}

query_srv() {
  query_dns -t SRV "$@" \
    | awk '
        BEGIN { status = 1 }
        $2 == "has" && $3 == "SRV" && $4 == "record" {
          sub(/\.$/, "", $8)
          printf "%s\n", $8
          status = 0
        }
        END { exit(status) }
      '
}

query_txt() {
  query_dns -t TXT "$@" \
    | awk '
        BEGIN { status = 1 }
        $2 == "descriptive" && $3 == "text" {
          sub(/^"/, "", $4)
          sub(/"$/, "", $4)
          print $4
          status = 0
        }
        END { exit(status) }
      '
  query_txt_answer=$(query_dns -t TXT "$@")
}

nbd_server=$(cat /run/puavo/nbd-server)

puavo_domain=$(query_txt _puavo $nbd_server)
puavo_topdomain=${puavo_domain#*.}

rm -f /etc/resolv.conf          # remove in case this is a symbolic link
cat <<EOF > /etc/resolv.conf
# Generated by /etc/puavo-conf/scripts/setup_resolv_conf_and_etc_puavo
search ltsp.${puavo_domain}
nameserver ${nbd_server}
EOF

ldap_base=$(query_txt "_ldap_base.${puavo_domain}")
ldap_slave=$(query_srv "_ldap._tcp.${puavo_domain}")
ldap_master=$(query_srv "_ldap_master._tcp.${puavo_domain}")

kerberos_realm=$(query_txt "_kerberos.${puavo_domain}")
kerberos_master=$(query_srv "_kerberos-master._tcp.${kerberos_realm}")
kerberos_slave=$(query_srv "_kerberos._tcp.${kerberos_realm}")
kerberos_toprealm=$(query_txt "_kerberos.${puavo_topdomain}")

hostname_short="$(hostname -s)"

mkdir -p /etc/puavo /etc/puavo/kerberos /etc/puavo/ldap

printf "%s\n" "$puavo_domain"      > /etc/puavo/domain
printf "%s\n" "$hostname_short"    > /etc/puavo/hostname
printf "%s\n" "$kerberos_master"   > /etc/puavo/kerberos/master
printf "%s\n" "$kerberos_realm"    > /etc/puavo/kerberos/realm
printf "%s\n" "$kerberos_slave"    > /etc/puavo/kerberos/slave
printf "%s\n" "$kerberos_toprealm" > /etc/puavo/kerberos/toprealm
printf "%s\n" "$ldap_base"         > /etc/puavo/ldap/base
printf "%s\n" "$ldap_master"       > /etc/puavo/ldap/master
printf "%s\n" "$ldap_slave"        > /etc/puavo/ldap/slave
printf "%s\n" "$puavo_topdomain"   > /etc/puavo/topdomain

exit 0
