#
# Besetzung der default-Werte auf Grund der Übergabeparameter
#
# Annahmen:
# - Beim ersten Fehler wird abgebrochen !!
# - Falls kein deffile angegeben ist, erfolgt die Vorbesetzung der Parameter durch /etc/borgbackup/borg_default.
# - Dieses Skript muß im gleichen Verzeichnis liegen wie do_borgbackup!
# - Keine Dubletten von widerstrebenden Parametern!
#   => wer dabei "gewinnt" weiß ich nicht
# - Alle Parameter in Kleinbuchstaben (Ausnahme: ggf. Pfadangaben)
# - deffile muß als erster Parameter auftauchen
# - fehlende <string>-Angaben werden nicht geprüft
# - doverify: <remote> darf nur bei <target = remote> verwendet werden.
#   => ansonsten Zwangsumstellung auf "local" durch do_borgbackup
# - keine Prüfung, ob das lokale Ziel für DO_VERIFY auch vorhanden ist!
# - keine Prüfung auf Wertebereiche
#
#--------------------------------------------------
# History (last entry on op)
#
# 25.08.2020 hk    Stand für FraLUG
#
# ToDo:
# - PRE_* und POST_* Skriptlisten als Übergabe-Parameter?
# - Parameter in beliebiger Schreibweise (groß/klein)
# - einfachere regex für Email
#
# Demnächst:
# - Prüfung auf int-Parameter für RESTORE_EFI, RESTORE_SWAP, RESTORE_ROOT
# - Prüfung auf dev-Parameter für RESTORE_DEV
#----------------------------------------

echo -e "Analyse cmdline-Parameter:\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"

if [ "${1}" = "deffile" ]                        # Sicherstellen, daß deffile der erste Parameter ist
  then
    DEFFILE_OK=1                                 # deffile ist möglich
  else
    DEFFILE_OK=0                                 # Blockade für späteres auftreten
  fi

while [ ${#*} -gt 0  ] ;
  do
    echo "Parameter: ${1}"
    case ${1} in
      "deffile")
        if [ ${DEFFILE_OK} -eq 1 ] && [ -f "${KONFIG_DIR}/${2}" ]    # bisher noch kein deffile eingelesen und Pfad ist ok
          then
            echo "Neues deffile: <${2}> an Stelle von borg_default aktivieren"
            . ${KONFIG_DIR}/${2}                 # neues default-File ausführen
            DEFFILE_OK=0                         # kein weiterer Parameter deffile
          else
            echo "Falsches config-File: <${2}> oder deffile nicht als erster Parameter"
            exit 2
          fi
        shift  ;;
      "data")
        echo "Data mit Quell_Pfad ${2}"
	${QUELL_PFAD}=${2}
        shift  ;;
      "domail")
        echo "DoMail ${2}"
        case ${2} in
          "no")  ;;
          *) # aufbohren für Großbuchstaben!
            # https://stackoverflow.com/questions/2138701/checking-correctness-of-an-email-address-with-a-regular-expression-in-bash
            # da gibt es noch andere regex Versionen => https://www.regular-expressions.info/email.html
            regex="^[a-zA-Z0-9!#\$%&'*+/=?^_\{|}~-]+(\.[a-z0-9!#$%&'*+/=?^_\{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?\$"
            if [[ ! ${2} =~ $regex ]]            # check ob gültige Email-Adresse
              then
                echo "Keine gültige Emailadresse für domail: ${2}"
                exit 2
              fi
            ;;
        esac
        echo "domail = ${2}"
        DO_MAIL=${2}
        shift  ;;
      "archivname")
        echo "Archiv-Name: <${2}>"
        REPO_NAME=${2}
        shift  ;;
      "target")
        # keine Prüfung, ob das lokale Ziel auch vorhanden ist!
        echo "Ziel = <${2}>"
        ZIEL=${2}
        shift  ;;
      "repopath")
        echo "Repopfad = <${2}>"
        REPO_PFAD=${2}
        shift  ;;
      "doverify")
        case ${2} in
          "no" | "local" | "remote" )  ;;
          *) 
            echo "kein gültiger Eintrag für DO_VERIFY <${2}>"
            exit 2
            ;;
        esac
        echo "doverify = ${2}"
        DO_VERIFY=${2}
        shift  ;;
      "cmdlineexclude")
        if [ -f "${KONFIG_DIR}/${2}" ]
          then
            echo "Cmdline-Exlcude = <${2}>"
            CMDLINE_EXCLUDE=${2}
            shift
          else
            echo "Exclude-File <${2}> nicht vorhanden"
            exit 2
          fi
        ;;
      "passphrase")
        echo "PassPhrase = <${2}>"
        REPO_PASSPHRASE=${2}
        shift  ;;
      "keypos")
        case ${2} in
          "remote" | "local")  ;;
          *)
            echo "Falscher Parameter für KeyPos: <${2}>"
            exit 2  ;;
        esac
        echo "KeyPos = <${2}>"
        KEYPOS=${2}
        shift  ;;
      "doarchive")
        case ${2} in
          "no" | "create" | "restorearchive" | "filelist" | "archivelist" | "fuse")  ;;
          *)
            echo "Falscher Paramter für DoArchive: <${2}>"
            exit 2  ;;
        esac
        echo "DoArchive = <${2}>"
        DO_ARCHIVE=${2}
        shift  ;;
      "doprune")
        case ${2} in
          "no" | "first" | "after")  ;;
          *)
            echo "Falscher Parameter für DoPrune: <${2}>"
            exit 2  ;;
        esac
        echo "DoPrune = <${2}>"
        DO_PRUNE=${2}
        shift  ;;
      "selectrepo")
        case ${2} in
          "last" | "last-1" | "last-2")  ;;
          *)
            regex="^20[0-9][0-9]-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T((0|1)[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\$"
            # matches a date from 2000-01-01 through 2099-12-31
            if [[ ! ${2} =~ ${regex} ]]             # check, ob Format stimmt (Bsp.: 2019-08-05T20:02:20)
              then
                echo -e "Kein gültiger RePo-Time-Wert:${2}\nFormat YYYY-MM-DDThh:mm::ss erforderlich"
                exit 2
              fi
            ;;
        esac
        echo "SelectRepo: <${2}>"
        REPO_SELECT=${2}
        shift  ;;
      "restoreselect")
        echo "RestoreSelect: <${2}>"
        RESTORE_SELECT=${2}
        shift  ;;
      "keepdaily")
        echo "KEEP_DAILY = <${2}>"
        KEEP_DAILY=${2}
        shift  ;;
      "keepweekly")
        echo "KEEP_WEEKLY = <${2}>"
        KEEP_WEEKLY=${2}
        shift  ;;
      "keepmonthly")
        echo "KEEP_MONTHLY = <${2}>"
        KEEP_MONTHLY=${2}
        shift  ;;
      "keepyearly")
        echo "KEEP_YEARLY = <${2}>"
        KEEP_YEARLY=${2}
        shift  ;;
      "version")
        echo "Version = <${VERSION}>"
	exit
	;;
      "doinitarchive")
        case ${2} in
          "no" | "yes" )  ;;
          *) 
            echo "kein gültiger Eintrag für DO_INITARCHIVE <${2}>"
            exit 2
            ;;
        esac
        echo "doinitarchive = <${2}>"
        DO_INITARCHIVE=${2}
        shift  ;;


# alles ab hier steht noch zur Diskussion
      "restoreefi")
        # auf int prüfen
        echo "RestoreEfi: <${2}>"
        RESTORE_EFI=${2}
        shift  ;;
      "restoreswap")
        # auf int prüfen
        echo "RestoreSwap: <${2}>"
        RESTORE_SWAP=${2}
        shift  ;;
      "restoreboot")
        # auf int prüfen
        echo "RestoreRoot: <${2}>"
        RESTORE_ROOT=${2}
        shift  ;;
      "restoredev")
        # auf dev-Struktur prüfen
        echo "RestoreDev: <${2}>"
        RESTORE_DEV=${2}
        shift  ;;

# hier geht's weiter
      *)
        echo "unbekannte Option ${1}"
        exit 2  ;;
    esac
    shift
  done
echo -e "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
