#!/bin/bash

# Утилита для обновления DNS и NTP серверов на клиентской машине домена

source astra-domain-functions

# BT-82842
shopt -s expand_aliases
alias GETTEXT="gettext ${0##*/}"

set_log() {
  LOG_FILE=/var/log/$(basename $0).log
  date >> $LOG_FILE
}

usage() {
echo $(GETTEXT "Утилита для актуализации настроек DNS и NTP серверов на клиентской машине домена")
printf $(GETTEXT "Использование: %s <ключ>\n") $(basename $0)
echo "  $(GETTEXT "Ключи:")"
echo "    -h, --help   $(GETTEXT "показать эту справку и выйти")"
echo "    -i, --info   $(GETTEXT "вывести инофрмацию о текущих настройках")"
echo "    -n, --dns    $(GETTEXT "актуализировать DNS сервера")"
echo "    -t, --ntp    $(GETTEXT "актуализировать NTP сервера")"
echo "    -a, --all    $(GETTEXT "актуализировать и NTP и DNS серевера")"
}

get_domain() {
#===============================================================================
# Получить имя подлкюченного домена
# Входные данные:  нет
# Выходные данные: глобальная переменная DOMAIN
#===============================================================================

  DOMAIN=$(domainname --domain)
  if [[ -z ${DOMAIN} ]]; then
    echo $(GETTEXT "домен не найден")
    exit 1
  else
    echo $(GETTEXT "обнаружен домен:") ${DOMAIN}
  fi
}

show_ntp() {
#===============================================================================
# Отобразить серверы точного времени, заданные в текущих настройки NTP
# Входные данные: нет
# Выходные данные: отображение на экран и 
# Network Manager
#===============================================================================

  echo $(GETTEXT "текущие настройки NTP:")
  find_timedaemon
  case $NTPD in
  chrony)
    #grep -qe "^server" /etc/chrony/chrony.conf | awk '{print $2}'
    chronyc sources
    ;;
  ntp)
    grep -qe "^server" /etc/ntp.conf | awk '{print $2}'
    ;;
  systemd-timesyncd)
    #grep -qe "^NTP=" /usr/lib/systemd/timesyncd.conf.d/astra-domain-client.conf
    timedatectl timesync-status | grep -q Server | awk '{print $2,$3}'
    ;;
  ntpsec)
    grep -qe "^server" /etc/ntpsec/ntp.conf | awk '{print $2}'
    ;;
  * ) echo "$(GETTEXT "Ошибка! Неизвестная служба точного времени") \'$NTPD\'"
    return 1
    ;;
esac
}

get_count_conn() {
#===============================================================================
# Получить кол-во активных соединений Network Manager
# Входные данные: нет
# Выходные данные: код возврата -- кол-во позиций списка активных соеднений 
# Network Manager
#===============================================================================
  local IFS=$'\n' 
  conn_lst=$(nmcli --terse connection show --active)
  counter=0
  for i in ${conn_lst[@]}; do
    counter=$(($counter+1))
  done
  return $counter
}

select_conn() {
#================================================================================
#   Выбор пользователем соединения из списка активных соединений Network Manager
# Входные данные: введеный пользователем номер строки в списке соединений
# Выходные данные: код возврата -- номер соединения по списку, или 125, если 
#   введенный пользователем номер выходит за пределы списка
#================================================================================
  local IFS=$'\n' 
  conn=$(nmcli connection show --active)
  i=N
  #  Вывод на экран пронумерованного списка активных соединений NetworkManager
  for str in ${conn[@]}; do
    echo " $i" $str
    i=$(($i+1))
  done

  read -p "Выберите номер сетевого интерфейса, с которого осуществляется подключение к домену:" conn_number
  if [ $conn_number -ge $i ] || [ $conn_number -le 0 ]; then 
    printf $(GETTEXT "Выбран неверный номер сетевого подключения <должен быть в пределах 1-%d>") $i
    return 125
  fi
  return $conn_number
}

get_dbuspath_num() {
#================================================================================
# Получение номера DBUS-PATH сетевого соединения по заданному пользователем 
#   порядковому номеру в списке вывода на экран
# Входные параметры:
#   $1 - номер по списку сетевого соединения при выводе на экран
# Выходные парамерты:
#   Код возврата - номер DBUS-PATH сетевого соединения
#================================================================================
  counter=0
  for i in $(nmcli --terse --fields DBUS-PATH connection show --active); do
    counter=$((counter+1))
    if [ "$counter" -eq "$1" ]; then
      echo $(GETTEXT "выбран") $i
      return $(basename $i)
    fi 
  done
}

update_ntp() {
#================================================================================
# Обновить настройки NTPсерверов
# Входные параметры:
#   Глобальная переменная $DOMAIN
# Выходные данные: вывод на экран результа
#================================================================================
  set_ntp ${DOMAIN}
}

show_dns() {
#================================================================================
# Отобразить текущие настройки DNS серверов
# Входные параметры:
#   $1 - номер подключения Network Manager (не обязательный). В случае если он
# не задан, выводятся настроенные DNS сервера всхех активных подключений.
# Выходные данные: вывод на экран результа
#================================================================================
  echo $(GETTEXT "текущие настройки DNS:")
  if [[ -n $1 ]]; then
    nmcli --fields ip4.dns connection show path $1
  else
    conn_lst=$(nmcli --terse --fields DBUS-PATH connection show --active)
    for i in ${conn_lst[@]}; do 
      nmcli --fields ip4.dns connection show path $(basename $i); 
    done
  fi
}

update_dns() {
#================================================================================
# Обновить настроки DNS серверов
# Входные параметры:
#   глобальная переменная $DOMAIN
# Выходные данные: код возврата 0 в случае успеха, 1 - в случае неуспеха
#                  вывод на экран результа
#================================================================================  
  dns_srv=$(host -t NS ${DOMAIN} | awk '{print $4}')
  if [[ "$info" == *found* ]]; then
    printf $(GETTEXT "Домен %s не найден") ${DOMAIN}
    exit 1
  fi
  if [[ ${#dns_srv} == 0 ]]; then
    echo "$(GETTEXT "DNS-серверы не найдены")
    exit 1
  else
    echo "$(GETTEXT "найденные DNS-серверы:")
    for srv in ${dns_srv[@]}; do
      echo " $srv"
      srv_ip="$(host $srv | awk '{print $4}')"
      ##echo "=$srv_ip="
      all_srv_ip="${all_srv_ip}${srv_ip},"
    done
  fi
  ##echo ${all_srv_ip%,}

  get_count_conn
  count_conn=$?
  if [[ $count_conn -eq 1 ]]; then 
    echo $(GETTEXT "Обнаружено только одно сетевое подключение, которое и будет настроено")
  else
    echo $(GETTEXT "Обнаружено несколько сетевых подключений")
    select_conn
    conn_num=$?
    if [[ $conn_num -eq 125 ]]; then
      exit 1
    fi
  fi
  get_dbuspath_num $conn_num
  path_num=$?
  #echo $path_num
  nmcli connection modify path $path_num ipv4.dns ${all_srv_ip%,} >> $LOG_FILE
  if [[ "$?" == "0" ]]; then
    nmcli connection reload 
    #nmcli connection up path $path
    echo $(GETTEXT "были настроены следующие DNS серверы:")
    #nmcli --fields ip4.dns connection show path $path_num
    show_dns $path_num
  else
    echo $(GETTEXT "возникли проблемы настройки заданных DNS-серверов")
    echo $(GETTEXT "Подробности в") $LOG_FILE
    return 1
  fi
}

# ----------

if [ -z "$1" ] ; then
  usage
  exit 1
fi

if [[ -z "$(which nmcli)" ]]; then
  echo $(GETTEXT "Ошибка! В системе не найдена команда nmcli")
  exit 1
fi

while [ -n "$1" ]
do
  case "$1" in
    -h | --help) usage; exit 0;;
    -i | --info) set_log; show_dns; show_ntp ;;
    -n | --dns) set_log; get_domain; update_dns ;;
    -t | --ntp) set_log; get_domain; update_ntp ;;
    -a | --all) set_log; get_domain; update_ntp; update_dns ;;
    *) usage; exit 1;;
  esac
  shift
done


