mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-21 14:05:41 +00:00
947711a98d
* fix(installer): write logs to stderr so the download URL isn't polluted * fix(installer): read the reinstall prompt from /dev/tty * fix(installer): add --fail --globoff to the package download * fix(installer): degrade gracefully when no controlling terminal is available
183 lines
5.4 KiB
Bash
Executable File
183 lines
5.4 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
# Psysonic Auto-Installer
|
|
# Automatically detects your OS and installs the latest release from GitHub
|
|
|
|
REPO="Psychotoxical/psysonic"
|
|
APP_NAME="psysonic"
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Log helpers write to stderr so functions that return values via stdout
|
|
# (e.g. get_download_url) stay clean when called in command substitution.
|
|
info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1" >&2
|
|
}
|
|
|
|
success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1" >&2
|
|
}
|
|
|
|
warn() {
|
|
echo -e "${YELLOW}[WARN]${NC} $1" >&2
|
|
}
|
|
|
|
error() {
|
|
echo -e "${RED}[ERROR]${NC} $1" >&2
|
|
exit 1
|
|
}
|
|
|
|
# Check if running as root
|
|
check_root() {
|
|
if [ "$EUID" -ne 0 ]; then
|
|
error "Please run this script as root (use sudo)"
|
|
fi
|
|
}
|
|
|
|
# Detect package manager and OS type
|
|
detect_os() {
|
|
if command -v apt &> /dev/null; then
|
|
OS_TYPE="debian"
|
|
PACKAGE_MANAGER="apt"
|
|
info "Detected Debian/Ubuntu-based system (apt)"
|
|
elif command -v dnf &> /dev/null; then
|
|
OS_TYPE="rhel"
|
|
PACKAGE_MANAGER="dnf"
|
|
info "Detected RHEL/Fedora-based system (dnf)"
|
|
elif command -v yum &> /dev/null; then
|
|
OS_TYPE="rhel"
|
|
PACKAGE_MANAGER="yum"
|
|
info "Detected RHEL/CentOS-based system (yum)"
|
|
else
|
|
error "Unsupported package manager. This installer supports Debian/Ubuntu and RHEL/Fedora/CentOS systems."
|
|
fi
|
|
}
|
|
|
|
# Get the latest release download URL for the specific package type
|
|
get_download_url() {
|
|
local api_url="https://api.github.com/repos/${REPO}/releases/latest"
|
|
|
|
info "Fetching latest release information..."
|
|
|
|
local release_info
|
|
release_info=$(curl -s "$api_url")
|
|
|
|
if echo "$release_info" | grep -q "message.*Not Found"; then
|
|
error "Could not fetch release information. Please check your internet connection."
|
|
fi
|
|
|
|
local tag_name
|
|
tag_name=$(echo "$release_info" | grep -o '"tag_name": *"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
|
|
if [ -z "$tag_name" ]; then
|
|
error "Could not determine latest release version."
|
|
fi
|
|
|
|
info "Latest version: $tag_name"
|
|
|
|
local download_url=""
|
|
|
|
if [ "$OS_TYPE" = "debian" ]; then
|
|
download_url=$(echo "$release_info" | grep -o '"browser_download_url": *"[^"]*\.deb"' | head -1 | cut -d'"' -f4)
|
|
elif [ "$OS_TYPE" = "rhel" ]; then
|
|
download_url=$(echo "$release_info" | grep -o '"browser_download_url": *"[^"]*\.rpm"' | head -1 | cut -d'"' -f4)
|
|
fi
|
|
|
|
if [ -z "$download_url" ]; then
|
|
error "Could not find download URL for $OS_TYPE package."
|
|
fi
|
|
|
|
echo "$download_url"
|
|
}
|
|
|
|
# Install the package
|
|
install_package() {
|
|
local download_url="$1"
|
|
local temp_dir
|
|
temp_dir=$(mktemp -d)
|
|
local package_file="$temp_dir/${APP_NAME}_latest"
|
|
|
|
info "Downloading package..."
|
|
|
|
if [ "$OS_TYPE" = "debian" ]; then
|
|
package_file="${package_file}.deb"
|
|
curl --fail --globoff -L -o "$package_file" "$download_url"
|
|
|
|
info "Installing package..."
|
|
$PACKAGE_MANAGER install -y "$package_file" || {
|
|
warn "Trying to fix broken dependencies..."
|
|
$PACKAGE_MANAGER install -f -y
|
|
}
|
|
elif [ "$OS_TYPE" = "rhel" ]; then
|
|
package_file="${package_file}.rpm"
|
|
curl --fail --globoff -L -o "$package_file" "$download_url"
|
|
|
|
info "Installing package..."
|
|
$PACKAGE_MANAGER install -y "$package_file"
|
|
fi
|
|
|
|
# Cleanup
|
|
rm -rf "$temp_dir"
|
|
}
|
|
|
|
# Check if app is already installed
|
|
check_installed() {
|
|
if command -v $APP_NAME &> /dev/null || command -v ${APP_NAME^} &> /dev/null; then
|
|
warn "${APP_NAME} appears to be already installed."
|
|
# Under `curl ... | bash`, stdin is the script stream itself, so
|
|
# read the answer from the controlling terminal instead. Probe by
|
|
# opening: `[ -r /dev/tty ]` passes on the 0666 device node even
|
|
# without a controlling terminal; only open() reports the failure.
|
|
if { : < /dev/tty; } 2>/dev/null; then
|
|
read -p "Do you want to reinstall? (y/N): " -n 1 -r < /dev/tty
|
|
echo
|
|
else
|
|
warn "No terminal available for prompt; skipping reinstall."
|
|
exit 0
|
|
fi
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
info "Installation cancelled."
|
|
exit 0
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Main installation flow
|
|
main() {
|
|
echo -e "${GREEN}"
|
|
echo "╔══════════════════════════════════════════════════════════╗"
|
|
echo "║ Psysonic Auto-Installer ║"
|
|
echo "║ Install the latest release from GitHub Releases ║"
|
|
echo "╚══════════════════════════════════════════════════════════╝"
|
|
echo -e "${NC}"
|
|
|
|
check_root
|
|
detect_os
|
|
check_installed
|
|
|
|
local download_url
|
|
download_url=$(get_download_url)
|
|
|
|
if [ -z "$download_url" ]; then
|
|
error "Failed to get download URL."
|
|
fi
|
|
|
|
info "Download URL: $download_url"
|
|
|
|
install_package "$download_url"
|
|
|
|
echo ""
|
|
success "Psysonic has been installed successfully!"
|
|
echo -e "${BLUE}You can launch it from your application menu or by running:${NC} psysonic"
|
|
echo ""
|
|
}
|
|
|
|
# Run main function
|
|
main
|