#!/bin/bash # NUPST Installer Script # Downloads and installs NUPST globally on the system # Can be used directly with curl: # Without auto-installing dependencies: # curl -sSL https://code.foss.global/serve.zone/nupst/raw/branch/main/install.sh | sudo bash # With auto-installing dependencies: # curl -sSL https://code.foss.global/serve.zone/nupst/raw/branch/main/install.sh | sudo bash -s -- -y # # Options: # -y, --yes Automatically answer yes to all prompts # -h, --help Show this help message # Parse command line arguments AUTO_YES=0 SHOW_HELP=0 for arg in "$@"; do case $arg in -y|--yes) AUTO_YES=1 shift ;; -h|--help) SHOW_HELP=1 shift ;; *) # Unknown option ;; esac done if [ $SHOW_HELP -eq 1 ]; then echo "NUPST Installer Script" echo "Usage: $0 [options]" echo "" echo "Options:" echo " -y, --yes Automatically answer yes to all prompts" echo " -h, --help Show this help message" exit 0 fi # Check if running as root if [ "$EUID" -ne 0 ]; then echo "Please run as root (sudo bash install.sh or pipe to sudo bash)" exit 1 fi # Detect if script is being piped or run directly PIPED=0 INTERACTIVE=1 if [ ! -t 0 ]; then # Being piped, need to clone the repo PIPED=1 fi # Check if stdin is a terminal if [ ! -t 0 ] || [ ! -t 1 ]; then # Either stdin or stdout is not a terminal, check if -y was provided if [ $AUTO_YES -ne 1 ]; then echo "Script detected it's running in a non-interactive environment without -y flag." echo "Attempting to find a controlling terminal for interactive prompts..." # Try to use a controlling terminal for user input if [ -t 1 ]; then # Stdout is a terminal, use it exec < /dev/tty 2>/dev/null || INTERACTIVE=0 else # Try to find controlling terminal exec < /dev/tty 2>/dev/null || INTERACTIVE=0 fi if [ $INTERACTIVE -eq 0 ]; then echo "ERROR: No controlling terminal available for interactive prompts." echo "For interactive installation (RECOMMENDED):" echo " curl -sSL https://code.foss.global/serve.zone/nupst/raw/branch/main/install.sh -o nupst-install.sh" echo " sudo bash nupst-install.sh" echo "" echo "For non-interactive installation with automatic dependency installation:" echo " curl -sSL https://code.foss.global/serve.zone/nupst/raw/branch/main/install.sh | sudo bash -s -- -y" exit 1 else echo "Interactive terminal found, continuing with prompts..." fi fi fi # Helper function to detect OS type detect_os() { if [ -f /etc/os-release ]; then . /etc/os-release OS=$ID elif type lsb_release >/dev/null 2>&1; then OS=$(lsb_release -si | tr '[:upper:]' '[:lower:]') elif [ -f /etc/lsb-release ]; then . /etc/lsb-release OS=$DISTRIB_ID elif [ -f /etc/debian_version ]; then OS="debian" elif [ -f /etc/redhat-release ]; then if grep -q "CentOS" /etc/redhat-release; then OS="centos" elif grep -q "Fedora" /etc/redhat-release; then OS="fedora" else OS="rhel" fi else OS=$(uname -s) fi echo $OS } # Helper function to install git install_git() { OS=$(detect_os) echo "Detected OS: $OS" case "$OS" in ubuntu|debian|pop|mint|elementary|kali|zorin) echo "Installing git using apt..." apt-get update && apt-get install -y git ;; fedora|rhel|centos|almalinux|rocky) echo "Installing git using dnf/yum..." if command -v dnf &> /dev/null; then dnf install -y git else yum install -y git fi ;; arch|manjaro|endeavouros|garuda) echo "Installing git using pacman..." pacman -Sy --noconfirm git ;; opensuse*|suse|sles) echo "Installing git using zypper..." zypper install -y git ;; alpine) echo "Installing git using apk..." apk add git ;; *) echo "Unsupported OS: $OS" echo "Please install git manually and run the installer again." exit 1 ;; esac # Check if git was installed successfully if ! command -v git &> /dev/null; then echo "Failed to install git. Please install git manually and run the installer again." exit 1 fi echo "Git installed successfully." } # Define installation directory INSTALL_DIR="/opt/nupst" REPO_URL="https://code.foss.global/serve.zone/nupst.git" # Check if git is installed - needed for both piped and direct execution if ! command -v git &> /dev/null; then echo "Git is required but not installed." if [ $AUTO_YES -eq 1 ]; then echo "Auto-installing git (-y flag provided)..." install_git elif [ $INTERACTIVE -eq 1 ]; then # If interactive and no -y flag, ask the user echo "Would you like to install git now? (y/N): " read -r install_git_prompt if [[ "$install_git_prompt" =~ ^[Yy]$ ]]; then install_git else echo "Git installation skipped. Please install git manually and run the installer again." echo "Alternatively, you can run the installer with -y flag to automatically install git:" echo " sudo bash install.sh -y" exit 1 fi else # Non-interactive mode without -y flag echo "Error: Git is required but not installed." echo "In non-interactive mode, use -y flag to auto-install dependencies:" echo " curl -sSL https://code.foss.global/serve.zone/nupst/raw/branch/main/install.sh | sudo bash -s -- -y" exit 1 fi fi if [ $PIPED -eq 1 ]; then echo "Installing NUPST from remote repository..." # Check if installation directory exists if [ -d "$INSTALL_DIR" ] && [ -d "$INSTALL_DIR/.git" ]; then echo "Existing installation found at $INSTALL_DIR. Updating..." cd "$INSTALL_DIR" # Try to update the repository git fetch origin git reset --hard origin/main if [ $? -ne 0 ]; then echo "Failed to update repository. Reinstalling..." cd / rm -rf "$INSTALL_DIR" mkdir -p "$INSTALL_DIR" git clone --depth 1 $REPO_URL "$INSTALL_DIR" else echo "Repository updated successfully." fi else # Fresh installation if [ -d "$INSTALL_DIR" ]; then echo "Removing previous installation at $INSTALL_DIR..." rm -rf "$INSTALL_DIR" fi # Create installation directory mkdir -p "$INSTALL_DIR" # Clone the repository echo "Cloning NUPST repository to $INSTALL_DIR..." git clone --depth 1 $REPO_URL "$INSTALL_DIR" fi if [ $? -ne 0 ]; then echo "Failed to clone/update repository. Please check your internet connection." exit 1 fi # Set script directory to the cloned repo SCRIPT_DIR="$INSTALL_DIR" else # Running directly from within the repo or downloaded script SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" # When running from a downloaded script in a different location # we need to clone the repository first if [ ! -f "$SCRIPT_DIR/setup.sh" ]; then echo "Running installer from downloaded script outside repository." echo "Will clone the repository to $INSTALL_DIR..." # Create installation directory if needed if [ -d "$INSTALL_DIR" ]; then echo "Removing previous installation at $INSTALL_DIR..." rm -rf "$INSTALL_DIR" fi mkdir -p "$INSTALL_DIR" # Clone the repository echo "Cloning NUPST repository to $INSTALL_DIR..." git clone --depth 1 $REPO_URL "$INSTALL_DIR" if [ $? -ne 0 ]; then echo "Failed to clone repository. Please check your internet connection." exit 1 fi # Update script directory to use the cloned repo SCRIPT_DIR="$INSTALL_DIR" fi fi # Run setup script echo "Running setup script..." if [ ! -f "$SCRIPT_DIR/setup.sh" ]; then echo "ERROR: Setup script not found at $SCRIPT_DIR/setup.sh" echo "Current directory: $(pwd)" echo "Script directory: $SCRIPT_DIR" ls -la "$SCRIPT_DIR" exit 1 fi bash "$SCRIPT_DIR/setup.sh" # Install globally echo "Installing NUPST globally..." ln -sf "$SCRIPT_DIR/bin/nupst" /usr/local/bin/nupst # Installation completed if [ $PIPED -eq 1 ]; then echo "NUPST has been installed globally at $INSTALL_DIR" else echo "NUPST has been installed globally." fi echo "You can now run 'nupst' from anywhere." echo "" echo "To get started, try:" echo " nupst help" echo " nupst setup # To configure your UPS connection"