#!/usr/bin/bash
# ------------------------------------------------------------
# Dateiname:        $Source: /ma/miwa/CvsRepository/mjm/tools/bin/mArch.sh,v $
# Version:          $Revision: 1.6 $
# Datum geaendert:  $Date: 2006/03/13 08:46:54 $
# Autor 2:          $Author: miwa $
# ------------------------------------------------------------
#
# Dieses Programm archiviert Dateien im konfigurierten
# Suchpfad nach folgenden Kriterien:
# Wenn Alter*Gewicht + Grosse*Gewicht > Schwellwert
#   Wenn tmp Bestandteil des Pfades
#     weiter
#   Sonst
#     packe Datei ins Archiev
#   Ende-Wenn
#   markiere Datei zum Löschen
# Ende-Wenn    
# Zum Schluss werden leere Verzeichnisse entfernt
#
# Die Konfigurationsdatei hat folgenden Aufbau:
# Pfad;AGewicht;GGewicht;Schwelle
#
# Ausgaben:
#   &1: Ergebnis-Kommandos
#   &2: Fehlermeldungen
#   &3: Trace
#
# Abhängigkeiten:
#   mArch benutzt den envfinder

#       $include
#              This  directive takes a single filename as an argument and reads
#              commands and bindings from that file.  For example, the  follow-
#              ing directive would read /etc/inputrc:
#
#              $include  /etc/inputrc


#----------------------------------------------------------
function mExit {
#----------------------------------------------------------
    echo $1 >&2
    exit 1
}

#----------------------------------------------------------
function parseCsv4 {
#----------------------------------------------------------
    echo ">parseCsv4: $1" >&3
    w1=${1%%;*}
    rest=${1#*;}
    w2=${rest%%;*}
    rest=${rest#*;}
    w3=${rest%%;*}
    w4=${rest#*;}
}

#----------------------------------------------------------
# main
#----------------------------------------------------------
echo ">mArch $* $Revision: 1.6 $" >&3

# suche Konfigurationsdatei
env_datei=`envfinder mArch` || mExit "keine Konfigurationsdatei gefunden"

TEMP_PFAD=/tmp

for line in `cat $env_datei`; do

    parseCsv4 "$line"
    echo "<parseCsv4: $w1, $w2, $w3, $w4" >&3
    pfad=$w1
    aGewicht=$w2
    gGewicht=$w3
    schwelle=$w4

    cd $pfad

    # uberprufe Archivdatei
    if [[ ! -f mArch.tar ]]; then
        touch otto
        tar cf mArch.tar otto
        rm otto
    fi
    
    #--------------------
    # suche alte Dateien
    #--------------------
    touch ARC0.tmp
    find . -type f -printf "%A@;%b;%p\n" >ARC0.tmp
    
    # tmp Datei noch Alter sortieren
    sort -r ARC0.tmp >ARC1.tmp

    # Datei abarbeiten
    actTime=0
    cat ARC1.tmp |while read datei; do

        parseCsv4 "$datei"
        echo "<parseCsv4: $w1, $w2, $w3" >&3
        timeStamp=$w1
        grosse=$w2
        name=$w3
        
        if [[ $actTime -eq 0 ]]; then
        
            # erste Zeile
            actTime=$timeStamp
            
        fi
        
        # berechne Wert
        let alter=$actTime-$timeStamp
        echo "122,alter = $alter sec" >&3
        let wert=$alter*$aGewicht+$grosse*$gGewicht
        echo "124,wert = $wert" >&3
        
        # mArch.tar wird nie geloscht
        if [[ "$name" == "./mArch.tar" ]]; then
            wert=0
        fi

        # Entscheidung
        if [[ $wert -gt $schwelle ]]; then
        
            name1=${name##./}
            
            # tmp-Behandlung
            if [[ "${name##*.}" == "tmp" || "${pfad##$TEMP_PFAD}" != "$pfad" ]]; then
                echo "rm '$pfad/$name1'"
            else
                # Archivierung
                echo "cd $pfad; tar rf mArch.tar '$name'"
                echo "rm '$pfad/$name1'"
            fi
        fi
    done
    
    #--------------------
    # suche nach leeren Verzeichnissen
    #--------------------
    find . -type d >ARC2.tmp
    cat ARC2.tmp |while read verzeichnis; do
        if [[ "`ls "$verzeichnis"`" == "" ]]; then
            
            # leeres Verzechnis gefunden
            verz1=${verzeichnis##./}
            echo "entferne $verz1" >&3
            echo "rmdir '$pfad/$verz1'"
        fi
    done
done

rm *.tmp
