114 lines
3.7 KiB
Bash
Executable File
114 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# install-galaxy.sh — Download, sign, and install Galaxy.app on macOS.
|
|
#
|
|
# Usage:
|
|
# curl -fsSL https://mng-web-sharing.mini-games.tv/wst-data/ryan-share/galaxy/install-galaxy.sh | bash
|
|
# — or —
|
|
# ./script/install-galaxy.sh
|
|
#
|
|
#
|
|
|
|
set -euo pipefail
|
|
|
|
DOWNLOAD_URL="https://mng-web-sharing.mini-games.tv/wst-data/ryan-share/galaxy/Galaxy.zip"
|
|
APP_NAME="Galaxy.app"
|
|
PROCESS_NAME="galaxy-oss"
|
|
INSTALL_DIR="/Applications"
|
|
|
|
# ---------- helpers ----------
|
|
info() { printf "\033[1;34m==>\033[0m %s\n" "$1"; }
|
|
warn() { printf "\033[1;33m==> WARNING:\033[0m %s\n" "$1"; }
|
|
fail() { printf "\033[1;31m==> ERROR:\033[0m %s\n" "$1"; exit 1; }
|
|
|
|
USE_SUDO=false
|
|
run_install_command() {
|
|
if [[ "$USE_SUDO" == true ]]; then
|
|
/usr/bin/sudo "$@"
|
|
else
|
|
"$@"
|
|
fi
|
|
}
|
|
|
|
if [[ "$(uname -s)" != "Darwin" ]]; then
|
|
fail "This installer only supports macOS."
|
|
fi
|
|
|
|
# ---------- 1. Download ----------
|
|
TMP_DIR=$(mktemp -d)
|
|
trap 'rm -rf "$TMP_DIR"' EXIT
|
|
|
|
info "Downloading Galaxy.zip..."
|
|
curl -fSL -o "$TMP_DIR/Galaxy.zip" "$DOWNLOAD_URL" || fail "Failed to download Galaxy.zip"
|
|
|
|
# ---------- 2. Extract ----------
|
|
info "Extracting Galaxy.app..."
|
|
unzip -q "$TMP_DIR/Galaxy.zip" -d "$TMP_DIR" || fail "Failed to extract Galaxy.zip"
|
|
|
|
# Remove macOS zip artifacts that cause "unsealed contents" errors during signing
|
|
rm -rf "$TMP_DIR/__MACOSX"
|
|
find "$TMP_DIR/$APP_NAME" -name '.DS_Store' -delete 2>/dev/null || true
|
|
find "$TMP_DIR/$APP_NAME" -name '._*' -delete 2>/dev/null || true
|
|
|
|
if [[ ! -d "$TMP_DIR/$APP_NAME" ]]; then
|
|
fail "$APP_NAME not found after extraction."
|
|
fi
|
|
|
|
# ---------- 3. Clear quarantine & ad-hoc sign ----------
|
|
info "Clearing quarantine attributes..."
|
|
/usr/bin/xattr -cr "$TMP_DIR/$APP_NAME" || fail "Failed to clear quarantine attributes."
|
|
|
|
info "Applying an ad-hoc code signature..."
|
|
/usr/bin/codesign --force --deep --sign - "$TMP_DIR/$APP_NAME" || fail "Code signing failed."
|
|
|
|
info "Verifying the code signature..."
|
|
/usr/bin/codesign --verify --deep --strict --verbose=2 "$TMP_DIR/$APP_NAME" ||
|
|
fail "Code signature verification failed."
|
|
|
|
# ---------- 4. Kill, remove, install, launch ----------
|
|
info "Stopping any running Galaxy processes..."
|
|
pkill -x "$PROCESS_NAME" 2>/dev/null && sleep 1 || true
|
|
pkill -9 -x "$PROCESS_NAME" 2>/dev/null || true
|
|
|
|
INSTALLED_APP="$INSTALL_DIR/$APP_NAME"
|
|
STAGED_APP="$INSTALL_DIR/.$APP_NAME.new"
|
|
|
|
if [[ ! -w "$INSTALL_DIR" ]] ||
|
|
[[ -e "$INSTALLED_APP" && ! -w "$INSTALLED_APP" ]] ||
|
|
[[ -e "$STAGED_APP" && ! -w "$STAGED_APP" ]]; then
|
|
info "Administrator permission is required to update $INSTALL_DIR."
|
|
/usr/bin/sudo -v || fail "Administrator authentication failed."
|
|
USE_SUDO=true
|
|
fi
|
|
|
|
info "Staging $APP_NAME in $INSTALL_DIR..."
|
|
run_install_command /bin/rm -rf "$STAGED_APP"
|
|
run_install_command /bin/cp -R "$TMP_DIR/$APP_NAME" "$STAGED_APP" ||
|
|
fail "Failed to copy $APP_NAME to $INSTALL_DIR."
|
|
|
|
/usr/bin/codesign --verify --deep --strict --verbose=2 "$STAGED_APP" ||
|
|
fail "Installed application signature verification failed."
|
|
|
|
if [[ -d "$INSTALLED_APP" ]]; then
|
|
info "Removing existing $INSTALLED_APP..."
|
|
run_install_command /bin/rm -rf "$INSTALLED_APP"
|
|
fi
|
|
|
|
info "Installing $APP_NAME to $INSTALL_DIR..."
|
|
run_install_command /bin/mv "$STAGED_APP" "$INSTALLED_APP" || fail "Failed to install $APP_NAME."
|
|
|
|
info "Launching Galaxy..."
|
|
/usr/bin/open "$INSTALLED_APP" || fail "macOS failed to launch Galaxy."
|
|
|
|
for _ in {1..50}; do
|
|
if pgrep -x "$PROCESS_NAME" >/dev/null; then
|
|
sleep 2
|
|
pgrep -x "$PROCESS_NAME" >/dev/null || fail "Galaxy exited immediately after launch."
|
|
info "Done! Galaxy is running."
|
|
exit 0
|
|
fi
|
|
sleep 0.1
|
|
done
|
|
|
|
fail "Galaxy did not start. Run $INSTALLED_APP/Contents/MacOS/$PROCESS_NAME to see the launch error."
|