#!/bin/sh

set -e

echo "Sourcerer Kernel Builder"

. /etc/sourcerer/kernel-builder.conf

package_to_patch() {
    PACKAGE="`echo $1 | cut -d"-" -f3-`"
    case "$PACKAGE" in
	debian-*)
	    echo debian
	    ;;
	2.[0-9].[0-9]-*)
	    echo "$PACKAGE" | cut -b7-
	    ;;
	2.[0-9].[0-9][0-9]-*)
	    echo "$PACKAGE" | cut -b8-
	    ;;
	2.[0-9].[0-9][0-9][0-9]-*)
	    echo "$PACKAGE" | cut -b9-
	    ;;
	2.[0-9]-*)
	    echo "$PACKAGE" | cut -b5-
	    ;;
	*-2.4)
	    basename "$PACKAGE" "-2.4"
	    ;;
	*-2.6)
	    basename "$PACKAGE" "-2.4"
	    ;;
	*)
	    echo "$PACKAGE"
	    ;;
    esac
}

package_to_module() {
    if [ -z "$1" ]; then return; fi
    case "$1" in
	*-source)
	    PACKAGE="`basename "$1" "-source"`"
	    ;;
	*-modules-src)
	    PACKAGE="`basename "$1" "-source"`"
	    ;;
	*-src)
	    PACKAGE="`basename "$1" "-src"`"
	    ;;
	*)
	    PACKAGE="$1"
	    ;;
    esac
    cd /usr/src
    FILE="`ls ${PACKAGE}*.tar.*`"
    case "$FILE" in
	*.gz)
	    basename "$FILE" ".tar.gz"
	    ;;
	*.bz2)
	    basename "$FILE" ".tar.bz2"
	    ;;
	*)
	    echo >2 "Can't figure out module for $PACKAGE ($FILE)"
	    ;;
    esac
}

is_a() {
    if `grep -q "$2" "/usr/share/sourcerer/kernel-$1.exclude"`; then
	return 1
    else
	return 0
    fi
}

create() {
    KERNEL_TREES=`grep-dctrl -s Package -P kernel-tree /var/lib/apt/lists/*Packages | sort -u | while read PACKAGE TREE; do echo $TREE \"\"; done`
    KERNEL_PATCHES=`grep-dctrl -s Package -P 'kernel-patch' /var/lib/apt/lists/*Packages | sort -u | while read PACKAGE PATCH; do if \`is_a patch "$PATCH"\`; then echo $PATCH \"\" off; fi; done`
    MODULE_SOURCES=`grep-dctrl -s Package -P -e '[-](source|src)' /var/lib/apt/lists/*Packages | grep -e '[^ ]*-source$' -o -e '[^ ]*-src$' | sort -u | while read SOURCE; do if \`is_a module "$SOURCE"\`; then echo $SOURCE \"\" off; fi; done`

    # Ask questions

    NAME=`whiptail 2>&1 </dev/tty >/dev/tty --backtitle "Sourcerer Kernel Builder" --title "Enter name for the new kernel config" --inputbox "" 7 60 "sourcerer"` || return 1

    if [ -f /var/lib/sourcerer/kernel-builder/$NAME.conf ]; then
	echo "A Kernel config named $NAME already exists"
	return 1
    fi

    KERNEL_TREE=`eval whiptail 2>&1 </dev/tty >/dev/tty --backtitle '"Sourcerer Kernel Builder"' --title '"Choose a kernel tree to track"' --menu '""' 20 70 13 $KERNEL_TREES` || return 1

    PATCHES=`eval whiptail 2>&1 </dev/tty >/dev/tty --backtitle '"Sourcerer Kernel Builder"' --title '"Choose patches that should be applied"' --separate-output --checklist '""' 20 70 13 $KERNEL_PATCHES` || return 1

    MODULES=`eval whiptail 2>&1 </dev/tty >/dev/tty --backtitle '"Sourcerer Kernel Builder"' --title '"Choose modules that should be included"' --separate-output --checklist '""' 20 70 13 $MODULE_SOURCES` || return 1


    OPTIONS=`whiptail 2>&1 </dev/tty >/dev/tty --backtitle "Sourcerer Kernel Builder" --title "Do you want / need to use an initrd?" --yesno "" 5 70 13 $MODULE_SOURCES && echo "--initrd" || true`

    # Install packages needed for this config
    # needed before package_to_module
    apt-get install $KERNEL_TREE $PATCHES $MODULES

    # Convert answeres to useable form

    VERSION="`echo $KERNEL_TREE | cut -d"-" -f3-`"
    PACKAGES="`echo $KERNEL_TREE $PATCHES $MODULES`"
    PATCHES="`echo "$PATCHES" | while read PACKAGE; do package_to_patch "$PACKAGE"; done`"
    PATCHES="`echo $PATCHES | tr ' ' ','`"
    if [ ! -z "$PATCHES" ]; then
	PATCHES="--added_patches $PATCHES"
    fi
    MODULES="`echo "$MODULES" | while read PACKAGE; do package_to_module "$PACKAGE"; done`"
    MODULES="`echo $MODULES`"
    if [ ! -z "$MODULES" ]; then
	TARGETS="modules"
    fi

    # Write config to disk

    cat > /var/lib/sourcerer/kernel-builder/$NAME.conf <<EOF
VERSION="$VERSION"
PATCHES="$PATCHES"
MODULES="$MODULES"
PACKAGES="$PACKAGES"
OPTIONS="$OPTIONS"
TARGETS="kernel-image $TARGETS"
EOF

    # Debug

    echo "Created config for $NAME:"
    cat /var/lib/sourcerer/kernel-builder/$NAME.conf

    # Configure kernel

    export INITRD_OK=yes
    export MODULE_LOC="$BUILD_DIR/$NAME/modules"

    rm -rf "$BUILD_DIR/$NAME"
    mkdir -p "$BUILD_DIR/$NAME"
    cd "$BUILD_DIR/$NAME"
    tar jxf "/usr/src/kernel-source-$VERSION.tar.bz2"
    for i in $MODULES; do
	FILE=`ls /usr/src/$i.tar.*`
	case $FILE in
	    *gz)
		tar -xzf "$FILE"
		;;
	    *bz2)
		tar -jxf "$FILE"
		;;
	    *)
		echo >2 "Unknown compression on $i ($FILE)"
		exit 1
		;;
	esac
    done
    cd "kernel-source-$VERSION"
    echo make-kpkg --append_to_version "-$NAME-1" --revision "$VERSION-$NAME-1" $OPTIONS $PATCHES --config menuconfig configure # modules_config
    make-kpkg --append_to_version "-$NAME-1"  --revision "$VERSION-$NAME-1" $OPTIONS $PATCHES --config menuconfig configure # modules_config

    cp .config "/var/lib/sourcerer/kernel-builder/$NAME.config"

    # Cleanup

    cd "$BUILD_DIR"
    rm -rf "$BUILD_DIR/$NAME"

    # Schedule a build

    touch /var/lib/sourcerer/kernel-builder/$NAME.needs-build
    echo "$NAME configured and taged for building"
}

create
