Add proxy/VPN/telegram launchd and emergency runbooks; reorganize apps docs; document JA3 CrossOver runbook and Wine troubleshooting; add GOG/HoMM game scripts, disk cleanup guides, and gitea push-via-proxy helper. Ignore temp/. Co-authored-by: Cursor <cursoragent@cursor.com>
153 lines
4.8 KiB
Bash
Executable File
153 lines
4.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# JA3 из GOG offline backup: setup_*.exe + setup_*-1.bin … -4.bin в одной папке.
|
||
# Galaxy не нужен. Установщик читает .bin рядом с .exe (не копируем 15 GB в bottle).
|
||
set -euo pipefail
|
||
GOG_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
# shellcheck source=config.sh
|
||
source "${GOG_DIR}/config.sh"
|
||
|
||
JA3_GAMES_DIR="${JA3_GAMES_DIR:-${HOME}/Games}"
|
||
JA3_SETUP_EXE="${JA3_SETUP_EXE:-}"
|
||
LOG="/tmp/ja3-multipart-install-${BOTTLE_NAME}.log"
|
||
|
||
# Имена GOG v1.5.2 (80730); при другой версии задайте JA3_SETUP_EXE.
|
||
JA3_EXE_DEFAULT="${JA3_GAMES_DIR}/setup_jagged_alliance_3_1.5.2_(80730).exe"
|
||
JA3_BINS=(
|
||
"${JA3_GAMES_DIR}/setup_jagged_alliance_3_1.5.2_(80730)-1.bin"
|
||
"${JA3_GAMES_DIR}/setup_jagged_alliance_3_1.5.2_(80730)-2.bin"
|
||
"${JA3_GAMES_DIR}/setup_jagged_alliance_3_1.5.2_(80730)-3.bin"
|
||
"${JA3_GAMES_DIR}/setup_jagged_alliance_3_1.5.2_(80730)-4.bin"
|
||
)
|
||
|
||
gog_unix_to_win() {
|
||
local u="$1"
|
||
if [[ -x "${WINEPATH_BIN}" ]]; then
|
||
"${WINEPATH_BIN}" -w "${u}"
|
||
else
|
||
# fallback: Z: = /
|
||
local rest="${u#/}"
|
||
echo "Z:\\\\${rest//\//\\\\}"
|
||
fi
|
||
}
|
||
|
||
find_setup_exe() {
|
||
if [[ -n "${JA3_SETUP_EXE}" && -f "${JA3_SETUP_EXE}" ]]; then
|
||
echo "${JA3_SETUP_EXE}"
|
||
return 0
|
||
fi
|
||
if [[ -f "${JA3_EXE_DEFAULT}" ]]; then
|
||
echo "${JA3_EXE_DEFAULT}"
|
||
return 0
|
||
fi
|
||
local f
|
||
f="$(find "${JA3_GAMES_DIR}" -maxdepth 1 -iname 'setup*jagged*alliance*3*.exe' -print -quit 2>/dev/null || true)"
|
||
[[ -n "${f}" && -f "${f}" ]] && echo "${f}" && return 0
|
||
return 1
|
||
}
|
||
|
||
usage() {
|
||
cat <<EOF
|
||
Использование: bash $0
|
||
|
||
Папка с архивами (по умолчанию): ${JA3_GAMES_DIR}
|
||
|
||
Нужны 5 файлов в одной папке:
|
||
setup_jagged_alliance_3_1.5.2_(80730).exe (~1 MB, лаунчер Inno)
|
||
setup_jagged_alliance_3_1.5.2_(80730)-1.bin … -4.bin
|
||
|
||
Скачать недостающий .exe: https://www.gog.com/account → JA3 → offline backup (первая, ~1 MB часть).
|
||
|
||
Или:
|
||
lgogdownloader --login
|
||
bash ${GOG_DIR}/fetch-ja3-setup-exe.sh
|
||
|
||
Переменные: JA3_GAMES_DIR, JA3_SETUP_EXE
|
||
EOF
|
||
}
|
||
|
||
verify_parts() {
|
||
local exe="$1"
|
||
local missing=0
|
||
local b
|
||
|
||
if [[ ! -d "${JA3_GAMES_DIR}" ]]; then
|
||
echo "❌ Нет каталога: ${JA3_GAMES_DIR}"
|
||
return 1
|
||
fi
|
||
|
||
for b in "${JA3_BINS[@]}"; do
|
||
if [[ ! -f "${b}" ]]; then
|
||
echo "❌ Нет: ${b}"
|
||
missing=1
|
||
fi
|
||
done
|
||
|
||
if [[ ! -f "${exe}" ]]; then
|
||
echo "❌ Нет лаунчера .exe (~1 MB) в ${JA3_GAMES_DIR}"
|
||
echo " У вас есть 4× .bin — без .exe установка GOG не стартует."
|
||
echo " Скачайте с account.gog.com первую часть offline backup (installer0, ~1 MB)."
|
||
echo " Или: bash ${GOG_DIR}/fetch-ja3-setup-exe.sh"
|
||
missing=1
|
||
fi
|
||
|
||
[[ "${missing}" -eq 0 ]]
|
||
}
|
||
|
||
main() {
|
||
local exe win_exe
|
||
exe="$(find_setup_exe)" || exe=""
|
||
|
||
if ! verify_parts "${exe}"; then
|
||
echo ""
|
||
usage
|
||
exit 1
|
||
fi
|
||
|
||
bash "${GOG_DIR}/emergency-stop.sh" || true
|
||
gog_swap_guard "${GOG_SWAP_MAX_MB:-400}" || exit 1
|
||
# bins (~15 GB) + распаковка в bottle (~16 GB) — пик ~25–30 GB на Data
|
||
gog_disk_guard "${JA3_MIN_DISK_GB:-25}" || {
|
||
echo "❌ Мало места: нужно ≥25 GB свободно на Data (архивы + игра в bottle)."
|
||
echo " Сейчас: $(df -h "$(gog_data_volume_path)" | awk 'NR==2 {print $4 " свободно, " $5 " занято"}')"
|
||
exit 1
|
||
}
|
||
|
||
export_wine_env_gog
|
||
gog_wine_check
|
||
|
||
win_exe="$(gog_unix_to_win "${exe}")"
|
||
SILENT=(/VERYSILENT /SUPPRESSMSGBOXES /NORESTART)
|
||
|
||
echo "Установка JA3 из multipart (без Galaxy)"
|
||
echo " Папка: ${JA3_GAMES_DIR}"
|
||
echo " Wine: ${win_exe}"
|
||
echo " Лог: ${LOG}"
|
||
: >"${LOG}"
|
||
|
||
# Inno ищет .bin в каталоге установщика — запуск из JA3_GAMES_DIR
|
||
cd "${JA3_GAMES_DIR}"
|
||
if ! "${WINE64}" "${win_exe}" "${SILENT[@]}" >>"${LOG}" 2>&1; then
|
||
echo "⚠️ Wine-Inno не прошёл — пробуем innoextract (без botva2/gdi32)…"
|
||
if command -v innoextract >/dev/null 2>&1; then
|
||
exec bash "${GOG_DIR}/install-ja3-innoextract.sh"
|
||
fi
|
||
echo "❌ Установщик завершился с ошибкой:"
|
||
strings "${LOG}" 2>/dev/null | tail -20 || tail -20 "${LOG}"
|
||
exit 1
|
||
fi
|
||
|
||
if [[ -f "${BOTTLE_DIR}/drive_c/GOG Games/Jagged Alliance 3/JA3.exe" ]]; then
|
||
date -u +"%Y-%m-%dT%H:%M:%SZ" >"${BOTTLE_DIR}/.ja3_installed"
|
||
echo ""
|
||
echo "OK: JA3 установлен."
|
||
echo " Запуск: bash ${GOG_DIR}/run-ja3.sh"
|
||
echo " После проверки игры можно удалить .bin в ${JA3_GAMES_DIR} (~15 GB)."
|
||
else
|
||
echo "⚠️ JA3.exe не найден в bottle — tail лога:"
|
||
tail -40 "${LOG}"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
main "$@"
|