#!/bin/sh

set -e

. /usr/share/debconf/confmodule

log() {
    logger -t casper "$@"
}

requested_cow_size() {
    db_get casper-udeb/snapshot/cow-size
    COW_SIZE_TEXT="$RET"
    case "$COW_SIZE_TEXT" in
        *[Mm])
            # Megabytes->sectors
            RET=$((${COW_SIZE_TEXT%%[Mm]} * 2048))
            ;;

        *[Gg])
            # Gigabytes->sectors
            RET=$((${COW_SIZE_TEXT%%[Gg]} * 2097152))
            ;;
        auto)
            # XXX, should limit based on available RAM
            RET=""
            ;;
        *)
            RET=$COW_SIZE_TEXT
    esac

    echo -n $RET
}

backing_file() {
    db_get casper-udeb/snapshot/backing-file
    echo -n $RET
}

cow_device() {
    db_get casper-udeb/snapshot/cow-device
    echo -n $RET
}

db_input casper-udeb/snapshot/backing-file || true
db_input casper-udeb/snapshot/cow-device || true
db_input casper-udeb/snapshot/cow-size || true
db_go

BACKING_FILE=$(backing_file)
COW_DEVICE=$(cow_device)
COW_SIZE=$(requested_cow_size)

COW_NAME="casper-cow"
SNAPSHOT_NAME="casper-snapshot"
SNAPSHOT_DEV="/dev/mapper/$SNAPSHOT_NAME"
COW_DM_DEVICE="/dev/mapper/$COW_NAME"
LOOP_DEVICE="/dev/cloop0"

if [ -b $SNAPSHOT_DEV ]; then
    log "Snapshot device $SNAPSHOT_DEV already exists"
else
    log "Configuring snapshot..."

    losetup $LOOP_DEVICE $BACKING_FILE

    BACKING_FILE_SIZE=$(blockdev --getsize "$LOOP_DEVICE")
    MAX_COW_SIZE=$(blockdev --getsize "$COW_DEVICE")
    CHUNK_SIZE=8 # sectors

    if [ -z "$COW_SIZE" -o "$COW_SIZE" -gt "$MAX_COW_SIZE" ]; then
        COW_SIZE=$MAX_COW_SIZE
    fi

    echo "0 $COW_SIZE linear $COW_DEVICE 0" | \
        dmsetup create $COW_NAME

    echo "0 $BACKING_FILE_SIZE snapshot $LOOP_DEVICE $COW_DM_DEVICE p $CHUNK_SIZE" | \
        dmsetup create $SNAPSHOT_NAME
fi

log "Mounting snapshot..."
mkdir /target
mount -o noatime $SNAPSHOT_DEV /target

exit 0
