10305a095e
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
40 lines
3.4 KiB
Bash
Executable File
40 lines
3.4 KiB
Bash
Executable File
#!/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
|