#!/bin/bash

#
#  Dieses Script erzeugt aus einer für eine Datei erstellte 
#  Prüfsumme und erzeugt eine Kopie der Datei mit der Prüfsumme
#  im Namen
#  Besonder praktisch: 
#  * wenn man eine Datei per Email verschickt (Datenduplizierung)
#  * wenn man mehrere Versionen einer Datei ablegt
#  * wenn man eine Datei mit hash zurückbekommt und sieht ob das zusammenpasst
#  * und so weiter


MD5SUM_DATEINAMENTEIL="_MD5SUM"

function programm_check (){
        #
        # Alle Programme da ?
        #
        exes="md5sum cp awk"
        # built ins : cd echo

        for e in $exes
        do
          p=$(which $e)
          if [ $? -eq 0 ]
          then
            echo Notwendiges Programm $e ist hier: $p
          else
            echo "FEHLER: $e nicht gefunden"
            echo "Bitte installieren:"
            echo ""
            echo "apt install " $e
            exit 1
          fi
        done
}

function dateiname_md5 (){
  dateiname=$1
  md5hash=$2
  DATEINAME_MD5="$(dirname $dateiname)/$(echo $(basename $dateiname) | awk -v prefix=$MD5SUM_DATEINAMENTEIL -v hash=$md5hash '{n=split($0,a,/[\.]/);res="";if(n==1){print $0 prefix hash}else{for(i=1;i<n;i++){if(length(res)){res=res "."}res=res a[1] } print res  prefix hash"."a[n]}}' )"
}

#
# prüfen der notwendigen Programme für dieses Script
#
programm_check

if [ $# -lt 1 ] 
then
  echo keine Datei
else
  echo Teste $1
  if [ -f $1 ]
  then
    DATEI=$1
    echo "Dateitest" $DATEI
    PRUEFSUMME=$(md5sum $DATEI | awk '{print $1}' )
    dateiname_md5 $DATEI $PRUEFSUMME
    echo $DATEINAME_MD5
    if ! [[ "$DATEI" =~ $MD5SUM_DATEINAMENTEIL ]]
    then
      if [ -f $DATEINAME_MD5 ]
      then
        echo Prüfsummenkopie  $DATEINAME_MD5 von $DATEI existiert
        PRUEFSUMME_CHECK=$(md5sum $DATEINAME_MD5 | awk '{print $1}' )
        if [ $PRUEFSUMME_CHECK == $PRUEFSUMME ]
        then
          echo +++++++++++++++++++++++++++++++++++++++++++++++++++++++
          echo $DATEINAME_MD5 ist OK , Prüfsumme gleich Namensanteil
          echo +++++++++++++++++++++++++++++++++++++++++++++++++++++++
        else
          echo $DATEINAME_MD5 ist nicht gleich!
          echo \#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
          echo Entweder ...
          echo   ... ist $DATEI geändert worden 
          echo   ... oder $DATEINAME_MD5 ist nachträglich manipuliert worden 
          echo   ... oder $DATEI ist eine alte Version
          echo \#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
        fi
      else
        echo Prüfsummenkopie  $DATEINAME_MD5 von $DATEI wird erstellt
        cp $DATEI $DATEINAME_MD5
      fi
    else
      echo \#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
      echo $DATEI scheint schon eine Datei mit Prüfsumme zu sein \(enthält $MD5SUM_DATEINAMENTEIL im Namen\), bitte überprüfen
      VORSCHLAG=$(echo $DATEI | awk -v prefix=$MD5SUM_DATEINAMENTEIL '{n=split($0,a,prefix);m=split(a[n],b,/[\.]+/);if(m>1){suffix="." b[n]}else{suffix=""} print a[1] suffix}')
      echo zum \"Rückkopieren\" auf die Orignaldatei schlage ich das vor:
      echo cp $DATEI $VORSCHLAG
      if [ -f $VORSCHLAG ]
      then
        echo Datei $VORSCHLAG gibt es schon , mal lieber nicht kopieren
      else
        echo Datei $VORSCHLAG gibt es noch nicht, ich kopiere mal
      fi
      echo \#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
      PRUEFSUMME_CHECK=$(md5sum $DATEI | awk '{print $1}' )
      dateiname_md5 $VORSCHLAG $PRUEFSUMME_CHECK
      if [ $DATEI == $DATEINAME_MD5 ]
      then
        echo \(Prüfsummen check erfolgreich\)
      else
        echo \#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
        echo WARNUNG : $DATEI hat nicht die erwartet Checksumme : $PRUEFSUMME_CHECK
        echo \#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
      fi
    fi
  else
    echo $1 " ist keine Datei"
  fi
fi




