#!/bin/sh
# Speed up apt/dpkg/tasksel intsallation by disabling all file system
# flushing.  If something go wrong on first time installation,
# reinstall.  This divert is done in post-base-installer.d and
# pre-pkgsel.d and undone in finish-install.  See also bug #613428.

set -e

log() { logger -t edu-eatmydata-install "$@"; }
info() { log  "info: $@"; }
error() { log  "error: $@"; }

at_exit() {
    error "script $0 terminated unexpectedly."
}
disable_exception() { trap - INT TERM EXIT; }
trap at_exit INT TERM EXIT

enable_override() {
    apt-install eatmydata || true
    if [ -x /target/usr/bin/eatmydata ] ; then
        for bin in dpkg apt-get aptitude tasksel ; do
            file=/usr/bin/$bin
            # Test that the file exist and have not been diverted already.
            if [ -f /target/usr/bin/$bin ] ; then
                info "diverting /usr/bin/$bin using eatmydata"
                printf "#!/bin/sh\neatmydata $bin.distrib \"\$@\"\n" \
                    > /target/usr/bin/$bin.edu
                chmod 755 /target/usr/bin/$bin.edu
                in-target dpkg-divert --package debian-edu-config \
                    --rename --quiet --add /usr/bin/$bin
                ln -sf ./$bin.edu /target/usr/bin/$bin
            else
                error "unable to divert /usr/bin/$bin, as it is missing."
            fi
        done
    else
        error "unable to find /usr/bin/eatmydata after installing the eatmydata pacage"
    fi
}

disable_override() {
    for bin in dpkg apt-get aptitude tasksel ; do
        file=/usr/bin/$bin
        if [ -x /target$file.edu ] ; then
            info "removing eatmydata divert for /usr/bin/$bin"
            rm /target$file
            in-target dpkg-divert --package debian-edu-config \
                --rename --quiet --remove $file
            rm /target$file.edu
        else
            error "missing divert for $file."
        fi
    done
    sync # Flush file buffers before continuing
}

case "$1" in
    enable)
        enable_override
        ;;
    disable)
        disable_override
        ;;
esac

disable_exception
