253 lines
7.1 KiB
Bash
Raw Permalink Normal View History

2024-09-21 23:02:16 +03:00
#!/usr/bin/env bash
# Downloads the latest tarball from https://github.com/amir1376/ab-download-manager/releases and unpacks it into ~/.local/.
# Creates a .desktop entry for the app in ~/.local/share/applications based on FreeDesktop specifications.
set -euo pipefail
DEPENDENCIES=(curl tar)
LOG_FILE="/tmp/ab-dm-installer.log"
# --- Custom Logger
logger() {
timestamp=$(date +"%Y/%m/%d %H:%M:%S")
if [[ "$1" == "error" ]]; then
# Red color for errors
echo -e "${timestamp} -- ABDM-Installer [Error]: \033[0;31m$@\033[0m" | tee -a ${LOG_FILE}
else
# Default color for non-error messages
echo -e "${timestamp} -- ABDM-Installer [Info]: $@" | tee -a ${LOG_FILE}
fi
2024-09-21 23:02:16 +03:00
}
remove_if_exists() {
local target="$1"
if [ -z "$target" ]; then
logger "No target specified in remove_if_exists function"
return 1
fi
if [ -e "$target" ]; then
logger "File \"$target\" Removed"
rm -rf "$target"
else
logger "File \"$target\" does not exist"
fi
}
# --- Detect OS and The Package Manager to use
detect_package_manager() {
if [ -f /etc/os-release ]; then
source /etc/os-release
local OS=${NAME}
elif type lsb_release >/dev/null 2>&1; then
local OS=$(lsb_release -si)
elif [ -f /etc/lsb-release ]; then
source /etc/lsb-release
local OS="${DISTRIB_ID}"
elif [ -f /etc/debian_version ]; then
local OS=Debian
else
logger error "Your Linux Distro is not Supperted."
logger error "Please install ${DEPENDENCIES[@]} Manually."
exit 1
fi
if `grep -E 'Debian|Ubuntu' <<< $OS > /dev/null` ; then
systemPackage="apt"
elif `grep -E 'Fedora|CentOS|Red Hat|AlmaLinux' <<< $OS > /dev/null`; then
systemPackage="dnf"
fi
}
detect_package_manager
# --- Install dependencies
install_dependencies() {
local answer
read -p "Do you want to install $1? [Y/n]: " -r answer
answer=${answer:-Y} # Set default to 'Y' if no input is given
case $answer in
[Yy]* )
sudo ${systemPackage} update -y
logger "installing $1 package ..."
sudo ${systemPackage} install -y $1
;;
[Nn]* )
logger "Skipping the installation of $1."
;;
* )
logger error "Please answer yes or no."
install_dependencies "$1" # re-prompt for the same package
;;
esac
}
# Check dependencies and install if missing
check_dependencies() {
for pkg in "${DEPENDENCIES[@]}"; do
if ! command -v "$pkg" >/dev/null 2>&1; then
logger "$pkg is not installed. Installing..."
install_dependencies "$pkg"
else
logger "$pkg is already installed."
fi
done
}
2024-09-21 23:02:16 +03:00
APP_NAME="ABDownloadManager"
PLATFORM="linux"
2024-11-23 10:07:59 +03:30
ARCH="x64"
EXT="tar.gz"
2024-09-21 23:02:16 +03:00
RELEASE_URL="https://api.github.com/repos/amir1376/ab-download-manager/releases/latest"
GITHUB_RELEASE_DOWNLOAD="https://github.com/amir1376/ab-download-manager/releases/download"
LATEST_VERSION=$(curl -fSs "${RELEASE_URL}" | grep '"tag_name":' | sed -E 's/.*"tag_name": ?"([^"]+)".*/\1/')
2024-11-23 10:07:59 +03:30
ASSET_NAME="${APP_NAME}_${LATEST_VERSION:1}_${PLATFORM}_${ARCH}.${EXT}"
DOWNLOAD_URL="$GITHUB_RELEASE_DOWNLOAD/${LATEST_VERSION}/$ASSET_NAME"
BINARY_PATH="$HOME/.local/$APP_NAME/bin/$APP_NAME"
# --- Delete the old version Application if exists
2024-09-21 23:02:16 +03:00
delete_old_version() {
# Find the PID(s) of the application
PIDS=$(pidof "$APP_NAME") || true
if [ -n "$PIDS" ]; then
echo "Found $APP_NAME with PID(s): $PIDS. Attempting to kill..."
# Attempt to terminate the process gracefully
kill $PIDS 2>/dev/null || echo "Graceful kill failed..."
# Wait for a short period to allow graceful shutdown
sleep 2
# Check if the process is still running
PIDS=$(pidof "$APP_NAME") || true
if [ -n "$PIDS" ]; then
echo "Process still running. Force killing..."
kill -9 $PIDS 2>/dev/null || echo "Force kill failed..."
else
echo "$APP_NAME terminated successfully."
fi
else
echo "$APP_NAME is not running."
fi
# Remove old version directories
# First Remove link to "$HOME/.local/$APP_NAME"
remove_if_exists "$HOME/.local/bin/$APP_NAME"
# then Remove the main binary files directory
remove_if_exists "$HOME/.local/$APP_NAME"
# Log the removal action
logger "Removed old version of $APP_NAME"
2024-09-21 23:02:16 +03:00
}
# --- Generate a .desktop file for the app
2024-09-21 23:02:16 +03:00
generate_desktop_file() {
cat <<EOF > "$HOME/.local/share/applications/abdownloadmanager.desktop"
[Desktop Entry]
2024-09-21 23:02:16 +03:00
Name=AB Download Manager
Comment=Manage and organize your download files better than before
GenericName=Downloader
Categories=Utility;Network;
Exec=$BINARY_PATH
Icon=$HOME/.local/$APP_NAME/lib/$APP_NAME.png
2024-09-21 23:02:16 +03:00
Terminal=false
Type=Application
StartupWMClass=com-abdownloadmanager-desktop-AppKt
EOF
2024-09-21 23:02:16 +03:00
}
# --- Download the latest version of the app
2024-09-21 23:02:16 +03:00
download_zip() {
# Remove the app tarball if it exists in /tmp
remove_if_exists "/tmp/$ASSET_NAME"
logger "downloading AB Download Manager ..."
# Perform the download with curl
if curl --progress-bar -fSL -o "/tmp/$ASSET_NAME" "${DOWNLOAD_URL}"; then
logger "download finished successfully"
else
logger error "Download failed! Something Went Wrong"
logger error "Check Your Internet Connectivity"
# Optionally remove the partially downloaded file
remove_if_exists "/tmp/$ASSET_NAME"
fi
2024-09-21 23:02:16 +03:00
}
# --- Install the app
2024-09-21 23:02:16 +03:00
install_app() {
logger "Installing AB Download Manager ..."
# --- Setup ~/.local directories
2024-09-21 23:02:16 +03:00
mkdir -p "$HOME/.local/bin" "$HOME/.local/share/applications"
tar -xzf "/tmp/$ASSET_NAME" -C "$HOME/.local"
# --- remove tarball after installation
remove_if_exists "/tmp/$ASSET_NAME"
2024-09-21 23:02:16 +03:00
# Link the binary to ~/.local/bin
ln -sf "$BINARY_PATH" "$HOME/.local/bin/$APP_NAME"
2024-09-21 23:02:16 +03:00
# Create a .desktop file in ~/.local/share/applications
generate_desktop_file
logger "AB Download Manager installed successfully"
logger "it can be found in Applications menu or run '$APP_NAME' in terminal"
logger "Make sure $HOME/.local/bin exists in PATH"
logger "installation logs saved in: ${LOG_FILE}"
}
# --- Check if the app is installed
check_if_installed() {
local installed_version
installed_version=$($APP_NAME --version 2>/dev/null)
if [ -n "$installed_version" ]; then
echo "$installed_version"
else
echo ""
fi
2024-09-21 23:02:16 +03:00
}
# --- Update the app
2024-09-21 23:02:16 +03:00
update_app() {
logger "checking update"
2024-09-21 23:02:16 +03:00
if [ "$1" != "${LATEST_VERSION:1}" ]; then
logger "new version is available: v${LATEST_VERSION:1}. Updating..."
2024-09-21 23:02:16 +03:00
download_zip
delete_old_version
2024-09-21 23:02:16 +03:00
install_app
else
logger "You have the latest version installed."
2024-09-21 23:02:16 +03:00
exit 0
fi
}
main() {
echo "" > "$LOG_FILE"
2024-09-21 23:02:16 +03:00
local installed_version
check_dependencies
installed_version=$(check_if_installed)
if [ -n "$installed_version" ]; then
logger "AB Download Manager v$installed_version is currently installed."
2024-09-21 23:02:16 +03:00
update_app "$installed_version"
else
download_zip
install_app
fi
}
main "$@"