#! /bin/bash

# mk-basefile, create basefiles for some distributions
#
# Thomas Lange, Uni Koeln, 2011-2012
# based on the Makefile implementation of Michael Goetze
#
# Usage example:  fai-mk-basefile -J SQUEEZE64
# This will create a SQUEEZE64.tar.xz basefile.

# Supported distributions (each i386/amd64):
# Debian GNU/Linux 6.0
# Ubuntu 10.04
# CentOS 5/6
# Scientific Linux Cern 5/6
#
# Packages you might want to install to use this command:
# debootstrap, rinse, xz-utils


# Define your local mirros here
# For the first stage, set the CentOS/SLC mirror in /etc/rinse/rinse.conf
MIRROR_DEBIAN=http://http.debian.net/debian/
MIRROR_DEBIAN=http://localmirror/debian/
MIRROR_UBUNTU=http://ftp.halifax.rwth-aachen.de/ubuntu/
MIRROR_CENTOS=http://mirror.netcologne.de/
#MIRROR_CENTOS=http://localmirror
#MIRROR_SLC=http://localmirror

EXCLUDE_SQUEEZE=isc-dhcp-client,isc-dhcp-common,info,tasksel,tasksel-data
EXCLUDE_WHEEZY=isc-dhcp-client,isc-dhcp-common,info,tasksel,tasksel-data
EXCLUDE_LUCID=dhcp3-client,dhcp3-common



setarch() {

    l32=
    if [ X$1 = Xi386 ]; then
        l32=linux32
    fi
}

check() {

    if [ `id -u` != 0 ]; then
        echo "You must be root to create chroots."
        exit 1
    fi
    mknod $xtmp/test-dev-null c 1 3
    if [ $? -eq 1 ]; then
        echo "Cannot create device files on $xtmp, aborting."
        echo "Perhaps this directory is mounted with option nodev."
        rm -rf $xtmp
        exit 1
    fi
    echo test > $xtmp/test-dev-null
    if [ $? -eq 1 ]; then
        echo "Cannot create device files on $xtmp, aborting."
        echo "Perhaps this directory is mounted with option nodev."
        rm -rf $xtmp
        exit 1
    fi
    rm -f $xtmp/test-dev-null
}


mkpost-centos() {

    [ -z "$MIRROR_CENTOS" ] && return
    cat <<EOM > $xtmp/post
#! /bin/sh
mkdir -p $xtmp/etc/yum.repos.d/orig
cp -p $xtmp/etc/yum.repos.d/*.repo $xtmp/etc/yum.repos.d/orig
perl -pi -e 's,mirrorlist=,#mirrorlist=,; s,#baseurl=http://mirror.centos.org,baseurl=$MIRROR_CENTOS,;' $xtmp/etc/yum.repos.d/CentOS-Base.repo
EOM
    chmod 555 $xtmp/post
}


mkpost-slc() {

    ver=$1
    [ -z "$MIRROR_SLC" ] && return
    cat <<EOM > $xtmp/post
#! /bin/sh
mkdir -p $xtmp/etc/yum.repos.d/orig
cp -p $xtmp/etc/yum.repos.d/*.repo $xtmp/etc/yum.repos.d/orig
perl -pi -e 's,baseurl=http://linuxsoft.cern.ch,baseurl=$MIRROR_SLC,;' $xtmp/etc/yum.repos.d/slc$ver-os.repo
perl -pi -e 's,baseurl=http://linuxsoft.cern.ch,baseurl=$MIRROR_SLC,;' $xtmp/etc/yum.repos.d/slc$ver-updates.repo

EOM
    chmod 555 $xtmp/post
}


cleanup-deb() {

    chroot $xtmp aptitude clean
    rm $xtmp/etc/hostname $xtmp/etc/resolv.conf
    rm $xtmp/var/lib/apt/lists/*_*
    rm -f $xtmp/etc/udev/rules.d/70-persistent-net.rules
}


cleanup-rinse() {

    # check if chroot works
    echo "Installed packages in chroot:"
    chroot $xtmp rpm -qa
    echo -n "CHROOT rpm -qa: "
    chroot $xtmp rpm -qa|wc -l

    rm -f $xtmp/etc/resolv.conf $xtmp/post
    if [ -d $xtmp/etc/yum.repos.d/orig ]; then
        mv $xtmp/etc/yum.repos.d/orig/* $xtmp/etc/yum.repos.d/
        rm -rf $xtmp/etc/yum.repos.d/orig
    fi
}


tarit() {

    tar --one-file-system -C $xtmp -cf - . | $zip > $target.$ext
}


centos() {

    local arch=$1
    local vers=$2
    local domain=$(domainname)

    check
    setarch $arch
    mkpost-centos
    $l32 rinse --directory $xtmp --distribution centos-$vers --arch $arch --before-post-install $xtmp/post
    domainname $domain # workaround for #613377
    cleanup-rinse
    tarit
}


slc() {

    local arch=$1
    local vers=$2

    check
    setarch $arch
    mkpost-slc $vers
    $l32 rinse --directory $xtmp --distribution slc-$vers --arch $arch --before-post-install $xtmp/post
    cleanup-rinse
    tarit
}


squeeze() {

    local arch=$1

    check
    debootstrap --arch $arch --exclude=${EXCLUDE_SQUEEZE} squeeze $xtmp ${MIRROR_DEBIAN}
    cleanup-deb
    tarit
}

wheezy() {

    local arch=$1

    check
    debootstrap --arch $arch --exclude=${EXCLUDE_WHEEZY} wheezy $xtmp ${MIRROR_DEBIAN}
    cleanup-deb
    tarit
}

lucid() {

    local arch=$1

    check
    debootstrap --arch $arch --exclude=${EXCLUDE_LUCID} lucid $xtmp ${MIRROR_UBUNTU}
    cleanup-deb
    tarit
}


unknown() {

    echo "Unknown distribution. Aborting."
    echo "Available:

    CENTOS5_32   CENTOS5_64
    CENTOS6_32   CENTOS6_64
    SLC5_32      SLC5_64
    SLC6_32      SLC6_64
    LUCID32      LUCID64
    SQUEEZE32    SQUEEZE64
    WHEEZY32     WHEEZY64
"
    exit 99
}


# main routine

ext=tar
zip=cat
tmpdir=/var/tmp

while getopts zJd: opt ; do
    case "$opt" in
        d) tmpdir=$OPTARG ;;
        z) zip="gzip -9"; ext=tar.gz ;;
        J) zip="xz -8" ext=tar.xz ;;
    esac
done
shift $(($OPTIND - 1))

xtmp=$(mktemp -d $tmpdir/basefiles.XXXXXXXX)
if [ $? -eq 1 ]; then
    echo "mktemp failed. Aborting."
    exit 2
fi

target=$1 # also the name of the output file

case "$target" in
    CENTOS5_32) centos i386 5 ;;
    CENTOS5_64) centos amd64 5 ;;
    CENTOS6_32) centos i386 6 ;;
    CENTOS6_64) centos amd64 6 ;;
    SLC5_32) slc i386 5 ;;
    SLC5_64) slc amd64 5 ;;
    SLC6_32) slc i386 6 ;;
    SLC6_64) slc amd64 6 ;;
    LUCID32) lucid i386 ;;
    LUCID64) lucid amd64 ;;
    SQUEEZE32) squeeze i386 ;;
    SQUEEZE64) squeeze amd64 ;;
    WHEEZY32) wheezy i386 ;;
    WHEEZY64) wheezy amd64 ;;
    *) unknown ;;
esac

# cleanup
rm -rf $xtmp
