#!/bin/bash # # Copyright (C) 2003-2009 by Intevation GmbH # Authors: # Thomas Arendsen Hein # Sascha Wilde # # 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. # # Tools zur Pflege des Logbuchs # # Dieses Skript dient zur halbautomatischen Pflege des Logbuchs. # Falls kein Logbuch existiert, wird automatisch ein neues angelegt. # # log [Ein Text] -- erstellt einen neuen Eintrag im Logbuch. # Optional kann ein Text angegeben werden, der eingetragen wird. # # 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. # # Installation des Skripts: # # Dieses Skript muss unter dem Namen 'log' in das gewünschte # Verzeichnis kopiert werden. Für die weiteren Funktionen müssen # Links angelegt werden: # # ln log apt-install && ln log 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 klein Editor interaktiver geöffnet wird. Dies kann durch # das setzen der Umgebungsvariable LOGBUCH_BATCHMODE auf einen nicht # leeren String (z.B. "yes") erreicht werden. #====================================================================== # 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 ADDITIONAL_PATH=$PATH PATH=$ADDITIONAL_PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin LOGBUCH="/etc/logbuch.txt" TMPFILE="" init() { if [ ! -f "$LOGBUCH" ]; then need_root "$@" { echo "Logbuch fuer ${LOGBUCH_HOST:-`hostname -f`}" echo echo -e "`date +'%d.%m.%Y'`\t${LOGBUCH_USER:-${EMAIL:-${LOGNAME:-?}}}" echo "* $LOGBUCH angelegt" if [ -x /usr/bin/dpkg ]; then echo "* Paketliste:" COLUMNS=300 dpkg -l|awk '$1 ~ /^ii$/ { print " ", $2, $3 }' 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 test -w "$LOGBUCH" || need_root "$@" } need_root() { if [ "`id -u`" -ne 0 ]; then delete_tmpfile echo "I need root access ..." exec su -c $0 root -- "$@" exit 0 fi } # execute apt-get update and exit on errors apt_get_update() { apt-get update 2>&1 >/dev/tty | grep . >&2 && exit 100 } # apt_get_log logfile apt-command args apt_get_log() { local TMPFILE="$1"; shift local TMPFILE2=`mktemp /tmp/apt-log.XXXXXXXXXX` || break 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 } > "$TMPFILE" rm -f "$TMPFILE2" } # aptitude_log logfile aptitude-command args aptitude_log() { local TMPFILE="$1"; shift local TMPFILE2=`mktemp /tmp/apt-log.XXXXXXXXXX` || break 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 } > "$TMPFILE" rm -f "$TMPFILE2" } edit_logbuch() { unset DISPLAY if [ "$LOGBUCH_BATCHMODE" ] then echo -e "1\n/^[0-9]*\.[0-9]*\.[0-9]*/\n-1r $1\nw" | ed /etc/logbuch.txt >/dev/null 2>&1 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 \"$1\"))" else $VI -c "1;/^[0-9]*\.[0-9]*\.[0-9]*/-1;r $1" "$LOGBUCH" fi } delete_tmpfile() { if [ -n "$TMPFILE" ]; then rm -f "$TMPFILE" && TMPFILE="" fi } cleanup() { echo "Abgebrochen." delete_tmpfile exit 0 } init "$@" TMPFILE=`mktemp /tmp/logbuch.XXXXXXXXXX` && { trap "cleanup" 1 2 3 7 10 13 15 case "`basename \"$0\"`" in log) { echo -e "`date +'%d.%m.%Y'`\t${LOGBUCH_USER:-${EMAIL:-${LOGNAME:-?}}}" echo "* $@" echo } > "$TMPFILE" edit_logbuch "$TMPFILE" ;; apt-install) need_root "$@" test /etc/apt/sources.list -nt /var/lib/apt/lists/lock && \ apt_get_update apt_get_log "$TMPFILE" install "$@" edit_logbuch "$TMPFILE" if [ ! "$LOGBUCH_BATCHMODE" ] ; then echo "Press to start installation, to abort." read fi apt-get install "$@" ;; apt-remove) need_root "$@" apt_get_log "$TMPFILE" remove "$@" edit_logbuch "$TMPFILE" if [ ! "$LOGBUCH_BATCHMODE" ] ; then echo "Press to start installation, to abort." read fi apt-get remove "$@" ;; apt-autoremove) need_root "$@" apt_get_log "$TMPFILE" autoremove "$@" edit_logbuch "$TMPFILE" echo "Press to start removal, to abort." read apt-get autoremove "$@" ;; apt-build-dep) need_root "$@" test /etc/apt/sources.list -nt /var/lib/apt/lists/lock && \ apt_get_update apt_get_log "$TMPFILE" build-dep "$@" edit_logbuch "$TMPFILE" apt-get build-dep "$@" ;; apt-upgrade) need_root "$@" apt_get_update apt_get_log "$TMPFILE" upgrade "$@" edit_logbuch "$TMPFILE" apt-get upgrade "$@" ;; apt-dist-upgrade) need_root "$@" apt_get_update apt_get_log "$TMPFILE" dist-upgrade "$@" edit_logbuch "$TMPFILE" apt-get dist-upgrade "$@" ;; aptitude-install) need_root "$@" apt_get_update aptitude_log "$TMPFILE" install "$@" edit_logbuch "$TMPFILE" aptitude install "$@" ;; aptitude-remove) need_root "$@" apt_get_update aptitude_log "$TMPFILE" remove "$@" edit_logbuch "$TMPFILE" aptitude remove "$@" ;; aptitude-upgrade) need_root "$@" apt_get_update aptitude_log "$TMPFILE" upgrade "$@" edit_logbuch "$TMPFILE" aptitude upgrade "$@" ;; aptitude-dist-upgrade) need_root "$@" apt_get_update aptitude_log "$TMPFILE" dist-upgrade "$@" edit_logbuch "$TMPFILE" aptitude dist-upgrade "$@" ;; logbuch-installer) INSTALL_PATH="${1:-/usr/local/bin}" REMOVE_PATH="/usr/local/sbin" TOOLS="apt-install apt-remove apt-autoremove apt-build-dep apt-upgrade\ apt-dist-upgrade aptitude-install aptitude-remove\ aptitude-upgrade aptitude-dist-upgrade" echo "Installing logbuch tools to $INSTALL_PATH" [ $# -eq 0 ] && need_root "$@" cp "$0" "$INSTALL_PATH/log" chmod 755 "$INSTALL_PATH/log" for tool in $TOOLS; do [ $# -eq 0 -a -e "$REMOVE_PATH/$tool" ] && rm "$REMOVE_PATH/$tool" ln -sf log "$INSTALL_PATH/$tool" done [ $# -eq 0 -a -e "$REMOVE_PATH/log" ] && rm "$REMOVE_PATH/log" { echo -e "`date +'%d.%m.%Y'`\t${LOGBUCH_USER:-${EMAIL:-${LOGNAME:-?}}}" echo "* Logbuch-Tools nach $INSTALL_PATH installiert" echo } > "$TMPFILE" edit_logbuch "$TMPFILE" ;; *) echo "Not implemented: $0" >&2 exit 1 ;; esac delete_tmpfile } exit 0