diff --git a/rechnung.sh b/rechnung.sh index 386914d..8e184bc 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -33,13 +33,14 @@ CUT_BIN=$(which cut 2>/dev/null || echo "cut") DATE_BIN=$(which date 2>/dev/null || echo "date") TPUT_BIN=$(which tput 2>/dev/null || echo "tput") PDFLATEX_BIN=$(which pdflatex 2>/dev/null || echo "pdflatex") +KPSEWHICH_BIN=$(which kpsewhich 2>/dev/null || echo "kpsewhich") GIT_BIN=$(which git 2>/dev/null || echo "git") LATEX_BIN=$(which latex 2>/dev/null || echo "latex") RUBBER_BIN=$(which rubber 2>/dev/null || echo "rubber") # Nicht auf rubber prüfen; Programm ist optional # Nicht auf git prüfen; wird nur benötigt, wenn rechnung.sty nicht existiert. # Nicht auf latex prüfen; wird nur benötigt, wenn rechnung.sty nicht texistiert. -EXECUTABLES_TO_CHECK="$BC_BIN $TR_BIN $SED_BIN $CUT_BIN $TPUT_BIN $DATE_BIN $PDFLATEX_BIN" +EXECUTABLES_TO_CHECK="$BC_BIN $TR_BIN $SED_BIN $CUT_BIN $TPUT_BIN $DATE_BIN $PDFLATEX_BIN $KPSEWHICH_BIN" GENPDF="" if [ -x "$RUBBER_BIN" ]; then @@ -52,7 +53,7 @@ fi # Variablen definieren # -------------------- -PROGRAMM_NAME=`basename $0` +PROGRAMM_NAME=$(basename $0) PROGRAMM_VERSION="0.0.1" VERBOSITY=1 STY_HOME="$HOME/texmf/tex/latex" @@ -67,7 +68,6 @@ SEDFILE="sed.txt" LINE_BUFFER="" KEY_BUFFER="" VALUE_BUFFER="" -ERROR=0 KUNDE="" ADRESSE="" ANREDE="" @@ -109,6 +109,8 @@ print_start() { print_failed() { + msg=$* + if [ "$VERBOSITY" -eq 0 ]; then return else @@ -117,6 +119,9 @@ print_failed() { else printf " Failed\n" fi + if [ ! -z "$msg" ]; then + print_error "$msg" + fi fi } @@ -189,52 +194,96 @@ print_error() { fi } +failed_and_exit() { + + print_failed + exit $* +} + # Diverse Checks # -------------- check_readable() { - + + # testet, ob die übergebene datei kein symlink ist, existiert und lesbar + # ist. schlägt einer der tests fehl, wird das programm beendet. + print_start "Datei $1 ist lesbar ..." + if test -h "$1"; then + target=$(get_link_target "$1") + print_failed "$1 ist ein symbolischer Link auf $target" + exit 1 + fi if test -f "$1" && test -r "$1"; then print_ok else - print_failed - quit 1 + failed_and_exit 1 fi } check_sty() ( - + + # sucht in einer subshell nach dem paket rechnung.sty. gibt true oder + # false zurück. + print_start "Suche nach $STY_RECHNUNG ..." - rechnung=$(find "$STY_HOME" -type f -name "$STY_RECHNUNG") - if test ! -f "$rechnung"; then - print_failed - return 1 - else + kpsewhich "$STY_RECHNUNG" 2>&1 >/dev/null + if [ $? -eq 0 ]; then print_ok return 0 + else + print_failed + return 1 fi ) -check_binaries() { +check_binaries() ( - program="" + # die funktion prüft in einer subshell, ob alle benötigten binaries + # installiert sind. sollte das binary ein symlink auf eine ander datei + # sein, wird geprüft, ob sich diese im PATH befindet und nicht ebenfalls + # ein symlink ist. schlägt eine der prüfungen fehl, wird das programm + # beendet. + + program= binaries=$* for program in $binaries; do print_start "Suche nach $program ..." if test ! -x "$program"; then - print_failed - print_error "Das Programm $program wird benötigt, aber nicht gefunden." + print_failed "Das Programm $program wird benötigt, aber nicht gefunden." quit 3 else + if [ -h "$program" ]; then + program=$(get_link_target $program) + fi + if ! which "$program" 2>&1 >/dev/null; then + print_failed "$program ist nicht im Pfad" + fi print_ok fi done -} +) + +get_link_target() ( + + # die funktion bekommt einen symbolischen link und folgt ihm bis zum + # ende. mit dem echo-befehl wird das ziel an die aufrufende funktion + # zurück gegeben. + + program=$1 + + while [ -h "$program" ]; do + program=$(readlink $program) + done + echo "$program" +) is_option() ( + # die funktion überprüft in einer subshell, ob die übergebene zeile ein + # = als trennzeichen enthält. gibt ja oder falsch zurück. + line="$*" if [ "${line#*=}" != "$line" ]; then @@ -244,6 +293,43 @@ is_option() ( fi ) +check_rechnunsdaten() ( + + # die funktion überprüft in einer subshell, ob alle variablen belegt + # sind. ist eine variable leer, wird der name der variablen ausgegeben + # und ein fehler (1) zurück gegeben. + + print_start "Prüfe Rechnungsdaten ..." + if test -z "$KUNDE"; then + print_failed "Das Feld Kunde ist leer" + return 1 + elif test -z "$ADRESSE"; then + print_failed "Das Feld Adresse ist leer" + return 1 + elif test -z "$ANREDE"; then + print_failed "Das Feld Anrede ist leer" + return 1 + elif test -z "$ANZAHL"; then + print_failed "Das Feld Anzahl ist leer" + return 1 + elif test -z "$POSITION"; then + print_failed "Das Feld Position ist leer" + return 1 + elif test -z "$SHORT"; then + print_failed "Das Feld Short ist leer" + return 1 + elif test -z "$BETRAG"; then + print_failed "Das Feld Betrag ist leer" + return 1 + elif test -z "$LFDNR"; then + print_failed "Das Feld LfdNr ist leer" + return 1 + else + print_ok + return 0 + fi +) + # Whitespaces entfernen # in Buffer speichern # --------------------- @@ -282,7 +368,7 @@ install_sty() ( check_binaries "$GIT_BIN $LATEX_BIN" print_start "Hole Repo von $STY_URL ..." - if git clone $STY_URL >/dev/null 2>&1; then + if $GIT_BIN clone $STY_URL >/dev/null 2>&1; then print_ok cd rechnung mkdir -p "$STY_HOME/rechnung/" @@ -295,19 +381,18 @@ install_sty() ( if cp rechnung.sty "$STY_HOME/rechnung/"; then print_ok else - print_failed - exit 1 + failed_and_exit 3 fi cd "$old_pwd" rm -rf rechnung/ print_info "Paket $STY_RECHNUNG erfolgreich installiert" else print_error "Installation fehlgeschlagen" - exit 5 + exit 4 fi else print_error "Klonen des Repos fehlgeschlagen" - exit 6 + exit 5 fi ) @@ -316,11 +401,10 @@ install_sty() ( reset_values() { - print_info "Initialisiere Felder für Rechnung neu." + print_info "Beginne neue Rechnung" LINE_BUFFER="" KEY_BUFFER="" VALUE_BUFFER="" - ERROR=0 KUNDE="" ADRESSE="" ANREDE="" @@ -349,11 +433,22 @@ set_value() { betrag) BETRAG="$VALUE_BUFFER";; lfdnr) LFDNR="$VALUE_BUFFER";; short) SHORT="$VALUE_BUFFER";; - *) print_warn "Unbekanntes Feld: $KEY_BUFFER"; ERROR=1;; + *) print_warn "Unbekanntes Feld: $KEY_BUFFER";; esac } -make_invoice() { +make_invoice() ( + + # die funktion erstellt in einer subshell die rechnung. schlägt die + # prüfung der rechnungsdaten fehl, kehrt sie zur aufrufenden shell + # zurück. ansonst wird eine kopie des latex-templates erstellt, die + # darin befindlichen platzhalter durch die entsprechenden variablen zu + # ersetzen und das ganze zu kompilieren. + + check_rechnunsdaten + if [ ! "$?" -eq 0 ]; then + return 1 + fi dead_days="14" if [ "$(date +%u)" -gt 5 ]; then @@ -361,7 +456,6 @@ make_invoice() { fi month_ascii=$(date '+%B') -# inv_day=$(date '+%j') inv_date=$(date '+%Y%m%d') inv_dead=$(date -d "+${dead_days}days" '+%d.\\,%m.\\,%Y') rechnungsnummer="$inv_date--$LFDNR" @@ -394,9 +488,9 @@ make_invoice() { fi if [ -x "$RUBBER_BIN" ]; then - "$RUBBER_BIN" --clean "$filename" + "$RUBBER_BIN" --clean "$filename" fi -} +) proced_ini_line() { @@ -417,12 +511,7 @@ proced_ini_line() { # ende einer rechnung elif [ "$line" = "[ende]" ]; then - if [ $ERROR -ne 0 ]; then - print_warn "Kunde \"$KUNDE\" enthält einen Fehler. Erstelle keine Rechung." - return - else - make_invoice - fi + make_invoice # alle anderen zeilen else @@ -469,7 +558,7 @@ do esac done -# Verschiedene Basic Checks +# Farbe aktivieren wenn vorhanden if [ -n "$NUMBER_OF_COLORS" ] && [ "$NUMBER_OF_COLORS" -ge 8 ]; then COLORED_OUTPUT=1 fi @@ -478,6 +567,7 @@ print_deko " ========================" print_deko " = $PROGRAMM_NAME v$PROGRAMM_VERSION =" print_deko " ========================" +# Verschiedene Basic Checks if [ "$(id -u)" -eq 0 ]; then print_error "$0: Das Skript darf nicht als Root ausgeführt werden." exit 1 @@ -486,12 +576,12 @@ check_binaries "$EXECUTABLES_TO_CHECK" check_readable "$RECHNUNGSFILE" check_readable "$TEMPLATEFILE" check_readable "$LCOFILE" -if ! check_sty "$STY_HOME"; then - print_warn "$STY_RECHNUNG nicht gefunden." +if ! check_sty; then + print_warn "Verwenden sie -i um $STY_RECHNUNG zu installieren" if [ $INSTALL_LCO_FILE -eq 0 ]; then - print_info "Beende $PROGRAMM_NAME" + exit 7 else - install_sty + install_sty fi fi