#!/bin/bash
#
# Copyright (C) 2003-2025 by Intevation GmbH
# Authors:
# Thomas Arendsen Hein <thomas@intevation.de>
# Sascha Wilde <wilde@intevation.de>
#
# Contributors:
# Ole Arendsen Hein: support for apk and xbps
#
# This program is free software under the GPL (>=v2)
# Read the file COPYING coming with the software for details.

# Das System-Logbuch /etc/logbuch.txt
#
#   In der Datei /etc/logbuch.txt sollten alle Änderungen am System
#   eingetragen werden. Dabei werden zusammengehörige Änderungen in
#   einem Block zusammengefasst, der mit Datum und ausführender Person
#   beginnt. Innerhalb eines Blockes sind die Aktionen chronologisch
#   sortiert, neuere Blöcke werden aber über älteren eingefügt.
#
#   Durch Seten der Umgebungsvariable LOGBUCH kann eine andere Datei
#   als /etc/logbuch.txt für das Logbuch gewáhlt werden.
#
# Tools zur Pflege des Logbuchs
#
#   Dieses Skript dient zur halbautomatischen Pflege des Logbuchs.
#   Falls kein Logbuch existiert, wird automatisch ein neues angelegt.
#
#   logbuch [Ein Text] -- erstellt einen neuen Eintrag im Logbuch.
#   Optional kann ein Text angegeben werden, der eingetragen wird.
#
#   Zusätzlich existiert der Kurzbefehl "log" mit identischer Funktion
#   zu "logbuch". Der kurze Name kann aber nicht immer genutzt werden,
#   z.B. in der zsh, die einen Befehl mit diesem Namen eingebaut hat.
#
#  APT spezifische Befehle:
#
#   apt-install [Paketname ...] -- Installiert oder entfernt die
#   angegebenen Debian-Pakete über apt-get. Die Paketliste muss ggf.
#   über "apt-get update" aktualisiert werden. Beispiele:
#
#     apt-install wget           # installiert das Paket "wget"
#     apt-install wget=1.8.1-6.1 # installiert "wget" Version 1.8.1-6.1
#     apt-install wget-          # entfernt "wget"
#     apt-install --purge wget-  # entfernt "wget" und seine Konfiguration
#
#   apt-upgrade -- Aktualisiert Debian-Pakete, von denen neuere
#   Versionen existieren, z.B. Sicherheits-Updates.
#
#  YUM spezifische Befehle:
#
#   yum-install [Paketname ...] -- Installiert die angegebenen
#   RPM-Pakete über yum.
#
#     yum-install wget           # installiert das Paket "wget"
#
#   yum-upgrade -- Aktualisiert alle RPM-Pakete, von denen neuere
#   Versionen existieren, z.B. Sicherheits-Updates.
#
#  PACMAN spezifische Befehle:
#
#   pacupg                  -- entspricht `pacman -Syu' :
#                              Aktualisiert alle Pakete, von denen neuere
#                              Versionen existieren, z.B. Sicherheits-Updates.
#                              Be aware of the Arch Way!
#
#   pacins  [Paketname ...] -- entspricht `pacman -S' :
#                              Installiert die angegebenen Pakete aus einem
#                              Repository.
#
#   pacfins [Paket ...]     -- entspricht `pacman -U' :
#                              Installiert die angegebenen Pakete aus dem
#                              Dateisystem.
#
#   pacre   [Paketname ...] -- entspricht `pacman -R' :
#                              Entfernt die angegebenen Pakete.
#
#   pacrem  [Paketname ...] -- entspricht `pacman -Rs'
#                              Entfernt die angegebenen Pakete und nicht
#                              länger benötigte Abhängigkeiten.
#
#   lpacman [Options ...]   -- entspricht `pacman [Options ...]'
#                              Führt packman mit den gegebenen Optionen aus
#                              und generiert einen Eintrag in das Logbuch mit
#                              den resultierenden Änderungen an den
#                              installierten Paketen.
#
#  APK spezifische Befehle:
#
#   apk-upgrade                  -- entspricht `apk -U upgrade' :
#                                   Aktualisiert alle Pakete, von denen neuere
#                                   Versionen existieren, z.B. Sicherheits-Updates.
#
#   apk-add      [Paketname ...] -- entspricht `apk add' :
#                                   Installiert die angegebenen Pakete aus einem
#                                   Repository.
#
#   apk-del      [Paketname ...] -- entspricht `apk del' :
#                                   Entfernt die angegebenen Pakete.
#                                   Kann mit `--purge` oder `-r` ausgeführt werden.
#  XBPS spezifische Befehle:
#
#   xb-upgrade                     -- entspricht `xbps-install -Su' :
#                                     Aktualisiert alle Pakete, von denen neuere
#                                     Versionen existieren, z.B. Sicherheits-Updates.
#
#   xb-install     [Paketname ...] -- entspricht `xbps-install' :
#                                     Installiert die angegebenen Pakete aus einem
#                                     Repository.
#
#   xb-remove      [Paketname ...] -- entspricht `xbps-remove' :
#                                     Entfernt die angegebenen Pakete.
#                                     Kann mit `-o oder `-R` ausgeführt werden.
#
#
# Installation des Skripts:
#
#   Dieses Skript muss unter dem Namen 'logbuch' in das gewünschte
#   Verzeichnis kopiert werden. Für die weiteren Funktionen müssen
#   symbolische Links angelegt werden:
#
#     ln -s logbuch apt-install && ln -s logbuch apt-upgrade
#
# Funktionen für den automatisierten Einsatz:
#
#   Wenn die Logbuch-Tools innerhalb anderer Skripte verwendet werden
#   sollen, kann es sinnvoll sein, dass für neue Einträge in das
#   Logbuch kein Editor interaktiv geöffnet wird.  Dies kann durch
#   das setzen der Umgebungsvariable LOGBUCH_BATCHMODE auf einen nicht
#   leeren String (z.B. "yes") erreicht werden.
#
#   Wenn die Umgebungsvariable FAKEROOT auf einen nicht leeren String
#   gesetzt wird, so wird die Prüfung, ob der aktuelle User root ist,
#   übersprungen.
#
#   Wenn die Umgebungsvariable LOGBUCH_APT_UPDATE nicht gesetzt ist oder
#   den Wert "yes" enthält, wird vor entsprechenden apt- oder
#   aptitude-Aufrufen ein "apt-get update" durchgeführt.
#
#   Wenn die Umgebungsvariable LOGBUCH_APT_CLEAN nicht gesetzt ist oder
#   den Wert "yes" enthält, wird nach entsprechenden apt- oder
#   aptitude-Aufrufen ein "apt-get clean" durchgeführt.
#
#======================================================================

# Die folgende Zeile ist potentiell sicherheitskritisch und sollte
# ggf.  auskommentiert werden -- sie ist aber nötig, damit
# z.B. Editoren, die nicht im Standard Pfad liegen gefunden werden.
# sascha <wilde@intevation.de>
ADDITIONAL_PATH=$PATH

PATH=$ADDITIONAL_PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

LOGBUCH="${LOGBUCH:-/etc/logbuch.txt}"
TMPFILE1=""
TMPFILE2=""

USE_AURA_AS_PACMAN="${USE_AURA_AS_PACMAN:-true}"

AUR_BUILD_PATH="${AUR_BUILD_PATH:-/var/tmp/aura-build}"
AUR_BUILD_USER="${AUR_BUILD_USER:-aurabuild}"

init() {
    if [ ! -f "$LOGBUCH" ]; then
        LOGBUCH_HOST="${LOGBUCH_HOST:-$(hostname -f 2>/dev/null)}" || LOGBUCH_HOST="$(hostname)"
        {
            echo "Logbuch fuer $LOGBUCH_HOST"
            echo
            echo -e "`date +'%d.%m.%Y'`\t${LOGBUCH_USER:-${EMAIL:-${LOGNAME:-?}}}"
            echo "* $LOGBUCH angelegt"
            echo "* Paketliste:"
            if [ -x /usr/bin/dpkg ]; then
              COLUMNS=300 dpkg -l|awk '$1 ~ /^ii$/ { print " ", $2, $3 }'
            elif [ -x /usr/bin/pacman ]; then
              pacman -Q | sort | sed 's/\(.*\)/  \1/'
            elif [ -x /bin/rpm ]; then
              rpm -qa --qf "  %{NAME} %{VERSION}-%{RELEASE}\n" | sort
            elif [ -x /sbin/apk ]; then
              apk list -I | cut -f1 -d ' ' | sed 's/^/  /' | sort
            elif [ -x /sbin/xbps-install ]; then
              xbps-query -l | awk '{ print "  "$2 }'
            fi
        } >> "$LOGBUCH" || exit $?
    fi

    VI="`type -p vim`"
    test "$VI" || VI="`type -p vi`"

    EMACS="`type -p emacs`"

    if [ -z "$VI" -a -z "$EMACS" ]; then
        echo "Bitte installieren Sie 'vim', einen anderen vi-Editor oder den Emacs." >&2
        exit 1
    fi

    if [ ! -w "$LOGBUCH" ]; then
        echo "Error: no write access to $LOGBUCH" >&2
        exit 1
    fi
}

# execute apt-get update and exit on errors
apt_get_update() {
    LOGBUCH_APT_UPDATE="${LOGBUCH_APT_UPDATE-yes}"
    if [ "$LOGBUCH_APT_UPDATE" != "yes" ] ; then
        return
    fi
    if [ "$LOGBUCH_BATCHMODE" ] ; then
        # Don't write to /dev/tty in batchmode, so that we can use it
        # in dockerfiles, where no tty is available...
        OUT=/dev/null
    else
        OUT=/dev/tty
    fi
    if apt-get update 2>&1 >$OUT | grep . >&2; then
        if [ "$LOGBUCH_BATCHMODE" ] ; then
            exit 100
        else
            echo "Press <Enter> to continue anyway, <Ctrl-C> to abort."
            read
       fi
    fi
}

# execute apt-get clean unless
apt_get_clean() {
    LOGBUCH_APT_CLEAN="${LOGBUCH_APT_CLEAN-yes}"
    if [ "$LOGBUCH_APT_CLEAN" = "yes" ] ; then
        apt-get clean
    fi
}

# apt_get_log logfile apt-command args
apt_get_log() {
    TMPFILE2=`tempfile "$TMPFILE2"` || exit 1
    apt-get -s "$@"|tee "$TMPFILE2"
    {
        echo -e "`date +'%d.%m.%Y'`\t${LOGBUCH_USER:-${EMAIL:-${LOGNAME:-?}}}"
        echo "* apt-get $@:"
        egrep '^(Inst|Remv|Purg) ' "$TMPFILE2" | sed 's/^/  /' | grep '' || exit 1
        echo
    } > "$TMPFILE1"
}

# aptitude_log logfile aptitude-command args
aptitude_log() {
    TMPFILE2=`tempfile "$TMPFILE2"` || exit 1
    aptitude -v -y -s "$@"|tee "$TMPFILE2"
    {
        echo -e "`date +'%d.%m.%Y'`\t${LOGBUCH_USER:-${EMAIL:-${LOGNAME:-?}}}"
        echo "* aptitude $@:"
        egrep '^(Inst|Remv|Purg) ' "$TMPFILE2" | sed 's/^/  /' | grep '' || exit 1
        echo
    } > "$TMPFILE1"
}

# format_diff pre-install-pkg-list post-install-pkg-list
format_diff() {
diff --unchanged-group-format='' \
--changed-group-format='@UPDATE:
%<@---
%>@END UPDATE
' \
--new-group-format='@NEW:
%>@END NEW
' \
--old-group-format='@REMOVED:
%<@END REMOVED
' \
--old-line-format='- %l
' \
--new-line-format='+ %l
' \
"$1" "$2" | \
awk 'function reset()
{
  oi=0; delete opkgs;
  ni=0; delete npkgs;
  delete overs; delete nvers;
}
/^@UPDATE:/{ prefix="  Updated"; reset() }
/^@---/{ }
/^@END UPDATE/{ for (i in npkgs) { print prefix, npkgs[i], "[" overs[npkgs[i]] "]", "=> (" nvers[npkgs[i]] ")" }}
/^@NEW:/{ prefix="  Installed"; reset() }
/^@END NEW/{ for (i in npkgs) { print prefix, npkgs[i], "(" nvers[npkgs[i]] ")" }}
/^@REMOVED:/{ prefix="  Removed"; reset() }
/^@END REMOVED/{ for (i in opkgs) { print prefix, opkgs[i], "[" overs[opkgs[i]] "]" }}
/^-/{opkgs[++oi]=$2;  overs[$2]=$3}
/^\+/{npkgs[++ni]=$2;  nvers[$2]=$3}
'
}

# do_n_log tool options
#
#  Invoke $tool with $options and put changes to the package list in
#  the logbuch.
do_n_log() {
    TMPFILE2=`tempfile "$TMPFILE2"` || exit 1
    TMPFILE3=`tempfile "$TMPFILE3"` || exit 1
    tool="$1"
    shift

    case "$tool" in
      "yum")
        rpm -qa --qf "%{NAME} %{VERSION}-%{RELEASE}\n"|sort > "$TMPFILE2"
        yum "$@"
        rpm -qa --qf "%{NAME} %{VERSION}-%{RELEASE}\n"|sort > "$TMPFILE3"
        ;;
      "pacman"|"aura")
        $tool -Q|sort > "$TMPFILE2"
        $tool "$@"
        $tool -Q|sort > "$TMPFILE3"
        ;;
    esac

    cmp -s "$TMPFILE2" "$TMPFILE3" && return 1
    {
        echo -e "`date +'%d.%m.%Y'`\t${LOGBUCH_USER:-${EMAIL:-${LOGNAME:-?}}}"
        echo -n "* $tool $@"
        if ! cmp -s "$TMPFILE2" "$TMPFILE3" ; then
            echo ":"
            format_diff "$TMPFILE2" "$TMPFILE3"
        else
          echo
        fi
        echo
    } > "$TMPFILE1"
}

yum_do_n_log() {
  do_n_log yum "$@"
}

pacman_do_n_log() {
  if [ -x /usr/bin/aura -a "$USE_AURA_AS_PACMAN" = true ] ;  then
      do_n_log aura "$@"
  else
    do_n_log pacman "$@"
  fi
}

aura_do_n_log() {
  do_n_log aura "$@"
}

# execute apk update and exit on errors
apk_update() {
    LOGBUCH_APK_UPDATE="${LOGBUCH_APK_UPDATE-yes}"
    if [ "$LOGBUCH_APK_UPDATE" != "yes" ] ; then
        return
    fi
    if [ "$LOGBUCH_BATCHMODE" ] ; then
        # Don't write to /dev/tty in batchmode, so that we can use it
        # in dockerfiles, where no tty is available...
        OUT=/dev/null
    else
        OUT=/dev/tty
    fi
    if apk update 2>&1 >$OUT | grep . >&2; then
        if [ "$LOGBUCH_BATCHMODE" ] ; then
            exit 100
        else
            echo "Press <Enter> to continue anyway, <Ctrl-C> to abort."
            read
       fi
    fi
}

# apk_log logfile apk-command args
apk_log() {
    TMPFILE2=`tempfile "$TMPFILE2"` || exit 1
    apk -s "$@"|tee "$TMPFILE2"
    {
        echo -e "`date +'%d.%m.%Y'`\t${LOGBUCH_USER:-${EMAIL:-${LOGNAME:-?}}}"
        echo "* apk $@:"
        egrep ' (Installing|Purging|Upgrading) ' "$TMPFILE2" | cut -d ' ' -f2- | sed 's/^/  /' | grep '' || exit 1
        echo
    } > "$TMPFILE1"
}


# execute xbps -S and exit on errors
xbps_sync() {
    LOGBUCH_XBPS_SYNC="${LOGBUCH_XBPS_SYNC-yes}"
    if [ "$LOGBUCH_XBPS_SYNC" != "yes" ] ; then
        return
    fi
    if [ "$LOGBUCH_BATCHMODE" ] ; then
        # Don't write to /dev/tty in batchmode, so that we can use it
        # in dockerfiles, where no tty is available...
        OUT=/dev/null
    else
        OUT=/dev/tty
    fi
    if xbps-install -S 2>&1 >$OUT | grep . >&2; then
        if [ "$LOGBUCH_BATCHMODE" ] ; then
            exit 100
        else
            echo "Press <Enter> to continue anyway, <Ctrl-C> to abort."
            read
       fi
    fi
}

# xbps_log logfile xbps-command args
xbps_log() {
    TMPFILE2=`tempfile "$TMPFILE2"` || exit 1
    xbps-"$@" -n | tee "$TMPFILE2"
    {
        echo -e "`date +'%d.%m.%Y'`\t${LOGBUCH_USER:-${EMAIL:-${LOGNAME:-?}}}"
        echo "* xbps-$@:"
        egrep ' (install|remove|update) ' "$TMPFILE2" | awk '{ print "  "$2,$1 }' | grep '' || exit 1
        echo
    } > "$TMPFILE1"
}

edit_logbuch() {
    unset DISPLAY
    DATEPATTERN='^[0-9]*\.[0-9]*\.[0-9]*'
    if [ "$LOGBUCH_BATCHMODE" ]; then
      # Yeah, the following code needs GNU sed, so what?
      sed -i "/$DATEPATTERN/{
                e cat $TMPFILE1
                : loop
                N
                b loop
              }" "$LOGBUCH"
    elif [ "$EMACS" -a \( -z "$VI" -o "$EDITOR" = "emacs" \) ]; then
      $EMACS -eval "(progn (find-file \"$LOGBUCH\")
                           (search-forward-regexp \"^[0-9]+\\\\.[0-9]+\\\\.[0-9]+\")
                           (move-beginning-of-line 1)
                           (insert-file-contents \"$TMPFILE1\"))"
    else
      $VI -c "1;/$DATEPATTERN/-1;r $TMPFILE1" "$LOGBUCH"
    fi
}

delete_tmpfile() {
    if [ -n "$TMPFILE1" ]; then
        rm -f "$TMPFILE1" && TMPFILE1=""
    fi
    if [ -n "$TMPFILE2" ]; then
        rm -f "$TMPFILE2" && TMPFILE2=""
    fi
}

cleanup() {
    echo "Abgebrochen."
    delete_tmpfile
    exit 0
}

tempfile() {
    if [ -n "$1" ]; then
        echo "$1"
    else
        mktemp "/tmp/logbuch.XXXXXXXXXX"
    fi
}

init "$@"

TMPFILE1=`tempfile "$TMPFILE1"` && {
    trap "cleanup" 1 2 3 7 10 13 15
    case "`basename \"$0\"`" in
        logbuch|log)
            {
                echo -e "`date +'%d.%m.%Y'`\t${LOGBUCH_USER:-${EMAIL:-${LOGNAME:-?}}}"
                echo "* $@"
                echo
            } > "$TMPFILE1"
            edit_logbuch
            ;;
        apt-install)
            apt_get_update
            apt_get_log install "$@"
            edit_logbuch
            if [ ! "$LOGBUCH_BATCHMODE" ] ; then
              echo "Press <Enter> to start installation, <Ctrl-C> to abort."
              read
            fi
            apt-get install "$@"
            apt_get_clean
            ;;
        apt-remove)
            apt_get_log remove "$@"
            edit_logbuch
            if [ ! "$LOGBUCH_BATCHMODE" ] ; then
              echo "Press <Enter> to start installation, <Ctrl-C> to abort."
              read
            fi
            apt-get remove "$@"
            ;;
        apt-autoremove)
            apt_get_log autoremove "$@"
            edit_logbuch
            echo "Press <Enter> to start removal, <Ctrl-C> to abort."
            read
            apt-get autoremove "$@"
            ;;
        apt-build-dep)
            apt_get_update
            apt_get_log build-dep "$@"
            edit_logbuch
            apt-get build-dep "$@"
            ;;
        apt-upgrade)
            apt_get_update
            apt_get_log upgrade "$@"
            edit_logbuch
            apt-get upgrade "$@"
            apt_get_clean
            ;;
        apt-dist-upgrade)
            apt_get_update
            apt_get_log dist-upgrade "$@"
            edit_logbuch
            apt-get dist-upgrade "$@"
            apt_get_clean
            ;;
        aptitude-install)
            apt_get_update
            aptitude_log install "$@"
            edit_logbuch
            aptitude install "$@"
            apt_get_clean
            ;;
        aptitude-remove)
            apt_get_update
            aptitude_log remove "$@"
            edit_logbuch
            aptitude remove "$@"
            ;;
        aptitude-upgrade)
            apt_get_update
            aptitude_log upgrade "$@"
            edit_logbuch
            aptitude upgrade "$@"
            apt_get_clean
            ;;
        aptitude-dist-upgrade)
            apt_get_update
            aptitude_log dist-upgrade "$@"
            edit_logbuch
            aptitude dist-upgrade "$@"
            apt_get_clean
            ;;
        yum-install)
            yum_do_n_log install "$@" && \
            edit_logbuch
            ;;
        yum-remove)
            yum_do_n_log remove "$@" && \
            edit_logbuch
            ;;
        yum-upgrade)
            yum_do_n_log upgrade "$@" && \
            edit_logbuch
            ;;
        yum-upgrade-to)
            yum_do_n_log upgrade-to "$@" && \
            edit_logbuch
            ;;
        yum-update)
            yum_do_n_log update "$@" && \
            edit_logbuch
            ;;
        yum-update-to)
            yum_do_n_log update-to "$@" && \
            edit_logbuch
            ;;
        yum-distro-sync)
            yum_do_n_log distro-sync "$@" && \
            edit_logbuch
            ;;
        yum-groupinstall)
            yum_do_n_log groupinstall "$@" && \
            edit_logbuch
            ;;
        yum-groupupdate)
            yum_do_n_log groupupdate "$@" && \
            edit_logbuch
            ;;
        yum-groupremove)
            yum_do_n_log groupremove "$@" && \
            edit_logbuch
            ;;
        yum-localinstall)
            yum_do_n_log localinstall "$@" && \
            edit_logbuch
            ;;
        yum-localupdate)
            yum_do_n_log localupdate "$@" && \
            edit_logbuch
            ;;
        yum-downgrade)
            yum_do_n_log downgrade "$@" && \
            edit_logbuch
            ;;
        yum-autoremove)
            yum_do_n_log autoremove "$@" && \
            edit_logbuch
            ;;
        pacupg)
          pacman_do_n_log -Syu "$@" && \
          edit_logbuch
          ;;
        pacins)
          pacman_do_n_log -S "$@" && \
          edit_logbuch
          ;;
        pacfins)
          pacman_do_n_log -U "$@" && \
          edit_logbuch
          ;;
        pacre)
          pacman_do_n_log -R "$@" && \
          edit_logbuch
          ;;
        pacrem)
          pacman_do_n_log -Rs "$@" && \
          edit_logbuch
          ;;
        lpacman)
          pacman_do_n_log "$@" && \
          edit_logbuch
          ;;
        aurins)
          if [ ! -e "$AUR_BUILD_PATH" ] ; then
              mkdir -m 755 -p "$AUR_BUILD_PATH"
              chown "$AUR_BUILD_USER" "$AUR_BUILD_PATH"
          fi
          aura_do_n_log -A "$@" --build "$AUR_BUILD_PATH" --builduser="$AUR_BUILD_USER" && \
          edit_logbuch
          ;;
        aurupg)
          [ -e "$AUR_BUILD_PATH" ] || mkdir -p "$AUR_BUILD_PATH"
          aura_do_n_log -Akua "$@" --build "$AUR_BUILD_PATH" --builduser="$AUR_BUILD_USER" && \
          edit_logbuch
          ;;
        laura)
          aura_do_n_log "$@" --build "$AUR_BUILD_PATH" --builduser="$AUR_BUILD_USER" && \
          edit_logbuch
          ;;
        apk-add)
          apk_update
          apk_log add "$@"
          edit_logbuch
          if [ ! "$LOGBUCH_BATCHMODE" ] ; then
            echo "Press <Enter> to start installation, <Ctrl-C> to abort."
            read
          fi
          apk add "$@"
          ;;
        apk-del)
          apk_log del "$@"
          edit_logbuch
          if [ ! "$LOGBUCH_BATCHMODE" ] ; then
            echo "Press <Enter> to start removal, <Ctrl-C> to abort."
            read
          fi
          apk del "$@"
          ;;
        apk-upgrade)
          apk_update
          apk_log upgrade "$@"
          edit_logbuch
          if [ ! "$LOGBUCH_BATCHMODE" ] ; then
            echo "Press <Enter> to start upgrade, <Ctrl-C> to abort."
            read
          fi
          apk upgrade "$@"
          ;;
        xb-install)
          xbps_sync
          xbps_log install "$@"
          edit_logbuch
          if [ ! "$LOGBUCH_BATCHMODE" ] ; then
            echo "Press <Enter> to start installation, <Ctrl-C> to abort."
            read
          fi
          xbps-install "$@"
          ;;
        xb-remove)
          xbps_log remove "$@"
          edit_logbuch
          if [ ! "$LOGBUCH_BATCHMODE" ] ; then
            echo "Press <Enter> to start removal, <Ctrl-C> to abort."
            read
          fi
          xbps-remove "$@"
          ;;
        xb-upgrade)
          xbps_sync
          xbps_log install -u "$@"
          edit_logbuch
          if [ ! "$LOGBUCH_BATCHMODE" ] ; then
            echo "Press <Enter> to start upgrade, <Ctrl-C> to abort."
            read
          fi
          xbps-install -u "$@"
          ;;

        logbuch-installer)
            INSTALL_PATH="${1:-/usr/local/bin}"
            REMOVE_PATH="/usr/local/sbin"
            TOOLS="log"
            APT_TOOLS="apt-install apt-remove apt-autoremove apt-build-dep apt-upgrade\
                   apt-dist-upgrade aptitude-install aptitude-remove\
                   aptitude-upgrade aptitude-dist-upgrade"
            YUM_TOOLS="yum-install yum-remove yum-upgrade yum-upgrade-to yum-update\
                   yum-update-to yum-distro-sync yum-groupinstall yum-groupupdate\
                   yum-groupremove yum-localinstall yum-localupdate yum-downgrade\
                   yum-autoremove"
            PACMAN_TOOLS="pacupg pacins pacfins pacre pacrem lpacman"
            AURA_TOOLS="aurins aurupg laura"
            APK_TOOLS="apk-add apk-del apk-upgrade"
            XBPS_TOOLS="xb-install xb-remove xb-upgrade"
            if [ -f /etc/centos-release -o -f /etc/redhat-release  ] ; then
              TOOLS+=" $YUM_TOOLS"
            elif [ -f /etc/arch-release ] ; then
                TOOLS+=" $PACMAN_TOOLS"
                if [ -x /usr/bin/aura ] ; then
                    TOOLS+=" $AURA_TOOLS"
                fi
            elif [ -x /sbin/apk ]; then
                TOOLS+=" $APK_TOOLS"
            elif [ -x /sbin/xbps-install ]; then
                TOOLS+=" $XBPS_TOOLS"
            else
              TOOLS+=" $APT_TOOLS"
            fi
            echo "Installing logbuch tools to $INSTALL_PATH"
            cp "$0" "$INSTALL_PATH/logbuch"
            chmod 755 "$INSTALL_PATH/logbuch"
            for tool in $TOOLS; do
                [ $# -eq 0 -a -e "$REMOVE_PATH/$tool" ] && rm "$REMOVE_PATH/$tool"
                ln -sf logbuch "$INSTALL_PATH/$tool"
            done
            [ $# -eq 0 -a -e "$REMOVE_PATH/logbuch" ] && rm "$REMOVE_PATH/logbuch"
            {
                echo -e "`date +'%d.%m.%Y'`\t${LOGBUCH_USER:-${EMAIL:-${LOGNAME:-?}}}"
                echo "* Logbuch-Tools nach $INSTALL_PATH installiert"
                echo
            } > "$TMPFILE1"
            edit_logbuch
            ;;
        *)
            echo "Not implemented: $0" >&2
            exit 1
            ;;
    esac
    delete_tmpfile
}

exit 0
