refactor(wsl): унифицирована логика hproxy.local и добавлена миграция legacy boot command

- Зачем:
  - setup-hproxy.sh удалял запись из hosts до проверки gateway — при ошибке hosts ломался.
  - update_hproxy() дублировала логику скрипта с багами и не тестировалась.
  - legacy inline boot command в wsl.conf не мигрировался автоматически.
- Что:
  - setup-hproxy.sh: безопасный порядок (gateway → hosts), set -e, экранированная точка в sed.
  - update_hproxy() заменена на thin wrapper с проверкой wsl.conf и ошибок sudo.
  - install.sh: интерактивная замена legacy boot command, детекция существующих [boot] command,
    принимает русскую «у» наравне с «y».
  - README.md: описаны три сценария (WSL NAT, WSL mirrored — host-side resolution, native Linux).
  - добавлены тесты: existing boot command preserved, legacy command migration hint.
- Проверка:
  - bash tests/test_install.sh
  - ./install.sh (интерактивно, ответить «y» на миграцию legacy command)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
ddadminandClaude Opus 4.6 committed 2026-03-22 19:42:50 +03:00
1 parent 1963b6a117
commit 898db1098d
5 files changed
+131 -66

No files matched your search

+43 -25
View File
@@ -115,6 +115,15 @@ is_interactive() {
esac
}
wsl_conf_has_boot_command() {
awk '
/^\[boot\]$/ { in_boot=1; next }
/^\[/ { in_boot=0 }
in_boot && /^[[:space:]]*command[[:space:]]*=/ { found=1 }
END { exit !found }
' "$1" 2>/dev/null
}
# --- Проверка stow ---
if ! command -v "$STOW_BIN" &>/dev/null; then
error "stow не найден. Установите: sudo apt install stow"
@@ -241,40 +250,49 @@ fi
if [ -n "${WSL_DISTRO_NAME:-}" ]; then
HPROXY_SCRIPT="$DOTFILES_DIR/scripts/setup-hproxy.sh"
WSL_BOOT_COMMAND="command = \"$HPROXY_SCRIPT\""
LEGACY_WSL_BOOT_COMMAND="command = \"ip route show default | awk '{print \$3 \\\" hproxy.local\\\"}' >> /etc/hosts\""
if grep -Fq "$WSL_BOOT_COMMAND" "$WSL_CONF_PATH" 2>/dev/null; then
warn "/etc/wsl.conf уже содержит boot command для setup-hproxy.sh, пропускаю"
elif ! is_interactive; then
warn "WSL обнаружен, но stdin не интерактивный. Пропускаю настройку /etc/wsl.conf"
info "Добавьте вручную: $WSL_BOOT_COMMAND"
else
if awk '
/^\[boot\]$/ { in_boot=1; next }
/^\[/ { in_boot=0 }
in_boot && /^[[:space:]]*command[[:space:]]*=/ { found=1 }
END { exit !found }
' "$WSL_CONF_PATH" 2>/dev/null; then
warn "/etc/wsl.conf уже содержит [boot] command. Добавьте setup-hproxy.sh вручную"
info "Нужная строка: $WSL_BOOT_COMMAND"
else
echo ""
info "Обнаружен WSL. Скрипт $HPROXY_SCRIPT может автоматически"
info "прописывать hproxy.local в /etc/hosts при каждом старте WSL (NAT mode)."
echo -ne "${YELLOW}[?]${NC} Добавить boot command в /etc/wsl.conf? [y/N] "
elif grep -Fq "$LEGACY_WSL_BOOT_COMMAND" "$WSL_CONF_PATH" 2>/dev/null; then
warn "/etc/wsl.conf содержит legacy boot command для hproxy.local"
info "Рекомендуется заменить на: $WSL_BOOT_COMMAND"
if is_interactive; then
echo -ne "${YELLOW}[?]${NC} Заменить legacy command на setup-hproxy.sh? [y/N] "
answer=""
if ! read -r answer; then
answer=""
fi
if [[ "$answer" =~ ^[Yy]$ ]]; then
# Добавляем [boot] секцию, если её нет
if ! grep -q '^\[boot\]' "$WSL_CONF_PATH" 2>/dev/null; then
printf '\n[boot]\n' | "$SUDO_BIN" tee -a "$WSL_CONF_PATH" > /dev/null
fi
if [[ "$answer" =~ ^[YyУу]$ ]]; then
"$SUDO_BIN" sed -i '/ip route.*hproxy\.local/d' "$WSL_CONF_PATH"
"$SUDO_BIN" sed -i "/^\[boot\]/a command = \"$HPROXY_SCRIPT\"" "$WSL_CONF_PATH"
info "Добавлено в /etc/wsl.conf. Перезапустите WSL: wsl --shutdown"
else
warn "Пропущено. Можно настроить вручную — см. README.md"
info "Заменено. Перезапустите WSL: wsl --shutdown"
fi
fi
elif wsl_conf_has_boot_command "$WSL_CONF_PATH"; then
warn "/etc/wsl.conf уже содержит [boot] command. Добавьте setup-hproxy.sh вручную"
info "Нужная строка: $WSL_BOOT_COMMAND"
elif ! is_interactive; then
warn "WSL обнаружен, но stdin не интерактивный. Пропускаю настройку /etc/wsl.conf"
info "Добавьте вручную: $WSL_BOOT_COMMAND"
else
echo ""
info "Обнаружен WSL. Скрипт $HPROXY_SCRIPT может автоматически"
info "прописывать hproxy.local в /etc/hosts при каждом старте WSL (NAT mode)."
echo -ne "${YELLOW}[?]${NC} Добавить boot command в /etc/wsl.conf? [y/N] "
answer=""
if ! read -r answer; then
answer=""
fi
if [[ "$answer" =~ ^[YyУу]$ ]]; then
# Добавляем [boot] секцию, если её нет
if ! grep -q '^\[boot\]' "$WSL_CONF_PATH" 2>/dev/null; then
printf '\n[boot]\n' | "$SUDO_BIN" tee -a "$WSL_CONF_PATH" > /dev/null
fi
"$SUDO_BIN" sed -i "/^\[boot\]/a command = \"$HPROXY_SCRIPT\"" "$WSL_CONF_PATH"
info "Добавлено в /etc/wsl.conf. Перезапустите WSL: wsl --shutdown"
else
warn "Пропущено. Можно настроить вручную — см. README.md"
fi
fi
fi