#!/bin/bash # Logseq Installer - Installiert und aktualisiert Logseq auf Linux-Systemen # Autor: Tim Peters # Repository: https://git.tim-peters.org/Tim/Logseq-Installer # ============================================================================= # KONSTANTEN UND KONFIGURATION # ============================================================================= 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 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}" >&2 exit 1 } # 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' .____ | | ____ ____ ______ ____ ______ | | / _ \ / ___\/ ___// __ \/ ____/ | |__( <_> ) /_/ >___ \\ ___< <_| | |_______ \____/\___ /____ >\___ >__ | \/ /_____/ \/ \/ |__| EOT echo -n "${COLOR_YELLOW}" cat <<-'EOT' .___ __ .__ .__ | | ____ _______/ |______ | | | | ___________ | |/ \ / ___/\ __\__ \ | | | | _/ __ \_ __ \ | | | \\___ \ | | / __ \| |_| |_\ ___/| | \/ |___|___| /____ > |__| (____ /____/____/\___ >__| \/ \/ \/ \/ EOT echo -n "${COLOR_RESET}" } # Zeigt die Hilfe an show_help() { [[ $# -gt 0 ]] && echo "$*" && echo "" cat <<-EOT Logseq Installer ================ Erlaubte Optionen: -h | --hilfe --- Zeigt diese Hilfe an -e | --entfernen --- Deinstalliert Logseq -r | --root --- Erlaubt die Installation als root Geschrieben von Tim Peters ---> https://git.tim-peters.org/Tim/Logseq-Installer EOT exit 1 } # 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}." } # ============================================================================= # VERSIONEN-ERMITTELN # ============================================================================= # 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}" } # 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-) 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 } # ============================================================================= # INSTALLATION # ============================================================================= # 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." } # 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 # 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=${ICON_FILE} Type=Application Categories=Office; X-GNOME-SingleWindow=true SingleMainWindow=true EOF update-desktop-database "${DESKTOP_DIR}" 2>/dev/null || true success "Desktop-Eintrag erstellt." } # Deinstalliert Logseq vollständig uninstall_logseq() { info "Deinstalliere Logseq..." rm -f "${INSTALL_DIR}/Logseq"* rm -f "${DESKTOP_DIR}/logseq."* update-desktop-database "${DESKTOP_DIR}" 2>/dev/null || true success "Logseq wurde vollständig deinstalliert." exit 0 } # 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 } # ============================================================================= # MAIN # ============================================================================= 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 "$@"