#!/bin/bash
#
#  JaM Builder
#
#      (C) 2004 Yasushi kinneko Date   kinneko@po.incl.ne.jp
#
#  "JaM Builder" is the script which reconstructs and
#  remaster ISO image for 'MEPIS' Linux Distribution.
#
#  This script based on "YAK Builder 0.02".
#  (C) 2003 Yutaro Ebihara  ebihara@si-linux.com
#  http://www.si-linux.co.jp/pub/yakbuilder/
#
# the JaM Builder is free software; you can redistribute it
# and/or modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# the JaM Builder is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
#   Jan 02 2004  v.0.01 1st  relaease
#   Jan 16 2004  v.0.02 update : add isocopy
#   Jan 27 2004  v.0.03 update : add mkswap, jamver
#   Feb 07 2004  v.0.04 update : add change_ja_fdimg
#   Apr 21 2004  v.0.05 update : add make_works
#   Apr 26 2004  v.0.06 update : some bug fixed
#
APNAME="JaMbuilder"
VERSION=0.06
DIST_NAME="JaMEPIS"
XTERM="/usr/bin/X11/xterm -title jam_chroot -bg lightpink"

SOURCE_DIR=./source
MASTER_DIR=./master
WORK_DIR=./parts
CDROM=/mnt/auto/cdrom
ISO=mepis-2003.10.01.cd1.iso

# -------------------------------- functions ------------------------------------

function make_works () {
    check_root
    if  ! [ -d $SOURCE_DIR ]; then
	mkdir -p $SOURCE_DIR
    fi
    if  ! [ -d $MASTER_DIR ]; then
	mkdir -p $MASTER_DIR
    fi
    if  ! [ -d $WORK_DIR ]; then
	mkdir -p $WORK_DIR
    fi
}

function cdromcopy () {
    check_root
    make_works

    echo "copying from $CDROM to $MASTER_DIR directory....."
    rsync -avu --delete --progress $CDROM/* $MASTER_DIR

    # get cloop.o from boot.img
    if ! [ -d /mnt/image ]; then
    	mkdir -p /mnt/image
    fi
    mount -o loop $CDROM/boot/boot.img /mnt/image
    cp /mnt/image/initrd.gz ./
    umount /mnt/image
    gzip -d ./initrd.gz
    mount -o loop ./initrd /mnt/image
    cp /mnt/image/modules/cloop.o ./
    umount /mnt/image
    rm ./initrd
    rm -r /mnt/image

    if ! [ -d /dev/cloop ]; then
    	mknod /dev/cloop b 240 0
    fi
    if ! [ -d /mnt/cloop ]; then
    	mkdir /mnt/cloop
    fi
    insmod ./cloop.o file=$MASTER_DIR/linux/linux
    mount -o ro /dev/cloop /mnt/cloop
    echo ""
    echo "copying from MEPIS cloop image to $SOURCE_DIR directory....."
    rsync -avu --delete /mnt/cloop/* $SOURCE_DIR
    umount /mnt/cloop
    rmmod cloop
    rm $MASTER_DIR/linux/linux
    rm -r /mnt/cloop
    rm /dev/cloop
    rm ./cloop.o

    echo ""
    echo "okay finish. type 'jambuilder edit' and add or delete packages."
}

function isocopy () {
    check_root
    make_works

    # mount iso image
    if ! [ -d /mnt/iso ]; then
        mkdir -p /mnt/iso
    fi

    mount -o loop $ISO /mnt/iso

    echo "copying from $ISO to $MASTER_DIR directory....."
    rsync -avu --progress /mnt/iso/* $MASTER_DIR

    # get cloop.o from boot.img
    if ! [ -d /mnt/image ]; then
        mkdir -p /mnt/image
    fi
    mount -o loop /mnt/iso/boot/boot.img /mnt/image
    cp /mnt/image/initrd.gz ./
    umount /mnt/image
    gzip -d ./initrd.gz
    mount -o loop ./initrd /mnt/image
    cp /mnt/image/modules/cloop.o ./
    umount /mnt/image
    rm ./initrd
    rm -r /mnt/image

    if ! [ -f /dev/cloop ]; then
        mknod /dev/cloop b 240 0
    fi
    if ! [ -d /mnt/cloop ]; then
        mkdir /mnt/cloop
    fi
    if ! [ -f $MASTER_DIR/linux/linux ]; then
        echo "[ERROR] cloop image nothing!"
	exit 0
    else 
        insmod ./cloop.o file=$MASTER_DIR/linux/linux
        mount -o ro /dev/cloop /mnt/cloop
    fi

    echo ""
    echo "copying from MEPIS cloop image to $SOURCE_DIR directory....."
    rsync -avu --delete /mnt/cloop/* $SOURCE_DIR
    umount /mnt/cloop
    rmmod cloop
    rm $MASTER_DIR/linux/linux
    rm /dev/cloop
    rm -r /mnt/cloop
    rm ./cloop.o
    umount /mnt/iso
    rm -r /mnt/iso

    echo ""
    echo "okay finish. type 'jambuilder edit' and add or delete packages."
}

function edit (){
    check_root
    echo "Add or delete packages."
    echo "type 'exit' when you want to exit."
    mount -t proc proc $SOURCE_DIR/proc
    mv $SOURCE_DIR/etc/resolv.conf $SOURCE_DIR/etc/resolv.conf-jam
    cp /etc/resolv.conf $SOURCE_DIR/etc/resolv.conf

    if [ $DISPLAY ]; then
	$XTERM -e chroot $SOURCE_DIR
    else
        chroot $SOURCE_DIR
    fi
    rm $SOURCE_DIR/etc/resolv.conf
    mv $SOURCE_DIR/etc/resolv.conf-jam $SOURCE_DIR/etc/resolv.conf
    umount $SOURCE_DIR/proc
}

function mkcloop () {
    check_root
    chkswap
    if ! [ -d $SOURCE_DIR ]; then
	echo "ERROR! there is no $SOURCE_DIR dir"
	exit 1
    fi
    if ! [ -d $MASTER_DIR ]; then
	echo "ERROR! there is no $MASTER_DIR dir"
	exit 1
    fi

    #
    # set log files to zero byte
    #
    echo "clean log files"
    cleanup_logs

    change_ja_fdimg

    echo $DIST_NAME`date +%Y%m%d%H%M%S` > ./jamver
    JAMVER=`cat ./jamver`
    echo "$JAMVER made by $APNAME$VERSION" `date +%Y%m%d%H%M%S`> $SOURCE_DIR/etc/jamver

    # build JaMEPIS cloop image
    mkisofs -R -l -V "$JAMVER iso image" -hide-rr-moved -v \
           $SOURCE_DIR | create_compressed_fs - 65536 > $MASTER_DIR/linux/linux

    chkswap

    echo "Finish!"
    echo "Next, type 'jambuilser mkiso'."
}

function cleanup_logs () {
    check_root
    find $SOURCE_DIR/var/log  -exec cp /dev/null {} \;
}

function mkiso () {
    check_root
    chkswap
    if ! [ -d $MASTER_DIR ]; then
	echo "ERROR! there is no $MASTER_DIR dir"
	exit 1
    fi

    JAMVER=`cat ./jamver`
    echo "$JAMVER made by $APNAME$VERSION" > $MASTER_DIR/jamver

    mkisofs -r -J -l -V "$JAMVER LiveCD" -hide-rr-moved -v \
           -b boot/boot.img \
           -c boot/boot.cat \
           -o $JAMVER-cd.iso \
           $MASTER_DIR/

    chkswap

    echo "Finish!"
    echo "Next, burn CD-ROM for Utilities(like 'K3b') and type 'jambuilder cleanall'."
}

function cleanall () {
    check_root
    rm -rf $SOURCE_DIR $MASTER_DIR
    if [ -f ./jamver ]; then
        rm ./jamver
    fi
}

function check_root () {
    if [ $UID != 0 ]; then
	echo "ERROR! you have to run as a root, or use sudo and try again."
	exit 1
    fi
}

function chkswap () {
    # SWAP OFF and DEL swap.temp
    if [ -f ./swap.temp ]; then
        echo "temporaly swap is already using. swapoff and remove it."
        swapoff ./swap.temp
        rm ./swap.temp
    else
        # free swap space need about 1GB. check and get space.
        # NEEDSWAP=524288 #512MB
        NEEDSWAP=786432 #768MB
        # NEEDSWAP=1048576 #1GB
        FREESWAP=$(free| grep -i Swap| awk '{print $4}')
        echo "Now, free swap size is $FREESWAP bytes."
        if [ $FREESWAP -ge $NEEDSWAP ] ; then
           echo "OK! Swap size is able to bulding."
        else
           echo "Swap size is NOT able to bulding."
           # check disk free space
           # if
           #    echo "Sorry, no disk space."
           # else
           #    echo "enable disk space."
               echo "Now, getting temporaly swap space. Wait a moment."
               dd if=/dev/zero of=./swap.temp bs=1024 count=$NEEDSWAP ;\
               /sbin/mkswap ./swap.temp $NEEDSWAP ;\
               /bin/sync; /sbin/swapon ./swap.temp
           # fi
        fi
    fi
}

function change_ja_fdimg () {
    FUNCTION_NAME="change_ja_fdimg"
        #echo "[function]: $FUNCTION_NAME.............."

    #
    # delete work files
    #
    function nekobaba () {

        #
        # delete jp106.kbd
        #
        if [ -f $WORK_DIR/jp106.kbd ]; then
            if [ "$JP106KBDSTAT" = "MADE" ]; then
                #echo " delteing $WORK_DIR/jp106.kbd."
                rm $WORK_DIR/jp106.kbd
                if ! [ $? -eq 0 ]; then
                    echo "  [WARNING] missing delete $WORK_DIR/jp106.kbd. error code is $?
                    #exit 0
                fi
            #else
                #echo " file $WORK_DIR/jp106.kbd exist defaultly. stop delete."
            fi
        fi

        #
        # delete work dir /mnt/image
        #
        if [ -d /mnt/image ]; then
            if [ "$MNTIMANGESTAT" = "MADE" ]; then
                #echo " delteing mount point /mnt/image."
                rm -r /mnt/image
                if ! [ $? -eq 0 ]; then
                    echo "  [WARNING] missing delete /mnt/image. error code is $?.
                    #exit 0
                fi
            #else
                #echo " mount point /mnt/image exist defaultly. stop delete."
            fi
        fi
    }


    #
    # check boot.img existence
    #
    if ! [ -f $MASTER_DIR/boot/boot.img ]; then
        echo " Sorry, no boot.img file. Please check it."
        exit 0
    #else
        #echo " OK. boot.image exist."
    fi

    #
    # check jp106.kbd existence
    #
    JP106KBDSTAT="" # ./jp106.kbd exitsing check flag
    if ! [ -f $WORK_DIR/jp106.kbd ]; then
        echo " jp106.kbd is not found at work dir. now getting remote site."
        wget http://prdownloads.sourceforge.jp/jambuilder/8054/jp106.kbd > /dev/null
###### why???
#            if [ $? -eq 0 ]; then
#                echo " jp106.kbd downloaded."
#                JP106KBDSTAT="MADE"
#                mv ./jp106.kbd $WORK_DIR/jp106.kbd
#            else
#                echo "  missing download jp106.kbd. error code is $?."
#                exit 0
#            fi
    else
        #echo " jp106.kbd found at work dir."
            JP106KBDSTAT="DEFAULT"
    fi

    #
    # make work dir /mnt/image
    #
    MNTIMANGESTAT="" # /mnt/image exitsing check flag
    if ! [ -d /mnt/image ]; then
        #echo " making mount point /mnt/image."
        mkdir -p /mnt/image
            if ! [ $? -eq 0 ]; then
                echo "  missing mkdir /mnt/image. error code is $?."
                exit 0
            fi
        MNTIMANGESTAT="MADE"
    else
        #echo " /mnt/image already exist."
        MNTIMANGESTAT="DEFAULT"
    fi
    #echo " /mnt/image status $MNTIMANGESTAT."

    #
    # make jp106 boot.img
    #
    if mount | grep /mnt/image > /dev/null 2>&1 ; then
        echo " /mnt/image already mounted. check your system."
        nekobaba
        exit 0
    fi
    MOUNTFLAG="" # mount check flag
    mount -o loop $MASTER_DIR/boot/boot.img /mnt/image
        if ! [ $? -eq 0 ]; then
            echo " missing mount /mnt/image. error code is $?."
            nekobaba
            exit 0
        #else
            #echo " mounted boot.img."
        fi
        MOUNTFLAG="SELF"
    if ! [ -f /mnt/image/jp106.kbd ] ; then
        #echo " copying jp106.kbd to boot.img."
        cp $WORK_DIR/jp106.kbd /mnt/image
            if ! [ $? -eq 0 ]; then
                echo " missing copy jp106.kbd. error code is $?."
                nekobaba
                exit 0
            fi
    #else
        #echo " jp106.kbd already exists in boot.img."
    fi

    # add "KBDMAP jp106.kbd" to syslinux.cfg
    CFGEXISTENCE=""
    CFGEXISTENCE=`grep jp106.kbd /mnt/image/syslinux.cfg`
            if ! [ $? -eq 0 ]; then
                echo " missing check syslinux.cfg. error code is $?."
                nekobaba
                exit 0
            fi
#    echo " CFGEXTENCE = [$CFGEXISTENCE]"

    if [ "$CFGEXISTENCE" = "" ] ; then
        echo "KBDMAP jp106.kbd" >> /mnt/image/syslinux.cfg
            if ! [ $? -eq 0 ]; then
                echo " missing add KBDMAP jp106.kbd to syslinux.cfg. error code is $?."
                nekobaba
                exit 0
            fi
        #echo " jp106.kbd added in syslinux.cfg."
    #else
        #echo " jp106.kbd already setting in syslinux.cfg."
    fi

    if [ "$MOUNTFLAG" = "SELF" ] ; then
        umount /mnt/image
            if ! [ $? -eq 0 ]; then
                echo " missing umount /mnt/image. error code is $?."
                nekobaba
                exit 0
            fi
        echo " umounted /mnt/image."
    #else
        #echo " /mnt/image is mounted defaultly."
    fi

    #
    # cleanup temp files
    #
    nekobaba

}


# ============================
#
# main routine start from here
#
# ============================

echo "JaM Builder version $VERSION"
echo "(C) 2004  Yasushi kinneko Date  <kinneko@po.incl.ne.jp>"
echo ""

case "$1" in
    cdcopy)
        ls /mnt/auto/cdrom > /dev/null        # autofs dummy access
	if grep -q /dev/cdrom /proc/mounts; then
		echo "[cdcopy] copy from $CDROM directory"
		cdromcopy
	else
		echo "ERROR: cdrom is not mount on /dev/cdrom"
		echo "mount the cdrom and try again"
	fi
    ;;
    isocopy)
        if ! [ -f $ISO ]; then
		echo "ERROR: cdrom image '$ISO' is not exit."
		echo "get and put the cdrom image and try again"
	else
		echo "[isocopy] copy from $ISO image"
		isocopy
	fi
    ;;
    edit)
	echo "[edit] edit chroot directory"
	edit
    ;;
    mkcloop)
	echo "[mkcloop] build cloop image to $MASTER_DIR/linux/linux"
	mkcloop
    ;;
    mkiso)
	echo "[mkiso] build iso image"
	mkiso
    ;;
    cleanall)
	echo "[clean] remove and cleanup $SOURCE_DIR , $MASTER_DIR directory"
	echo -n "Sure? type 'yes' to cleanup ->"
	read yesno
	if [ $yesno == 'yes' ]; then
	    cleanall
	fi
    ;;
    *)
	echo "Usage: jambuilder {isocopy|cdcopy|edit|mkcloop|mkiso|cleanall}"
	echo ""
	echo "isocopy:    copy files from $ISO to ./master and ./source"
	echo "            setup editting environment"
	echo "cdcopy:     copy files from $CDROM to ./master and ./source"
	echo "            setup editting environment"
	echo "edit:       chroot into the JaMEPIS Userland, install and remove packages"
	echo "mkcloop:    build cloop JaMEPIS Userland image"
	echo "mkiso:      build bootable iso image file"
	echo "cleanall:   cleanup $SOURCE_DIR , $MASTER_DIR directory"
	echo ""
	echo "kinneko <kinneko@po.incl.ne.jp>"
	exit 1
    ;;
esac

exit 0

