Refactoring & portable Testpfade

This commit is contained in:
Tim
2026-07-06 21:51:48 +02:00
parent 9ed66dacbc
commit fc37f44d26
9 changed files with 246 additions and 206 deletions
+105 -69
View File
@@ -7,18 +7,26 @@
# KONSTANTEN UND KONFIGURATION
# =============================================================================
# Farb-Codes für die Terminal-Ausgabe
readonly COLOR_RED=$(tput setaf 1)
readonly COLOR_GREEN=$(tput setaf 2)
readonly COLOR_YELLOW=$(tput setaf 3)
readonly COLOR_RESET=$(tput sgr0)
# Standardwerte
readonly ALLOW_ROOT_DEFAULT=false
# Pfad-Konstanten
readonly INSTALL_DIR="${HOME}/.local/bin"
readonly DESKTOP_DIR="${HOME}/.local/share/applications"
readonly SYMLINK_PATH="${INSTALL_DIR}/Logseq"
# URLs
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"
# Dateinamen-Muster
readonly APP_NAME="Logseq"
readonly APP_IMAGE_PATTERN="Logseq-linux-x64-*.AppImage"
readonly DESKTOP_FILE="${DESKTOP_DIR}/logseq.desktop"
@@ -37,9 +45,10 @@ FILENAME_LOGSEQ=""
# FEHLERBEHANDLUNG
# =============================================================================
# Fehlerbehandlung für unbehandelte Fehler
# ERR-Trap: Wird bei jedem unbehandelten Befehlsfehler aktiviert
trap 'handle_error' ERR
# Wird durch die ERR-Trap bei unbehandelten Fehlern aufgerufen
handle_error() {
local exit_code=$?
err "Ein unerwarteter Fehler ist aufgetreten (Exit-Code: ${exit_code})"
@@ -50,32 +59,36 @@ handle_error() {
exit "${exit_code}"
}
# Ausgabe von Fehlermeldungen und Beenden
# =============================================================================
# AUSGABE-HELPER
# =============================================================================
# Gibt eine Fehlermeldung in Rot aus und beendet das Skript mit Code 1
err() {
echo "${COLOR_RED}$*${COLOR_RESET}" >&2
exit 1
}
# Ausgabe von Warnungen
# Gibt eine Warnung in Gelb auf stderr aus (ohne Abbruch)
warn() {
echo "${COLOR_YELLOW}$*${COLOR_RESET}" >&2
}
# Ausgabe von Erfolgsmeldungen
# Gibt eine Erfolgsmeldung in Grün aus
success() {
echo "${COLOR_GREEN}$*${COLOR_RESET}"
}
# Ausgabe von Info-Meldungen
# Gibt eine Info-Meldung aus (ohne Farbcode)
info() {
echo "$*"
}
# =============================================================================
# HILFSFUNKTIONEN
# ALLGEMEINE HILFSFUNKTIONEN
# =============================================================================
# Zeigt das Logo an
# Zeigt das ASCII-Logo an
show_logo() {
echo -n "${COLOR_GREEN}"
cat <<-'EOT'
@@ -99,12 +112,15 @@ show_logo() {
echo -n "${COLOR_RESET}"
}
# Zeigt die Hilfe an
# Zeigt die Hilfe an; optional wird vorher eine Fehlermeldung ausgegeben
show_help() {
[[ $# -gt 0 ]] && echo "$*" && echo ""
if [[ $# -gt 0 ]]; then
echo "$*"
echo ""
fi
cat <<-EOT
Logseq Installer
${APP_NAME} Installer
================
Erlaubte Optionen:
@@ -118,19 +134,20 @@ show_help() {
exit 1
}
# Prüft, ob ein Befehl verfügbar ist
# Stellt sicher, dass ein benötigter 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
# VERSIONSERMITTLUNG
# =============================================================================
# Ermittelt die neueste verfügbare Version von GitHub
get_latest_version() {
info "Ermittle neueste verfügbare Version..."
# Release-Seite abrufen und Versionsnummer aus dem Redirect-Link extrahieren
VERSION_LATEST=$(
wget -qO- "${RELEASE_API_URL}" |
grep -Po 'releases/tag/\K\d+\.\d+\.\d+' |
@@ -140,15 +157,25 @@ get_latest_version() {
success "Neueste Version: ${VERSION_LATEST}"
}
# Ermittelt die aktuell installierte Version
# Ermittelt die aktuell installierte Version anhand des neuesten AppImage
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-)
# Neueste AppImage-Datei nach Änderungszeitpunkt (mtime) bestimmen
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."
if [[ -n "${VERSION_CURRENT}" ]]; then
success "Installierte Version: ${VERSION_CURRENT}"
else
warn "Installierte Version konnte nicht bestimmt werden."
fi
else
VERSION_CURRENT=""
info "Logseq ist nicht installiert."
@@ -156,57 +183,55 @@ get_current_version() {
}
# =============================================================================
# INSTALLATION
# INSTALLATION & AKTUALISIERUNG
# =============================================================================
# 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}"
# Temp-Datei im Installationsverzeichnis anlegen, damit mv kein Dateisystem-Wechsel benötigt
tmp_file=$(mktemp -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."
mv -f "${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
# Alte Versionen entfernen und Symlink auf die neue Version aktualisieren
cleanup_old_versions
# Symlink erstellen/aktualisieren
ln -sf "${INSTALL_DIR}/${FILENAME_LOGSEQ}" "${INSTALL_DIR}/Logseq" || err "Symlink erstellen fehlgeschlagen."
ln -sf "${INSTALL_DIR}/${FILENAME_LOGSEQ}" "${SYMLINK_PATH}" || err "Symlink erstellen fehlgeschlagen."
success "Logseq ${VERSION_LATEST} erfolgreich installiert."
}
# Entfernt alte AppImage-Versionen
# Entfernt alte AppImage-Versionen bis auf die aktuell installierte
cleanup_old_versions() {
local current_file="${INSTALL_DIR}/${FILENAME_LOGSEQ}"
# Alle AppImages außer der aktuellen Datei löschen
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
# Erstellt den Desktop-Eintrag für das Startmenü
create_desktop_entry() {
info "Erstelle Desktop-Eintrag..."
# Icon herunterladen falls nicht vorhanden
[[ -f "${ICON_FILE}" ]] || {
if [[ ! -f "${ICON_FILE}" ]]; then
info "Lade Icon herunter..."
wget -qO "${ICON_FILE}" "${LOGO_URL}" || warn "Icon konnte nicht heruntergeladen werden."
}
fi
cat > "${DESKTOP_FILE}" <<-EOF
[Desktop Entry]
Encoding=UTF-8
Name=Logseq
Comment=Wissensmanagement mit Logseq
Exec=${HOME}/.local/bin/${FILENAME_LOGSEQ} --no-sandbox
Exec=${INSTALL_DIR}/${FILENAME_LOGSEQ} --no-sandbox
Icon=${ICON_FILE}
Type=Application
Categories=Office;
@@ -222,21 +247,65 @@ create_desktop_entry() {
uninstall_logseq() {
info "Deinstalliere Logseq..."
rm -f "${INSTALL_DIR}/Logseq"*
rm -f "${DESKTOP_DIR}/logseq."*
# AppImage(s) und Symlink entfernen
rm -f "${SYMLINK_PATH}"
rm -f "${INSTALL_DIR}"/Logseq-linux-x64-*.AppImage
# Desktop-Eintrag und Icon entfernen
rm -f "${DESKTOP_FILE}" "${ICON_FILE}"
update-desktop-database "${DESKTOP_DIR}" 2>/dev/null || true
success "Logseq wurde vollständig deinstalliert."
exit 0
}
# Prüft ob Logseq läuft
# Prüft, ob Logseq gerade läuft (Update nur bei beendeter Instanz)
check_running() {
if pgrep -ifcx "${INSTALL_DIR}/Logseq" >/dev/null; then
# pgrep-Flags: -i (case-insensitive), -f (volle Kommandozeile),
# -c (Anzahl Treffer), -x (exakte Übereinstimmung der Kommandozeile)
if pgrep -ifcx "${SYMLINK_PATH}" >/dev/null; then
err "Logseq läuft noch. Bitte beenden Sie Logseq vor dem Update."
fi
}
# =============================================================================
# KOMMANDOZEILEN-ARGUMENTE & ROOT-PRÜFUNG
# =============================================================================
# Parst Kommandozeilenargumente (kurz und lang)
parse_arguments() {
local optspec=":her-:"
local OPT OPTARG
while getopts "${optspec}" OPT; do
[[ "${OPT}" == " " ]] && continue
# Lange Option (--wort oder --wort=wert) auflösen
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))
}
# Verhindert die Ausführung als root, außer wenn explizit erlaubt
check_root_permissions() {
if [[ "$(whoami)" == "root" && "${ALLOW_ROOT}" == "false" ]]; then
show_help "Die Installation sollte nicht als root erfolgen (Option -r/--root erlaubt es)."
fi
}
# =============================================================================
# MAIN
# =============================================================================
@@ -280,41 +349,8 @@ main() {
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
# EINSTIEGSPUNKT
# =============================================================================
main "$@"
main "$@"