#!/bin/bash
# ---------------------------------------------------------------------------- #
## \file disk.sh
## \author Sebastien Beaugrand
## \sa http://beaugrand.chez.com/
## \copyright CeCILL 2.1 Free Software license
# ---------------------------------------------------------------------------- #
dev=/dev/cdrom
mnt=/media/cdrom

# ---------------------------------------------------------------------------- #
# Usage
# ---------------------------------------------------------------------------- #
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
    name=`basename $0`
    echo "Lecture  :  $name "
    echo "Ecriture :  $name <iso|repertoire>"
    exit 0
fi

# ---------------------------------------------------------------------------- #
# User
# ---------------------------------------------------------------------------- #
if [ `whoami` != "root" ]; then
    su -c "$0 $*"
    exit $?
fi

# ---------------------------------------------------------------------------- #
# Media
# ---------------------------------------------------------------------------- #
if [ ! -d $mnt ]; then
    mkdir $mnt
fi
if  grep "$mnt" /etc/mtab >/dev/null; then
    echo "$mnt n'est pas utilisable"
    exit 1
fi

# ---------------------------------------------------------------------------- #
# Lecture
# ---------------------------------------------------------------------------- #
if [ -z "$1" ]; then
    echo -n "dechiffrer ? (o/N) "
    read ret
    if [ "$ret" = o ]; then
        modprobe dm-crypt
        loop=`losetup -f`
        losetup $loop $dev
        cryptsetup -v -c aes-cbc-plain -h sha512 create crypted $loop
        if [ $? != 0 ]; then
            losetup -d $loop
            exit 1
        fi
        mount -t iso9660 /dev/mapper/crypted $mnt
        echo "todo:"
        echo "umount $mnt"
        echo "cryptsetup remove crypted"
        echo "losetup -d $loop"
    else
        mount -t iso9660 $dev $mnt
    fi
    exit 0
fi

# ---------------------------------------------------------------------------- #
# wodim
# ---------------------------------------------------------------------------- #
which wodim >/dev/null 2>&1 || \
(echo -n "installation de wodim: " && zypper install wodim)

# ---------------------------------------------------------------------------- #
# Ecriture
# ---------------------------------------------------------------------------- #
dir=${1%%/}
if [ "${dir:0-4:4}" = ".iso" ]; then
    iso="$dir"
    echo "iso=$iso"
    overwrite=n
else
    iso="$dir.iso"
    echo "iso=$iso"
    overwrite=o
    if [ -f "$iso" ]; then
        echo -n "ecraser $iso ? (o/N) "
        read overwrite
        if [ -z "$overwrite" ]; then
            overwrite=n
        fi
    fi
    if [ $overwrite = o ] || [ ! -f "$iso" ]; then
        echo -n "chiffrer ? (o/N) "
        read crypt
        if [ "$crypt" = o ]; then
            which aespipe >/dev/null 2>&1 ||\
                (echo -n "installation de aespipe: " &&\
                 zypper install aespipe)
            genisoimage -f -J -l -R -V "$dir" "$dir" |\
                aespipe -e AES256 -T >"$iso"
        else
            genisoimage -f -J -l -R -V "$dir" "$dir" >"$iso"
        fi
    fi
fi
wodim -prcap dev=$dev | grep "Write speed"
echo -n "vitesse ?x "
read speed
size=`stat -c%s "$iso"`
echo "taille du fichier iso : $size"
echo -n "graver ? (O/n) "
read ret
if [ "$ret" != n ]; then
    echo -n "vider le disque ? (O/n) "
    read ret
    if [ "$ret" != n ]; then
        wodim -v dev=$dev speed=$speed blank=fast -force
    fi
    wodim -v -dao -eject dev=$dev speed=$speed "$iso"
fi

# ---------------------------------------------------------------------------- #
# Verification
# ---------------------------------------------------------------------------- #
echo -n "verifier ? (O/n) "
read ret
if [ "$ret" != n ]; then
    echo -ne " (1) md5sum\n (2) diff\n [1] "
    read ret
    if [ -z "$ret" ] || [ $ret = 1 ]; then
        if [ ! -f "$iso.md5" ]; then
            echo -n "creer $iso.md5 ? (O/n) "
            read ret
            if [ "$ret" != n ]; then
                md5sum "$iso" >"$iso.md5"
            fi
        fi
        bs=`isoinfo -d -i $dev | grep "^Logical block size" | cut -d ' ' -f 5`
        if [ -z "$bs" ]; then
            echo "error: blank block size"
            exit 1
        fi
        echo "bs = $bs"
        bc=`isoinfo -d -i $dev | grep "^Volume size" | cut -d ' ' -f 4`
        if [ -z "$bc" ]; then
            bc=0
        fi
        fsz=`stat -c "%s" "$iso"`
        ((fbc = fsz / bs))
        if ((fbc > bc)); then
            bc=$fbc
        fi
        echo "bc = $bc"
        ((sz = bc * bs))
        if ((sz != fsz)); then
            echo "warning: data size = $sz"
            echo "warning: file size = $fsz"
        fi
        dd if=$dev bs=$bs count=$bc conv=notrunc,noerror \
            2>/tmp/disk.log | md5sum | cut -d ' ' -f 1 >md5sum.tmp
        cat md5sum.tmp
        if [ -f "$iso.md5" ]; then
            if cat "$iso.md5" | cut -d ' ' -f 1 | diff - md5sum.tmp; then
                echo "OK"
            else
                echo "KO"
            fi
        fi
        rm md5sum.tmp
    else
        if [ ! -d /mnt/removable ]; then
            mkdir /mnt/removable
        fi
        if  grep "/mnt/removable" /etc/mtab >/dev/null; then
            echo "/mnt/removable n'est pas utilisable"
            exit 1
        fi
        if [ $overwrite = n ]; then
            echo -n "dechiffrer ? (o/N) "
            read crypt
        fi
        if [ "$crypt" = o ]; then
            modprobe dm-crypt
            loop1=`losetup -f`
            losetup $loop1 "$iso"
            cryptsetup -v -c aes-cbc-plain -h sha512 create crypted1 $loop1
            if [ $? != 0 ]; then
                losetup -d $loop1
                exit 1
            fi
            loop2=`losetup -f`
            losetup $loop2 $dev
            cryptsetup -v -c aes-cbc-plain -h sha512 create crypted2 $loop2
            if [ $? != 0 ]; then
                cryptsetup remove crypted1
                losetup -d $loop1
                losetup -d $loop2
                exit 1
            fi
            mount -t iso9660 /dev/mapper/crypted1 /mnt/removable
            mount -t iso9660 /dev/mapper/crypted2 $mnt

            diff -rq /mnt/removable $mnt

            umount /mnt/removable
            umount $mnt
            cryptsetup remove crypted1
            cryptsetup remove crypted2
            losetup -d $loop1
            losetup -d $loop2
        else
            mount -t iso9660 -o loop "$iso" /mnt/removable
            mount -t iso9660 $dev $mnt
            cd /mnt/removable
            find . -type f -exec cmp {} $mnt/{} \;
            umount /mnt/removable
            umount $mnt
        fi
    fi
fi

exit 0