#!/bin/sh




Dots() {
    local i
    i=0
    while [ "$i" -le "$1" ] ; do
	echo -n "."
	i=$(($i+2))
    done
}


GetSizeOfFile() {
    if [ -f "$1" ] ; then
	echo `du -sk "$1" | cut -f1`
    elif [ ! -d "$1 " ] ; then
	echo 0
    else
	echo 1
    fi
}




GiveSliceName() {
    echo -e -n "/mnt/cdrom/archives/slice-`printf "%07d" $1`.`printf "%05d" $2`.dat"
}




IsThisTheLastCD() {
    if [ -f "/mnt/cdrom/archives/NOT-THE-LAST" ] ; then
	echo "no"
    else
	echo "yes"
    fi
}



ReassembleAllBigfiles() {
    local bf_num finished retval wildpath
    wildpath=$1
    bf_num=0
    finished=no
    retval=0
    LogIt "Reassembling big files. Please wait."
    > /tmp/biggiefiles.reassembled
    while [ "$finished" != "yes" ] ; do
        fname=`GiveSliceName $bf_num 0`
        if [ ! -f "$fname" ] ; then
	    if [ "`IsThisTheLastCD`" = "no" ] ; then
		cd_number=$(($cd_number+1))
		LogIt "file #$buf_num's first slice should be '$fname'; I can't find it!"
		LogIt "Perhaps the next biggiefile is on the next CD (CD#$cd_number)" 1
                insist-on-cd $cd_number
            else
		LogIt "This was the last CD."
		LogIt "Reassembly of big files is complete." 3
                finished=yes
            fi
        else
	    LogIt "file #$bf_num's first slice ('$fname') found. Reassembling..."
            ReassembleBigfile $bf_num $wildpath
            if [ "$?" -ne "0" ] ; then
		LogIt "An error occurred while reassembling bigfile #$bf_num" 1
               retval=$(($retval+1))
            else
               echo -e -n " OK.     \r"
	       LogIt "Bigfile #$bf_num was reassembled OK."
            fi
            bf_num=$(($bf_num+1))
        fi
    done
    if [ "$retval" -eq "1" ] ; then
        echo -n "One error"
    elif [ "$retval" -eq "0" ] ; then
        echo -n "No errors"
    else
        echo -n "$retval errors"
    fi
    echo " occurred during reassembly of bigfiles."
    LogIt "$retval error(s) occurred during reasasembly of bigfiles."
    return $retval
}



ReassembleBigfile() {
    local bf_num fname stem outputfile tempstr new_cksum \
padded_bfnum finalsize checksum i res last_i \
slice_num slice_fname slice_search cd_number wildpath
    bf_num=$1
    wildpath=$2
    slice_num=0
    padded_bfnum=`printf "%07d" $bf_num`
    slice_fname=`GiveSliceName $bf_num $slice_num`
    checksum=`cat $slice_fname | cut -f1`
#    finalsize=`cat $slice_fname | cut -f2`
    i=`cat $slice_fname | cut -f2`
    outputfile=/mnt/RESTORING/"$i"
    echo -en "                                                     \r$i "

    if [ "`echo "$outputfile" | grep "$wildpath"`" = "" ] ; then
	LogIt "Ignoring $outputfile (wildpath doesn't find it)"
        echo -e -n " (Skipped) "
        return 0
    fi
    LogIt "Restoring big file #$bf_num ($outputfile)"
    if [ ! -e "$outputfile" ] ; then
        mkdir -p "$outputfile" || LogIt "Warning - can't make protodir" 1
        rmdir "$outputfile" || LogIt "Warning - can't remove protodir" 1
    fi
    > "$outputfile" || LogIt "Warning - can't delete $outputfile" 1
    last_i=""
    slice_num=0
    while [ "`GetSizeOfFile $slice_fname`" -gt "0" ] ; do
        slice_num=$(($slice_num+1))
        slice_search=`GiveSliceName $bf_num $slice_num`
        slice_fname=`find $slice_search* 2> /dev/null`
        if [ "$slice_fname" = "" ] ; then
            i=`ThisCDsNumber`
#cat /mnt/cdrom/archives/THIS-CD-NUMBER`
            i=$(($i+1))
	    insist-on-cd $i
            slice_fname=`find $slice_search*`
            if [ "$slice_fname" = "" ] ; then
                LogIt "Yo, this is whack. biggie#$bf_num slice#$slice_num" 1
                LogIt "fname search = $slice_search; where's the beef?" 1
                return 1
            fi
        fi
        [ -f "$slice_fname" ] || echo "$slice_fname slice missing"
        if [ "`echo "$slice_fname" | grep "\.bz2"`" != "" ] ; then
            bunzip2 -c $slice_fname >> "$outputfile" \
|| LogIt "Can't bunzip2 $slice_fname" 1
        elif [ "`echo "$slice_fname" | grep "\.gz"`" != "" ] ; then
            gunzip -c $slice_fname >> "$outputfile" \
|| LogIt "Can't gunzip $slice_fname" 1
	else
	    cat $slice_fname >> "$outputfile"
	fi
        echo -n "."
        last_i=$slice_fname
    done
    if [ "`GetSizeOfFile "$last_i"`" -ne "0" ] ; then
	LogIt "The last i ($last_i) should be a zero-length file!" 1
    fi
    new_cksum=`md5sum "$outputfile" | cut -d' ' -f1`
    if [ "$new_cksum" != "$checksum" ] ; then
        LogIt "Warning - $i does not match its checksum." 1
        LogIt "new cksum = $new_cksum"
        LogIt "old size = $finalsize"
        LogIt "orig cksum= $checksum"
        LogIt "new size = `GetSizeOfFile "$outputfile"`"
        return 1
    else
        echo "$outputfile" >> /tmp/biggiefiles.reassembled
        return 0
    fi
}



ThisCDsNumber() {
    if [ ! -f "/mnt/cdrom/archives/THIS-CD-NUMBER" ] ; then
        echo "(absent)"
    else
        cat /mnt/cdrom/archives/THIS-CD-NUMBER
    fi
}




# ------------------------- main ----------------------


#echo "Testing here."
#ReassembleAllBigfiles
#exit

LogIt "biggify-me --- starting"
wildpath=""
if [ "$#" -eq "0" ] ; then
    LogIt "Restoring all big files" 1
elif [ "$#" -eq "1" ] ; then
    wildpath=$1
    LogIt "Restoring all big files w/wildpath '$wildpath'" 1
else
    LogIt "biggify-me <wildpath>" 1
    exit 1
fi

if [ "`mount | grep "/mnt/RESTORING"`" = "" ] ; then
    LogIt "\nPlease run mount-me before you run biggify-me." 1
    exit 1
fi

echo -e -n "\r"

ReassembleAllBigfiles "$wildpath"
res=$?
if [ "$res" -ne "0" ] ; then
    LogIt "Warning - an error occurred while big files were being reassembled" 1
else
    LogIt "Big files were all reassembled OK."
fi

LogIt "biggify-me --- leaving"
exit $res
