mirror of
https://github.com/amir1376/ab-download-manager.git
synced 2025-02-20 11:43:24 +08:00
253 lines
7.1 KiB
Bash
Executable File
253 lines
7.1 KiB
Bash
Executable File
#!/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
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
APP_NAME="ABDownloadManager"
|
|
PLATFORM="linux"
|
|
ARCH="x64"
|
|
EXT="tar.gz"
|
|
|
|
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/')
|
|
|
|
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
|
|
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"
|
|
}
|
|
|
|
# --- Generate a .desktop file for the app
|
|
generate_desktop_file() {
|
|
cat <<EOF > "$HOME/.local/share/applications/abdownloadmanager.desktop"
|
|
[Desktop Entry]
|
|
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
|
|
Terminal=false
|
|
Type=Application
|
|
StartupWMClass=com-abdownloadmanager-desktop-AppKt
|
|
EOF
|
|
}
|
|
|
|
# --- Download the latest version of the app
|
|
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
|
|
}
|
|
|
|
|
|
# --- Install the app
|
|
install_app() {
|
|
|
|
logger "Installing AB Download Manager ..."
|
|
# --- Setup ~/.local directories
|
|
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"
|
|
|
|
# Link the binary to ~/.local/bin
|
|
ln -sf "$BINARY_PATH" "$HOME/.local/bin/$APP_NAME"
|
|
|
|
# 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
|
|
}
|
|
|
|
# --- Update the app
|
|
update_app() {
|
|
logger "checking update"
|
|
if [ "$1" != "${LATEST_VERSION:1}" ]; then
|
|
logger "new version is available: v${LATEST_VERSION:1}. Updating..."
|
|
download_zip
|
|
delete_old_version
|
|
install_app
|
|
else
|
|
logger "You have the latest version installed."
|
|
exit 0
|
|
fi
|
|
}
|
|
|
|
main() {
|
|
echo "" > "$LOG_FILE"
|
|
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."
|
|
update_app "$installed_version"
|
|
else
|
|
download_zip
|
|
install_app
|
|
fi
|
|
}
|
|
|
|
main "$@"
|