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:
1 parent
1963b6a117
commit
898db1098d
5 files changed
+131
-66
No files matched your search
+43
-25
@@ -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
|
||||
|
||||
|
||||
Reference in new issue
Block a user