#!/bin/bash
# bj-network — постоянный адрес сервера bj (на консоли сервера, под sudo). Ubuntu (netplan): спрашивает
# адрес, шлюз и DNS и применяет через «netplan try» — если связь пропала и подтверждения нет 120 секунд,
# прежние настройки возвращаются сами. Запускается и при первой загрузке с образа (bj-firstboot).
set -u
[ "$(id -u)" = 0 ] || { echo "запустите через sudo: sudo bj-network"; exit 1; }
command -v netplan >/dev/null || { echo "netplan не найден: на этой системе сеть настраивается её средствами (/etc/network/interfaces)."; exit 1; }
IF=$(ip -4 route show default 2>/dev/null | awk '{print $5; exit}')
[ -n "$IF" ] || IF=$(ip -o link show | awk -F': ' '$2!="lo"{print $2; exit}')
CUR=$(ip -4 -o addr show dev "$IF" scope global 2>/dev/null | awk '{print $4; exit}')
GW=$(ip -4 route show default 2>/dev/null | awk '{print $3; exit}')
DNS=$(resolvectl dns "$IF" 2>/dev/null | sed 's/.*: *//' | tr ' ' ',' )
printf '\n  Сеть сервера: интерфейс %s, адрес %s, шлюз %s, DNS %s\n' "$IF" "${CUR:-нет}" "${GW:-нет}" "${DNS:-нет}"
printf '  Постоянный адрес нужен, чтобы адрес bj не менялся (DHCP может выдать другой).\n\n'
ask() { local v; read -r -p "  $1 [$2]: " v; printf '%s' "${v:-$2}"; }
ADDR=$(ask "Адрес с маской (например 10.10.10.30/24)" "${CUR:-}")
[[ "$ADDR" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}/[0-9]{1,2}$ ]] || { echo "  адрес — вида 10.10.10.30/24"; exit 1; }
GW2=$(ask "Шлюз" "${GW:-}")
[[ "$GW2" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]] || { echo "  шлюз — вида 10.10.10.1"; exit 1; }
DNS2=$(ask "DNS через запятую" "${DNS:-$GW2}")
F=/etc/netplan/60-bj-static.yaml
[ -f "$F" ] && cp -a "$F" "$F.bak"
{
  printf 'network:\n  version: 2\n  ethernets:\n    %s:\n      dhcp4: false\n      addresses: [%s]\n      routes:\n        - to: default\n          via: %s\n      nameservers:\n        addresses: [%s]\n' "$IF" "$ADDR" "$GW2" "$DNS2"
} > "$F"
chmod 600 "$F"
# прежние файлы с DHCP для этого интерфейса — выключаем, чтобы не было двух адресов
for f in /etc/netplan/*.yaml; do [ "$f" = "$F" ] && continue; grep -q "$IF" "$f" 2>/dev/null && mv "$f" "$f.disabled-by-bj"; done
# на Ubuntu с образа сетью управляет cloud-init: без запрета при перезагрузке он может вернуть DHCP
CI=/etc/cloud/cloud.cfg.d/99-bj-disable-network-config.cfg
[ -d /etc/cloud/cloud.cfg.d ] && printf 'network: {config: disabled}\n' > "$CI"
echo "  Применяю. Если связь пропадёт — через 120 секунд вернутся прежние настройки."
if netplan try --timeout 120; then
  echo "  ✓ Адрес ${ADDR%/*} закреплён. Веб-вход: https://${ADDR%/*}:8443/"
  [ -x /usr/local/sbin/bj-welcome ] && /usr/local/sbin/bj-welcome
else
  for f in /etc/netplan/*.disabled-by-bj; do [ -f "$f" ] && mv "$f" "${f%.disabled-by-bj}"; done
  rm -f "$F" "$CI"; netplan apply; echo "  Настройки не приняты — оставлен прежний адрес."
fi
