install.sh
Rama main · réplica de lectura del repositorio original.
#!/bin/sh
set -eu
default_release_url="https://vastora.petauron.com/vastora-center-install.tar.gz"
release_url="$default_release_url"
release_resolve=""
install_dir="/opt/vastora/center"
coordinated_agent_migration=no
expected_version=""
usage() {
cat <<'EOF'
Usage: install.sh center [--release-url HTTPS_URL] [--release-resolve HOST:PORT:ADDRESS] [--install-dir DIR] [--expected-version VERSION] [--coordinated-agent-migration] [-- SETUP_OPTIONS]
install.sh center uninstall [--release-url HTTPS_URL] [--install-dir DIR]
Installs the verified Vastora Center release bundle on loopback, then prints an
SSH tunnel command for the first-run wizard. Agent commands come from Center.
Examples:
curl -LsSf https://vastora.petauron.com/install.sh | sudo sh -s -- center
curl -LsSf https://vastora.petauron.com/install.sh | sudo sh -s -- center uninstall
./install.sh center -- --ssh-host center.example.com
EOF
}
if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then
usage
exit 0
fi
if [ "${1:-}" != "center" ]; then
echo "Choose 'center'. Agents are installed with the one-time command generated by Center." >&2
usage >&2
exit 2
fi
shift
operation="install"
if [ "${1:-}" = "uninstall" ]; then
operation="uninstall"
shift
fi
while [ "$#" -gt 0 ]; do
case "$1" in
--release-url)
[ "$#" -ge 2 ] || { echo "--release-url requires a value." >&2; exit 2; }
release_url="$2"
shift 2
;;
--release-resolve)
[ "$#" -ge 2 ] || { echo "--release-resolve requires a value." >&2; exit 2; }
release_resolve="$2"
shift 2
;;
--install-dir)
[ "$#" -ge 2 ] || { echo "--install-dir requires a value." >&2; exit 2; }
install_dir="$2"
shift 2
;;
--expected-version)
[ "$#" -ge 2 ] || { echo "--expected-version requires a value." >&2; exit 2; }
expected_version="$2"
shift 2
;;
--coordinated-agent-migration)
coordinated_agent_migration=yes
shift
;;
--) shift; break ;;
*) break ;;
esac
done
if [ "$operation" = "uninstall" ] && [ "$#" -gt 0 ]; then
echo "Unknown uninstall argument: $1" >&2
echo "Run 'center uninstall' without cleanup flags; the terminal menu provides every option." >&2
exit 2
fi
if [ "$operation" = "uninstall" ] && [ "$coordinated_agent_migration" = yes ]; then
echo "The migration option cannot be used for uninstall." >&2
exit 2
fi
if [ "$(uname -s)" != "Linux" ]; then
echo "Vastora Center installation currently supports Linux hosts." >&2
exit 1
fi
case "$(uname -m)" in
x86_64|amd64) ;;
aarch64|arm64) ;;
*) echo "Vastora Center supports Ubuntu 24.04 on x86_64 and ARM64." >&2; exit 1 ;;
esac
if [ "$(id -u)" -ne 0 ]; then
echo "Run the Center installer with sudo." >&2
exit 1
fi
case "$release_url" in
https://*) ;;
*) echo "The Center release URL must use HTTPS." >&2; exit 2 ;;
esac
if [ -n "$release_resolve" ]; then
case "$release_resolve" in
*:*:*) ;;
*) echo "The release DNS pin is invalid." >&2; exit 2 ;;
esac
if printf '%s\n' "$release_resolve" | grep -Eq '[[:space:]]'; then
echo "The release DNS pin is invalid." >&2
exit 2
fi
fi
case "$install_dir" in
/*) ;;
*) echo "The installation directory must be an absolute path." >&2; exit 2 ;;
esac
for required in curl tar mktemp install awk dirname grep mv; do
if ! command -v "$required" >/dev/null 2>&1; then
echo "Required command is not installed: $required" >&2
exit 1
fi
done
if [ -n "$expected_version" ] && ! printf '%s\n' "$expected_version" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$'; then
echo "The expected Center version is invalid." >&2
exit 2
fi
if command -v sha256sum >/dev/null 2>&1; then
digest_command="sha256sum"
elif command -v shasum >/dev/null 2>&1; then
digest_command="shasum -a 256"
else
echo "Install sha256sum or shasum, then run the same command again." >&2
exit 1
fi
temporary_dir="$(mktemp -d "${TMPDIR:-/tmp}/vastora-center-install.XXXXXX")"
archive="$temporary_dir/vastora-center-install.tar.gz"
checksum="$temporary_dir/vastora-center-install.tar.gz.sha256"
staging=""
cleanup() {
rm -rf "$temporary_dir"
if [ -n "$staging" ] && [ -d "$staging" ]; then
rm -rf "$staging"
fi
}
trap cleanup EXIT HUP INT TERM
echo "Downloading the Vastora Center release bundle..."
if [ -n "$release_resolve" ]; then
if ! curl --proto '=https' --tlsv1.2 -fsS --resolve "$release_resolve" "$release_url" -o "$archive"; then
echo "No installable Center release was found. Check the release URL and try again." >&2
exit 1
fi
elif ! curl --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL "$release_url" -o "$archive"; then
echo "No installable Center release was found. Check the release URL and try again." >&2
exit 1
fi
if [ -n "$release_resolve" ]; then
if ! curl --proto '=https' --tlsv1.2 -fsS --resolve "$release_resolve" "$release_url.sha256" -o "$checksum"; then
echo "The release checksum could not be downloaded; nothing was installed." >&2
exit 1
fi
elif ! curl --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL "$release_url.sha256" -o "$checksum"; then
echo "The release checksum could not be downloaded; nothing was installed." >&2
exit 1
fi
expected_digest="$(awk 'NR == 1 {print tolower($1)}' "$checksum")"
actual_digest="$($digest_command "$archive" | awk 'NR == 1 {print tolower($1)}')"
if [ -z "$expected_digest" ] || [ "$expected_digest" != "$actual_digest" ]; then
echo "The Center release failed its SHA-256 integrity check; nothing was installed." >&2
exit 1
fi
if ! tar -tzf "$archive" | while IFS= read -r entry; do
case "$entry" in
/*|..|./..|../*|*/../*|*/..) echo "Unsafe archive entry: $entry" >&2; exit 1 ;;
esac
done; then
echo "The Center release archive is unsafe; nothing was installed." >&2
exit 1
fi
if ! tar -tvzf "$archive" | awk '$1 !~ /^[-d]/ {exit 1}'; then
echo "The Center release archive contains unsupported links or special files." >&2
exit 1
fi
install -d -m 0755 "$(dirname "$install_dir")"
staging="$(mktemp -d "${install_dir}.new.XXXXXX")"
tar -xzf "$archive" -C "$staging"
for required_file in install.sh setup.sh upgrade.sh uninstall.sh install-host-cli.sh install-update-service.sh update-center.sh compare-semver.awk compose.yaml release.env; do
if [ ! -f "$staging/$required_file" ]; then
echo "The Center release is incomplete: missing $required_file" >&2
exit 1
fi
done
bundle_version="$(awk -F= '$1 == "VASTORA_VERSION" {sub(/^[^=]*=/, ""); print; exit}' "$staging/release.env")"
if ! printf '%s\n' "$bundle_version" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$'; then
echo "The Center release contains an invalid version; nothing was installed." >&2
exit 1
fi
if [ -n "$expected_version" ] && [ "$bundle_version" != "$expected_version" ]; then
echo "The Center release version does not match the requested update; nothing was installed." >&2
exit 1
fi
chmod 0755 "$staging/setup.sh"
chmod 0755 "$staging/upgrade.sh"
chmod 0755 "$staging/uninstall.sh"
chmod 0755 "$staging/install-host-cli.sh"
chmod 0755 "$staging/install-update-service.sh"
chmod 0755 "$staging/update-center.sh"
if [ "$operation" = "uninstall" ]; then
"$staging/uninstall.sh" --install-dir "$install_dir"
exit 0
fi
if [ -d "$install_dir" ]; then
if [ ! -f "$install_dir/.env" ] || [ ! -f "$install_dir/release.env" ]; then
echo "$install_dir exists but is not a managed Center installation; no files were changed." >&2
exit 1
fi
installed_version="$(awk -F= '$1 == "VASTORA_VERSION" {sub(/^[^=]*=/, ""); print; exit}' "$install_dir/release.env")"
if ! printf '%s\n' "$installed_version" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$'; then
echo "The installed Center version is invalid; no files were changed." >&2
exit 1
fi
if [ "$(awk -f "$staging/compare-semver.awk" "$bundle_version" "$installed_version")" = "-1" ]; then
echo "Refusing to downgrade Center from $installed_version to $bundle_version; no files were changed." >&2
exit 1
fi
echo "Existing Center installation found; upgrading it in place..."
if [ "$coordinated_agent_migration" = yes ]; then
"$staging/upgrade.sh" --install-dir "$install_dir" --coordinated-agent-migration
else
"$staging/upgrade.sh" --install-dir "$install_dir"
fi
exit 0
fi
if [ "$coordinated_agent_migration" = yes ]; then
echo "The migration option requires an existing Center installation." >&2
exit 2
fi
if [ -e "$install_dir" ]; then
echo "$install_dir exists but is not a directory; no files were changed." >&2
exit 1
fi
mv "$staging" "$install_dir"
staging=""
echo "Verified Center files installed at $install_dir"
rm -rf "$temporary_dir"
trap - EXIT HUP INT TERM
cd "$install_dir"
exec "$install_dir/setup.sh" "$@"