112 lines
5.8 KiB
Bash
112 lines
5.8 KiB
Bash
#!/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
|