Refactoring & tests
This commit is contained in:
+250
-108
@@ -1,29 +1,84 @@
|
||||
#!/bin/bash
|
||||
# Logseq Installer - Installiert und aktualisiert Logseq auf Linux-Systemen
|
||||
# Autor: Tim Peters
|
||||
# Repository: https://git.tim-peters.org/Tim/Logseq-Installer
|
||||
|
||||
COLOR_RED=$( tput setaf 1 )
|
||||
COLOR_GREEN=$( tput setaf 2 )
|
||||
COLOR_YELLOW=$( tput setaf 3 )
|
||||
COLOR_RESET=$( tput sgr0 )
|
||||
ALLOW_ROOT=false
|
||||
# =============================================================================
|
||||
# KONSTANTEN UND KONFIGURATION
|
||||
# =============================================================================
|
||||
|
||||
trap 'handleError' ERR
|
||||
readonly COLOR_RED=$(tput setaf 1)
|
||||
readonly COLOR_GREEN=$(tput setaf 2)
|
||||
readonly COLOR_YELLOW=$(tput setaf 3)
|
||||
readonly COLOR_RESET=$(tput sgr0)
|
||||
readonly ALLOW_ROOT_DEFAULT=false
|
||||
|
||||
handleError() {
|
||||
cat <<-EOT
|
||||
Leider ist ein Fehler aufgetreten.
|
||||
Bitte hilf mit dieses Skript zu verbessern und sende einen
|
||||
Fehlerbericht per EMail an installer@logseq.eu
|
||||
readonly INSTALL_DIR="${HOME}/.local/bin"
|
||||
readonly DESKTOP_DIR="${HOME}/.local/share/applications"
|
||||
readonly LOGO_URL="https://raw.githubusercontent.com/logseq/logseq/master/resources/icons/logseq.png"
|
||||
readonly RELEASE_API_URL="https://github.com/logseq/logseq/releases/latest"
|
||||
readonly DOWNLOAD_BASE_URL="https://github.com/logseq/logseq/releases/download"
|
||||
|
||||
readonly APP_NAME="Logseq"
|
||||
readonly APP_IMAGE_PATTERN="Logseq-linux-x64-*.AppImage"
|
||||
readonly DESKTOP_FILE="${DESKTOP_DIR}/logseq.desktop"
|
||||
readonly ICON_FILE="${DESKTOP_DIR}/logseq.png"
|
||||
|
||||
# =============================================================================
|
||||
# GLOBALE VARIABLEN
|
||||
# =============================================================================
|
||||
|
||||
ALLOW_ROOT="${ALLOW_ROOT_DEFAULT}"
|
||||
VERSION_LATEST=""
|
||||
VERSION_CURRENT=""
|
||||
FILENAME_LOGSEQ=""
|
||||
|
||||
# =============================================================================
|
||||
# FEHLERBEHANDLUNG
|
||||
# =============================================================================
|
||||
|
||||
# Fehlerbehandlung für unbehandelte Fehler
|
||||
trap 'handle_error' ERR
|
||||
|
||||
handle_error() {
|
||||
local exit_code=$?
|
||||
err "Ein unerwarteter Fehler ist aufgetreten (Exit-Code: ${exit_code})"
|
||||
cat <<-EOT
|
||||
Bitte hilf mit, dieses Skript zu verbessern, und sende einen
|
||||
Fehlerbericht per E-Mail an logseq@testorakel.de
|
||||
EOT
|
||||
exit "${exit_code}"
|
||||
}
|
||||
|
||||
# Ausgabe von Fehlermeldungen und Beenden
|
||||
err() {
|
||||
echo "${COLOR_RED}$*${COLOR_RESET}"
|
||||
exit 1
|
||||
echo "${COLOR_RED}$*${COLOR_RESET}" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
showLogo() {
|
||||
echo -n "${COLOR_GREEN}"
|
||||
cat <<-'EOT'
|
||||
# Ausgabe von Warnungen
|
||||
warn() {
|
||||
echo "${COLOR_YELLOW}$*${COLOR_RESET}" >&2
|
||||
}
|
||||
|
||||
# Ausgabe von Erfolgsmeldungen
|
||||
success() {
|
||||
echo "${COLOR_GREEN}$*${COLOR_RESET}"
|
||||
}
|
||||
|
||||
# Ausgabe von Info-Meldungen
|
||||
info() {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# HILFSFUNKTIONEN
|
||||
# =============================================================================
|
||||
|
||||
# Zeigt das Logo an
|
||||
show_logo() {
|
||||
echo -n "${COLOR_GREEN}"
|
||||
cat <<-'EOT'
|
||||
.____
|
||||
| | ____ ____ ______ ____ ______
|
||||
| | / _ \ / ___\/ ___// __ \/ ____/
|
||||
@@ -32,24 +87,23 @@ showLogo() {
|
||||
\/ /_____/ \/ \/ |__|
|
||||
EOT
|
||||
|
||||
echo -n "${COLOR_YELLOW}"
|
||||
cat <<-'EOT'
|
||||
echo -n "${COLOR_YELLOW}"
|
||||
cat <<-'EOT'
|
||||
.___ __ .__ .__
|
||||
| | ____ _______/ |______ | | | | ___________
|
||||
| |/ \ / ___/\ __\__ \ | | | | _/ __ \_ __ \
|
||||
| | | \\___ \ | | / __ \| |_| |_\ ___/| | \/
|
||||
|___|___| /____ > |__| (____ /____/____/\___ >__|
|
||||
\/ \/ \/ \/
|
||||
|
||||
|
||||
EOT
|
||||
echo -n "${COLOR_RESET}"
|
||||
echo -n "${COLOR_RESET}"
|
||||
}
|
||||
|
||||
showHelp() {
|
||||
[ $# -gt 0 ] && echo "$*" && echo ""
|
||||
# Zeigt die Hilfe an
|
||||
show_help() {
|
||||
[[ $# -gt 0 ]] && echo "$*" && echo ""
|
||||
|
||||
cat <<-EOT
|
||||
cat <<-EOT
|
||||
Logseq Installer
|
||||
================
|
||||
Erlaubte Optionen:
|
||||
@@ -60,119 +114,207 @@ showHelp() {
|
||||
|
||||
Geschrieben von Tim Peters
|
||||
---> https://git.tim-peters.org/Tim/Logseq-Installer
|
||||
|
||||
EOT
|
||||
|
||||
exit 1
|
||||
exit 1
|
||||
}
|
||||
|
||||
getVersionLatest() {
|
||||
VERSION_LATEST="$( wget -qO - https://github.com/logseq/logseq/releases/latest | grep -Poi "releases/tag/\K\d+\.\d+\.\d+" | head -n 1 )"
|
||||
[ -n "$VERSION_LATEST" ] || err "Konnte nicht ermittelt werden"
|
||||
# Prüft, ob ein Befehl verfügbar ist
|
||||
require_command() {
|
||||
local cmd="$1"
|
||||
command -v "${cmd}" >/dev/null 2>&1 || err "Befehl '${cmd}' nicht gefunden. Bitte installieren Sie ${cmd}."
|
||||
}
|
||||
|
||||
getVersionCurrent() {
|
||||
local FILENAME
|
||||
# =============================================================================
|
||||
# VERSIONEN-ERMITTELN
|
||||
# =============================================================================
|
||||
|
||||
FILENAME="$( ls -1rt ~/.local/bin/Logseq-*AppImage 2>/dev/null | head -n1 )"
|
||||
if [ -n "$FILENAME" ]; then
|
||||
VERSION_CURRENT="$( echo "$FILENAME" | grep -Poi "Logseq-linux-x64-\K\d+\.\d+\.\d+" | head -n 1 )"
|
||||
else
|
||||
VERSION_CURRENT=
|
||||
fi
|
||||
#[ -n "$VERSION_CURRENT" ] || err "Konnte nicht ermittelt werden"
|
||||
# Ermittelt die neueste verfügbare Version von GitHub
|
||||
get_latest_version() {
|
||||
info "Ermittle neueste verfügbare Version..."
|
||||
VERSION_LATEST=$(
|
||||
wget -qO- "${RELEASE_API_URL}" |
|
||||
grep -Po 'releases/tag/\K\d+\.\d+\.\d+' |
|
||||
head -n1
|
||||
)
|
||||
[[ -n "${VERSION_LATEST}" ]] || err "Konnte die neueste Version nicht ermitteln."
|
||||
success "Neueste Version: ${VERSION_LATEST}"
|
||||
}
|
||||
|
||||
getLatest() {
|
||||
local URL
|
||||
URL="https://github.com/logseq/logseq/releases/download/$VERSION_LATEST/Logseq-linux-x64-$VERSION_LATEST.AppImage"
|
||||
local DIR_DEST
|
||||
DIR_DEST=~/.local/bin
|
||||
local FILE_LINK
|
||||
FILE_LINK=~/.local/bin/Logseq
|
||||
local FILE_TMP
|
||||
FILE_TMP="$( mktemp )"
|
||||
local FILE_DELETE
|
||||
# Ermittelt die aktuell installierte Version
|
||||
get_current_version() {
|
||||
info "Ermittle installierte Version..."
|
||||
local latest_appimage
|
||||
latest_appimage=$(find "${INSTALL_DIR}" -maxdepth 1 -name "${APP_IMAGE_PATTERN}" -type f -printf '%T@ %p\n' 2>/dev/null | sort -n | tail -n1 | cut -d' ' -f2-)
|
||||
|
||||
FILENAME_LOGSEQ="$( basename "$URL" )"
|
||||
mkdir -p $DIR_DEST
|
||||
wget "$URL" --show-progress -qO "$FILE_TMP"
|
||||
mv "$FILE_TMP" "$DIR_DEST/$FILENAME_LOGSEQ"
|
||||
chmod u+x "$DIR_DEST/$FILENAME_LOGSEQ"
|
||||
|
||||
# Veraltete Versionen löschen
|
||||
FILE_DELETE="$( find ~/.local/bin -iname Logseq-\*AppImage | grep -v "$FILENAME_LOGSEQ" )" || true
|
||||
[ -n "$FILE_DELETE" ] && rm -f "$FILE_DELETE"
|
||||
[ -L "$FILE_LINK" ] && rm -f "$FILE_LINK"
|
||||
|
||||
ln -s "$DIR_DEST/$FILENAME_LOGSEQ" "$FILE_LINK"
|
||||
if [[ -n "${latest_appimage}" ]]; then
|
||||
VERSION_CURRENT=$(basename "${latest_appimage}" | grep -Po 'Logseq-linux-x64-\K\d+\.\d+\.\d+' | head -n1)
|
||||
[[ -n "${VERSION_CURRENT}" ]] && success "Installierte Version: ${VERSION_CURRENT}" || warn "Installierte Version konnte nicht bestimmt werden."
|
||||
else
|
||||
VERSION_CURRENT=""
|
||||
info "Logseq ist nicht installiert."
|
||||
fi
|
||||
}
|
||||
|
||||
doUninstall() {
|
||||
rm -f ~/.local/bin/Logseq* "${HOME}"/.local/share/applications/logseq.*
|
||||
update-desktop-database ~/.local/share/applications
|
||||
# =============================================================================
|
||||
# INSTALLATION
|
||||
# =============================================================================
|
||||
|
||||
echo "Logseq wurde deinstalliert"
|
||||
exit
|
||||
# Lädt die neueste Version herunter und installiert sie
|
||||
download_and_install() {
|
||||
local download_url="${DOWNLOAD_BASE_URL}/${VERSION_LATEST}/Logseq-linux-x64-${VERSION_LATEST}.AppImage"
|
||||
local tmp_file
|
||||
tmp_file=$(mktemp)
|
||||
|
||||
info "Lade Logseq ${VERSION_LATEST} herunter..."
|
||||
mkdir -p "${INSTALL_DIR}"
|
||||
|
||||
wget --show-progress -qO "${tmp_file}" "${download_url}" || err "Download fehlgeschlagen."
|
||||
|
||||
FILENAME_LOGSEQ=$(basename "${download_url}")
|
||||
mv "${tmp_file}" "${INSTALL_DIR}/${FILENAME_LOGSEQ}" || err "Verschieben der Datei fehlgeschlagen."
|
||||
chmod u+x "${INSTALL_DIR}/${FILENAME_LOGSEQ}" || err "Berechtigungen setzen fehlgeschlagen."
|
||||
|
||||
# Alte Versionen entfernen
|
||||
cleanup_old_versions
|
||||
|
||||
# Symlink erstellen/aktualisieren
|
||||
ln -sf "${INSTALL_DIR}/${FILENAME_LOGSEQ}" "${INSTALL_DIR}/Logseq" || err "Symlink erstellen fehlgeschlagen."
|
||||
success "Logseq ${VERSION_LATEST} erfolgreich installiert."
|
||||
}
|
||||
|
||||
createDesktop() {
|
||||
local FILE_PNG=${HOME}/.local/share/applications/logseq.png
|
||||
[ -f "$FILE_PNG" ] || wget https://raw.githubusercontent.com/logseq/logseq/master/resources/icons/logseq.png -qO "$FILE_PNG"
|
||||
# Entfernt alte AppImage-Versionen
|
||||
cleanup_old_versions() {
|
||||
local current_file="${INSTALL_DIR}/${FILENAME_LOGSEQ}"
|
||||
find "${INSTALL_DIR}" -maxdepth 1 -name "${APP_IMAGE_PATTERN}" -type f ! -path "${current_file}" -delete 2>/dev/null || true
|
||||
|
||||
cat > ~/.local/share/applications/logseq.desktop <<-EOF
|
||||
# Alten Symlink entfernen falls vorhanden
|
||||
[[ -L "${INSTALL_DIR}/Logseq" ]] && rm -f "${INSTALL_DIR}/Logseq"
|
||||
}
|
||||
|
||||
# Erstellt die Desktop-Datei
|
||||
create_desktop_entry() {
|
||||
info "Erstelle Desktop-Eintrag..."
|
||||
|
||||
# Icon herunterladen falls nicht vorhanden
|
||||
[[ -f "${ICON_FILE}" ]] || {
|
||||
info "Lade Icon herunter..."
|
||||
wget -qO "${ICON_FILE}" "${LOGO_URL}" || warn "Icon konnte nicht heruntergeladen werden."
|
||||
}
|
||||
|
||||
cat > "${DESKTOP_FILE}" <<-EOF
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Name=Logseq
|
||||
Comment=Wissensmanagement mit Logseq
|
||||
Exec=${HOME}/.local/bin/$FILENAME_LOGSEQ --no-sandbox
|
||||
Icon=${HOME}/.local/share/applications/logseq.png
|
||||
Exec=${HOME}/.local/bin/${FILENAME_LOGSEQ} --no-sandbox
|
||||
Icon=${ICON_FILE}
|
||||
Type=Application
|
||||
Categories=Office;
|
||||
X-GNOME-SingleWindow=true
|
||||
SingleMainWindow=true
|
||||
EOF
|
||||
|
||||
update-desktop-database ~/.local/share/applications
|
||||
update-desktop-database "${DESKTOP_DIR}" 2>/dev/null || true
|
||||
success "Desktop-Eintrag erstellt."
|
||||
}
|
||||
|
||||
optspec=":her-:"
|
||||
while getopts "${optspec}" OPT; do
|
||||
[ "${OPT}" = " " ] && continue
|
||||
if [ "${OPT}" = "-" ]; then
|
||||
OPT="${OPTARG%%=*}"
|
||||
OPTARG="${OPTARG#$OPT}"
|
||||
OPTARG="${OPTARG#=}"
|
||||
fi
|
||||
case "${OPT}" in
|
||||
h | hilfe ) showHelp ;;
|
||||
e | entfernen ) doUninstall ;;
|
||||
r | root ) ALLOW_ROOT=true ;;
|
||||
[^\?]* ) showHelp "Unbekannte Option: --${OPT}"; exit 2 ;;
|
||||
\? ) showHelp "Unbekannte Option: -${OPTARG}"; exit 2 ;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
# Deinstalliert Logseq vollständig
|
||||
uninstall_logseq() {
|
||||
info "Deinstalliere Logseq..."
|
||||
|
||||
if [ "$( whoami )" = root -a "$ALLOW_ROOT" = false ]; then
|
||||
showHelp "Die Installation sollte nicht als root erfolgen"
|
||||
exit 1
|
||||
fi
|
||||
rm -f "${INSTALL_DIR}/Logseq"*
|
||||
rm -f "${DESKTOP_DIR}/logseq."*
|
||||
update-desktop-database "${DESKTOP_DIR}" 2>/dev/null || true
|
||||
|
||||
showLogo
|
||||
echo "Ermitteln der verfügbaren Versionen"
|
||||
getVersionLatest
|
||||
getVersionCurrent
|
||||
echo "Neuste verfügbare Version...... $COLOR_GREEN$VERSION_LATEST$COLOR_RESET"
|
||||
echo "Derzeit installierte Version... $COLOR_GREEN${VERSION_CURRENT:-${COLOR_RED}Logseq ist nicht installiert}$COLOR_RESET"
|
||||
success "Logseq wurde vollständig deinstalliert."
|
||||
exit 0
|
||||
}
|
||||
|
||||
[ "$VERSION_CURRENT" != "$VERSION_LATEST" ] || exit
|
||||
# Prüft ob Logseq läuft
|
||||
check_running() {
|
||||
if pgrep -ifcx "${INSTALL_DIR}/Logseq" >/dev/null; then
|
||||
err "Logseq läuft noch. Bitte beenden Sie Logseq vor dem Update."
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "$( pgrep -ifcx ~/.local/bin/Logseq )" -ne 0 ]; then
|
||||
err "Logseq sollte erst geschlossen werden, bevor das Update eingespielt wird"
|
||||
fi
|
||||
# =============================================================================
|
||||
# MAIN
|
||||
# =============================================================================
|
||||
|
||||
echo "Logseq Download gestartet"
|
||||
getLatest
|
||||
createDesktop
|
||||
echo "Logseq wurde installiert"
|
||||
main() {
|
||||
# Abhängigkeiten prüfen
|
||||
require_command "wget"
|
||||
require_command "pgrep"
|
||||
require_command "find"
|
||||
|
||||
# Kommandozeilenargumente parsen
|
||||
parse_arguments "$@"
|
||||
|
||||
# Root-Prüfung
|
||||
check_root_permissions
|
||||
|
||||
# Logo anzeigen
|
||||
show_logo
|
||||
|
||||
# Versionen ermitteln
|
||||
get_latest_version
|
||||
get_current_version
|
||||
|
||||
# Versionsvergleich
|
||||
info "Neueste verfügbare Version...... ${COLOR_GREEN}${VERSION_LATEST}${COLOR_RESET}"
|
||||
info "Derzeit installierte Version... ${COLOR_GREEN}${VERSION_CURRENT:-${COLOR_RED}Logseq ist nicht installiert${COLOR_RESET}}"
|
||||
|
||||
# Bereits aktuell?
|
||||
if [[ "${VERSION_CURRENT}" == "${VERSION_LATEST}" ]]; then
|
||||
success "Logseq ist bereits auf dem neuesten Stand."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Prüfen ob Logseq läuft
|
||||
check_running
|
||||
|
||||
# Installation durchführen
|
||||
download_and_install
|
||||
create_desktop_entry
|
||||
|
||||
success "Logseq wurde erfolgreich installiert/aktualisiert."
|
||||
}
|
||||
|
||||
# Parst Kommandozeilenargumente
|
||||
parse_arguments() {
|
||||
local optspec=":her-:"
|
||||
local OPT OPTARG
|
||||
|
||||
while getopts "${optspec}" OPT; do
|
||||
[[ "${OPT}" == " " ]] && continue
|
||||
|
||||
if [[ "${OPT}" == "-" ]]; then
|
||||
OPT="${OPTARG%%=*}"
|
||||
OPTARG="${OPTARG#"${OPT}"}"
|
||||
OPTARG="${OPTARG#=}"
|
||||
fi
|
||||
|
||||
case "${OPT}" in
|
||||
h | hilfe) show_help ;;
|
||||
e | entfernen) uninstall_logseq ;;
|
||||
r | root) ALLOW_ROOT=true ;;
|
||||
\?) show_help "Unbekannte Option: -${OPTARG}" ;;
|
||||
*) show_help "Unbekannte Option: --${OPT}" ;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND - 1))
|
||||
}
|
||||
|
||||
# Prüft Root-Berechtigungen
|
||||
check_root_permissions() {
|
||||
if [[ "$(whoami)" == "root" && "${ALLOW_ROOT}" == "false" ]]; then
|
||||
show_help "Die Installation sollte nicht als root erfolgen (Option -r/--root erlaubt es)."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# LETS GO
|
||||
# =============================================================================
|
||||
|
||||
main "$@"
|
||||
|
||||
Reference in New Issue
Block a user