Files
Scripts/install.sh
2025-09-10 11:57:06 +02:00

112 lines
5.8 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# --- Main Script ---
# Generate a unique temporary filename with a timestamp
conf_file="packages.conf.$(date +%Y%m%d%H%M%S)"
# Set up a trap to delete the temporary file on exit, regardless of how the script ends
trap 'rm -f "${conf_file}"' EXIT
# Download the configuration file before sourcing it.
echo "🔄 Downloading configuration file '${conf_file}'..."
if ! curl -fsSL -o "${conf_file}" "https://git.technopunk.space/tomi/Scripts/raw/branch/main/packages.conf"; then
echo "❌ Error: Failed to download packages.conf. Exiting."
exit 1
fi
echo "✅ Configuration file downloaded successfully."
# Source the configuration file to load the SCRIPT_PACKAGES array.
source "${conf_file}"
# Welcome message
echo "-------------------------------------"
echo "        Script Downloader            "
echo "-------------------------------------"
# Create an array of options from the package names (the keys of our map)
options=("${!SCRIPT_PACKAGES[@]}")
options+=("Quit") # Add a Quit option
# Set the prompt for the select menu
PS3="Please enter the number of the script/package you want to download: "
# Display the menu and handle user input
select choice in "${options[@]}"; do
    case "${choice}" in
        "Quit")
            echo "👋 Exiting."
            break
            ;;
        *)
            # Check if the user's choice is a valid package name
            if [[ -n "${SCRIPT_PACKAGES[$choice]}" ]]; then
                echo
                echo "⬇️  Downloading package: '${choice}'..."
                
                # Get the space-separated list of URLs for the chosen package
                urls_to_download="${SCRIPT_PACKAGES[$choice]}"
                # Loop through each URL in the list and download the file
                for url in $urls_to_download; do
                    filename=$(basename "${url}")
                    # If it's a .conf file AND it already exists, ask to overwrite.
                    if [[ "${filename}" == *.conf && -f "${filename}" ]]; then
                        echo "   -> Found existing config file: '${filename}'."
                        # Create a temporary file to download the new version for comparison
                        tmp_file=$(mktemp)
                        # Download the new version silently to the temp file
                        if curl -fsSL -o "${tmp_file}" "${url}"; then
                            echo "   🔎 Comparing versions..."
                            echo "-------------------- DIFF START --------------------"
                            # Show a colorized diff if 'colordiff' is available, otherwise use regular 'diff'
                            if command -v colordiff &> /dev/null; then
                                colordiff -u "${filename}" "${tmp_file}"
                            else
                                diff --color=always -u "${filename}" "${tmp_file}"
                            fi
                            echo "--------------------- DIFF END ---------------------"
                            
                            # Ask the user for confirmation before overwriting
                            read -p "Do you want to overwrite '${filename}'? (y/N) " -n 1 -r REPLY
                            echo # Move to a new line for cleaner output
                            if [[ $REPLY =~ ^[Yy]$ ]]; then
                                mv "${tmp_file}" "${filename}"
                                echo "   ✅ Updated '${filename}'."
                            else
                                rm "${tmp_file}"
                                echo "   🤷 Kept existing version of '${filename}'."
                            fi
                        else
                            echo "   ❌ Error: Failed to download new version of '${filename}' for comparison."
                            # Clean up the temp file on failure
                            rm -f "${tmp_file}"
                        fi
                    else
                        # Original download logic for all other files (or new .conf files)
                        echo "   -> Downloading '${filename}'..."
                        if curl -fsSL -o "${filename}" "${url}"; then
                            echo "   ✅ Successfully downloaded '${filename}'."
                            # If the downloaded file is a shell script, make it executable
                            if [[ "${filename}" == *.sh ]]; then
                                chmod +x "${filename}"
                                echo "   🤖 Made '${filename}' executable."
                            fi
                        else
                            echo "   ❌ Error: Failed to download '${filename}'."
                        fi
                    fi
                done
                echo
                echo "📦 Package download complete."
                break
            else
                # The user entered an invalid number
                echo "Invalid selection. Please try again."
            fi
            ;;
    esac
done