#!/bin/sh # FireResolve — installazione e aggiornamento da Terminale (macOS) # # curl -fsSL https://fireresolve.netforge.it/install.sh | sh # # Scarica l'ultima versione, ne verifica l'impronta SHA-256 e la installa in # /Applications (o ~/Applications se /Applications non è scrivibile). I file # scaricati con curl non ricevono il segno di quarantena di macOS, quindi # FireResolve si apre senza il blocco di Gatekeeper. Rilanciarlo = aggiornare. # # Solo per prove: FIRERESOLVE_BASE (URL dei download; http solo su 127.0.0.1/localhost) # e FIRERESOLVE_DEST (cartella). # # Tutto è dentro main(), chiamata all'ultima riga: se il download di questo # script si interrompe a metà, sh non esegue nulla. set -eu main() { base="${FIRERESOLVE_BASE:-https://fireresolve.netforge.it/downloads}" # solo https, anche per i redirect; http soltanto se chi prova lo chiede esplicitamente case "$base" in https://*) proto='=https' ;; http://127.0.0.1*|http://localhost*) proto='=https,http' ;; *) printf '%s\n' "FireResolve: FIRERESOLVE_BASE must be https" >&2; exit 1 ;; esac case "${LANG:-}${LC_ALL:-}" in it*|*it_*) it=1 ;; *) it=0 ;; esac say() { if [ "$it" = 1 ]; then printf '%s\n' "$1"; else printf '%s\n' "$2"; fi; } die() { say "FireResolve: $1" "FireResolve: $2" >&2; exit 1; } [ "$(uname -s)" = "Darwin" ] || die "questo installatore è per macOS." "this installer is for macOS." for c in curl shasum ditto awk; do command -v "$c" >/dev/null 2>&1 || die "manca il comando $c." "the $c command is missing." done if [ -n "${FIRERESOLVE_DEST:-}" ]; then dest="$FIRERESOLVE_DEST" elif [ -w /Applications ]; then dest="/Applications" else dest="$HOME/Applications" fi mkdir -p "$dest" tmp="$(mktemp -d)" trap 'rm -rf "$tmp"' EXIT INT TERM say "Scarico FireResolve…" "Downloading FireResolve…" curl -fsSL --proto "$proto" --proto-redir "$proto" "$base/FireResolve-macos.zip" -o "$tmp/FireResolve.zip" \ || die "download non riuscito." "download failed." curl -fsSL --proto "$proto" --proto-redir "$proto" "$base/FireResolve-macos.sha256" -o "$tmp/sums" \ || die "impronte non scaricate." "checksums could not be downloaded." expected="$(awk '$2 == "FireResolve-macos.zip" { print $1 }' "$tmp/sums")" actual="$(shasum -a 256 "$tmp/FireResolve.zip" | awk '{ print $1 }')" if [ -z "$expected" ] || [ "$expected" != "$actual" ]; then die "l'impronta SHA-256 non corrisponde: installazione annullata." \ "the SHA-256 checksum does not match: installation cancelled." fi ditto -x -k "$tmp/FireResolve.zip" "$tmp/x" app="$tmp/x/FireResolve.app" [ -x "$app/Contents/MacOS/FireResolve" ] || die "pacchetto non valido." "invalid package." version="$("$app/Contents/MacOS/FireResolve" --version 2>/dev/null || echo FireResolve)" # l'app aperta va chiusa prima di sostituirla (salva tutto subito: nulla da perdere) if pkill -x FireResolve 2>/dev/null; then sleep 1 fi # sostituzione quasi atomica: copia accanto, poi scambio rm -rf "$dest/FireResolve.app.new" ditto "$app" "$dest/FireResolve.app.new" rm -rf "$dest/FireResolve.app" mv "$dest/FireResolve.app.new" "$dest/FireResolve.app" say "Installato: $version" "Installed: $version" say " in $dest/FireResolve.app" " in $dest/FireResolve.app" say "Aprilo da Launchpad oppure con: open -a FireResolve" "Open it from Launchpad or with: open -a FireResolve" say "Per aggiornare in futuro, rilancia lo stesso comando." "To update later, run the same command again." } main "$@"