diff --git a/rechnung.sh b/rechnung.sh index b985e69..8fab780 100755 --- a/rechnung.sh +++ b/rechnung.sh @@ -20,8 +20,12 @@ 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") +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" GENPDF="" @@ -38,6 +42,9 @@ fi PROGRAMM_NAME=$0 PROGRAMM_VERSION="0.0.1" #VERBOSITY=0 +STY_HOME="$HOME/texmf/tex/latex" +STY_RECHNUNG="rechnung.sty" +STY_URL="https://github.com/tomka/rechnung" RECHNUNGSFILE="rechnung.ini" TEMPLATEFILE="template.ltx" SEDFILE="sed.txt" @@ -66,14 +73,89 @@ BLUE="$(tput bold)$(tput setaf 4)" NORMAL="$(tput bold)$(tput sgr0)" +# Ausgabefunktionen für Terminal +# ------------------------------ + +print_start() { + + msg=$* + + if [ "$COLORED_OUTPUT" -eq 1 ]; then + printf "%s[+]%s %s" "$GREEN" "$NORMAL" "$msg" + else + printf " Failed" + fi +} + +print_failed() { + + if [ "$COLORED_OUTPUT" -eq 1 ]; then + printf "%s Failed%s\n" "$RED" "$NORMAL" + else + printf " Failed\n" + fi +} + +print_ok() { + + if [ "$COLORED_OUTPUT" -eq 1 ]; then + printf "%s OK%s\n" "$GREEN" "$NORMAL" + else + printf " OK\n" + fi +} + +print_deko() { + + msg=$* + + if [ "$COLORED_OUTPUT" -eq 1 ]; then + echo "${BLUE}${msg}${NORMAL}" + else + echo "$msg" + fi +} + +print_info() { + + msg=$* + + if [ "$COLORED_OUTPUT" -eq 1 ]; then + echo "${GREEN}[+]$NORMAL $msg" + else + echo "[-] $msg" + fi +} + +print_warn() { + + msg=$* + + if [ "$COLORED_OUTPUT" -eq 1 ]; then + echo "${YELLOW}[-]$NORMAL $msg" + else + echo "[-] $msg" + fi +} + +print_error() { + + msg=$* + + if [ "$COLORED_OUTPUT" -eq 1 ]; then + echo "${RED}[-]$NORMAL $msg" + else + echo "[-] $msg" + fi +} + # Diverse Checks # -------------- check_readable() { - printf "\n[+] Datei %s ist lesbar ..." "$1" - if [ -f "$1" ] && [ -r "$1" ] - then + print_start "Datei $1 ist lesbar ..." + if [ -f "$1" ] && [ -r "$1" ]; then print_ok else print_failed @@ -81,16 +163,29 @@ check_readable() { fi } +check_sty() ( + + print_start "Suche nach $STY_RECHNUNG ..." + rechnung=$(find "$STY_HOME" -type f -name "$STY_RECHNUNG") + if [ "$rechnung" == "" ]; then + print_failed + return 1 + else + print_ok + return 0 + fi +) + check_binaries() { program="" binaries=$* for program in $binaries; do - printf "\n[+] Suche nach Programm %s ..." "$program" + print_start "Suche nach $program ..." if [ ! -x "$program" ]; then print_failed - printf "\n[-] Das Programm \"%s\" wird benötigt, aber nicht gefunden." "$program" + print_error "Das Programm $program wird benötigt, aber nicht gefunden." quit 3 else print_ok @@ -109,39 +204,8 @@ is_option() ( fi ) -# Ausgaben im Terminal -# -------------------- - -print_failed() { - - if [ "$COLORED_OUTPUT" -eq 1 ]; then - printf "%s Failed%s" "$RED" "$NORMAL" - else - printf " Failed" - fi -} - -print_ok() { - - if [ "$COLORED_OUTPUT" -eq 1 ]; then - printf "%s OK%s" "$GREEN" "$NORMAL" - else - printf " OK" - fi -} - -print_warn() { - - msg=$* - - if [ "$COLORED_OUTPUT" -eq 1 ]; then - echo "${YELLOW}[-]$NORMAL $msg" - else - echo "[-] $msg" - fi -} - # Whitespaces entfernen +# in Buffer speichern # --------------------- trim_line() { @@ -168,10 +232,58 @@ trim_value() { set +f } +# LaTeX-Paket rechnung.sty installieren +# ------------------------------------- + +install_sty() ( + + old_pwd=$(pwd) + + read -p " LaTeX Paket $STY_RECHNUNG installieren? (y/N): " + if [ "$REPLY" == "y" ] || [ "$REPLY" == "Y" ] || [ "$REPLY" == "j" ] || [ "$REPLY" == "J" ] + then + check_binaries "$GIT_BIN $LATEX_BIN" + print_start "Hole Repo von $STY_URL ..." + git clone $STY_URL >/dev/null 2>&1 + if [ "$?" -eq 0 ]; then + print_ok + cd rechnung + mkdir -p "$STY_HOME/rechnung/" + print_start "Kompiliere $STY_RECHNUNG ..." + $LATEX_BIN rechnung.ins >/dev/null 2>&1 + if [ "$?" -eq 0 ]; then + print_ok + print_start "Kopiere $STY_RECHNUNG nach $STY_HOME/rechnung ..." + cp rechnung.sty "$STY_HOME/rechnung/" + if [ "$?" -eq 0 ]; then + print_ok + else + print_failed + exit 1 + fi + cd $old_pwd + rm -rf rechnung/ + print_info "Paket $STY_RECHNUNG erfolgreich installiert" + else + print_error "Installation fehlgeschlagen" + exit 5 + fi + else + print_error "Klonen des Repos fehlgeschlagen" + exit 6 + fi + else + print_info "Beende Progrann" + exit 7 + fi +) + +# wenn ein neuer Kunde beginnt, alle Variablen neu initialisieren +# --------------------------------------------------------------- reset_values() { - printf "\n[+] Initialisiere Felder für Rechnung neu." + print_info "Initialisiere Felder für Rechnung neu." LINE_BUFFER="" KEY_BUFFER="" VALUE_BUFFER="" @@ -186,6 +298,8 @@ reset_values() { LFDNR="" } + + set_value() { key=$(echo "$*" | $CUT_BIN -d "=" -f1) @@ -223,7 +337,7 @@ make_invoice() { buffer="$KUNDE; $ADRESSE" anschrift="$(echo "$buffer" | sed 's/; /\\\\\\\\\\\\\\ /g')" - printf "\n[+] Erstelle Rechnung: %s" "$filename" + print_info "Erstelle Rechnung: $filename" { printf "s!#SUBJECT#!%s!\n" "$subject" printf "s!#ANREDE#!%s!\n" "$ANREDE" @@ -238,9 +352,9 @@ make_invoice() { $SED_BIN -i -f "$SEDFILE" "$filename" if ! $GENPDF "$filename"; then - echo "[-] Rechnung fehlgeschlagen" + print_error "Rechnung fehlgeschlagen" else - echo "[+] Rechnung erfolgreich erstellt" + print_info "Rechnung erfolgreich erstellt" fi if [ -x "$RUBBER_BIN" ]; then @@ -277,8 +391,7 @@ proced_ini_line() { # alle anderen zeilen else - if is_option "$line" - then + if is_option "$line"; then set_value "$line" else print_warn "Invalid syntax: $line" @@ -293,26 +406,34 @@ quit() { exit 1 } - # --- Programmstart --- # # --------------------- # -echo "===================" -echo "= $PROGRAMM_NAME v$PROGRAMM_VERSION =" -echo "===================" # Verschiedene Basic Checks if [ -n "$NUMBER_OF_COLORS" ] && [ "$NUMBER_OF_COLORS" -ge 8 ]; then COLORED_OUTPUT=1 fi +print_deko " ========================" +print_deko " = $PROGRAMM_NAME v$PROGRAMM_VERSION =" +print_deko " ========================" + if [ "$(id -u)" -eq 0 ]; then - echo "$0: Das Skript darf nicht als Root ausgeführt werden." + print_error "$0: Das Skript darf nicht als Root ausgeführt werden." exit 1 fi check_binaries "$EXECUTABLES_TO_CHECK" check_readable "$RECHNUNGSFILE" check_readable "$TEMPLATEFILE" -printf "\n" +if check_sty "$STY_HOME"; then + continue +else + print_warn "$STY_RECHNUNG nicht gefunden." + install_sty +fi + +exit + # Kundendatei einlesen und rechnungen erstellen while IFS= read -r rawline