#!/bin/bash
#
# MOLMAKE-INITRAMFS -- This program makes initramfs image for Make One Linux
# Copyright (C) 2007 Keicho Kondo <dgel@users.sourceforge.jp>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program 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.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

## === Setup Environment === ##
CONFIG_ROOT="/etc/mol"

# load libmolmake
if which libmolmake >/dev/null; then
	. libmolmake
else
	echo "<< Can't find libmolmake. >>" >/dev/stderr
	exit 1
fi

# load config files
load_molmake_config $CONFIG_ROOT

# allow only root account
check_user_account

# check variables whether it is filled or not
check_variable BUILD_ROOT $BUILD_ROOT
check_variable INITRAM_ROOTDIR $INITRAM_ROOTDIR
check_variable INITRAM $INITRAM
check_variable EXEC_DATA $EXEC_DATA
check_variable XSETUP $XSETUP
check_variable DDCXINFO $DDCXINFO
check_variable HWSETUP $HWSETUP
check_variable BUSYBOX $BUSYBOX
check_variable KERNEL_RELEASE $KERNEL_RELEASE
check_variable MODULE_LIST $MODULE_LIST
check_variable SCSI_MODULE_LIST $SCSI_MODULE_LIST
check_variable STORAGE_MODULE_LIST $STORAGE_MODULE_LIST

# set cmd output option
NUM=0
case $* in *--line*) NUM=$(($NUM + 2));; esac
case $* in *--log*) NUM=$(($NUM + 1));; esac
CMD="cmd $NUM"

# check options
case "$*" in
	*--help*)
	echo "MOLMAKE-INITRAMFS $MOL_VERSION"
	echo " (C)2007 Keicho Kondo <dgel@users.sourceforge.jp>"
	echo
	echo "This program makes initramfs image for Make One Linux."
	echo "Usage: molmake-initramfs [option]"
	echo
	echo "   --clean         : Clean up files made by this script"
	echo "   --help          : Show this help"
	echo "   --version       : Show version and notice"
	echo
	echo "   --line          : Show running command line"
	echo "   --log           : Output log in $BUILD_ROOT/log"
	echo
	exit 0 ;;

	*--version*)
	echo "MOLMAKE-INITRAMFS $MOL_VERSION"
	echo "Written by Keicho Kondo."
	echo
	echo "Copyright (C) 2007 Keicho Kondo."
	echo "This is free software; see the source for copying conditions.  There is NO"
	echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
	echo
	exit 0 ;;

	*--clean*)
	echo "Cleaning initramfs image..."
	$CMD rm -rf ${INITRAM_ROOTDIR}
	$CMD rm -rf ${BUILD_ROOT}/patch
	$CMD rm -f ${INITRAM}
	$CMD rm -f ${BUILD_ROOT}/molmake-initramfs.flag
	exit 0 ;;
esac

# check flag
[ -f "${BUILD_ROOT}/molmake-initramfs.flag" ] && die "<< First, please run this script with --clean option. >>"


## === Start === ##
echo "MOLMAKE-INITRAMFS Starting"

## / ##
echo "Creating directories and links..."
$CMD mkdir -p ${INITRAM_ROOTDIR}

# making directories in initramfs
for d in ${MKDIR_ON_INITRAM}; do
	$CMD mkdir -p ${INITRAM_ROOTDIR}/${d}
done

# making links in initramfs
for d in ${MKLINK_ON_INITRAM}; do
	$CMD ln -sf /union/${d} ${INITRAM_ROOTDIR}/${d}
done

# making files in initram
for d in ${MKFILE_ON_INITRAM}; do
	$CMD touch ${INITRAM_ROOTDIR}/${d}
done


## /exec ##
echo "Installing executable files..."
$CMD mkdir -p ${INITRAM_ROOTDIR}/exec
$CMD install -m 755 ${EXEC_DATA}/init     ${INITRAM_ROOTDIR}
$CMD install -m 755 ${EXEC_DATA}/libmol   ${INITRAM_ROOTDIR}/exec
$CMD install -m 755 ${EXEC_DATA}/linuxrc  ${INITRAM_ROOTDIR}/exec
$CMD install -m 755 ${EXEC_DATA}/halt-mol ${INITRAM_ROOTDIR}/exec
$CMD install -m 755 ${EXEC_DATA}/autosetup-mol ${INITRAM_ROOTDIR}/exec/
[ -f "${EXEC_DATA}/final.sh" ] && $CMD install -m 755 ${EXEC_DATA}/final.sh ${INITRAM_ROOTDIR}/exec/
$CMD install -m 755 ${XSETUP}   ${INITRAM_ROOTDIR}/exec/xsetup-mol
$CMD install -m 755 ${DDCXINFO} ${INITRAM_ROOTDIR}/exec/ddcxinfo-mol
$CMD install -m 755 ${HWSETUP}  ${INITRAM_ROOTDIR}/exec/hwsetup-mol
$CMD install -m 755 ${BUSYBOX}  ${INITRAM_ROOTDIR}/exec/busybox-mol

# create busybox applet link
for BBAPPLET in $(get_busybox_applet_list ${BUSYBOX}); do
	$CMD ln -sf busybox-mol ${INITRAM_ROOTDIR}/exec/${BBAPPLET}
done

# install base distribution's commands and links
for cmd in ${CPYCMD_ON_INITRAM}; do
	$CMD install -m 755 $(which ${cmd})     ${INITRAM_ROOTDIR}/exec
	for lib in $(get_library_list $(which ${cmd})); do
		$CMD cp -a --parents $lib ${INITRAM_ROOTDIR}
	done
done


## /dev ##
echo "Creating device special files..."
#$CMD mkdir -p ${INITRAM_ROOTDIR}/dev
#$CMD mkdir -p ${INITRAM_ROOTDIR}/dev/pts
#$CMD mkdir -p ${INITRAM_ROOTDIR}/dev/shm
$CMD make_device_files ${INITRAM_ROOTDIR}/dev ${CONFIG_ROOT}/make-device.list
#$CMD ln -sf ../proc/self/fd   ${INITRAM_ROOTDIR}/dev/fd
#$CMD ln -sf ../proc/self/fd/2 ${INITRAM_ROOTDIR}/dev/stderr
#$CMD ln -sf ../proc/self/fd/0 ${INITRAM_ROOTDIR}/dev/stdin
#$CMD ln -sf ../proc/self/fd/1 ${INITRAM_ROOTDIR}/dev/stdout
#$CMD ln -sf fd0  ${INITRAM_ROOT}/dev/floppy
#$CMD ln -sf ram1 ${INITRAM_ROOT}/dev/ram
#$CMD ln -sf ram0 ${INITRAM_ROOT}/dev/ramdisk


## /etc ##
echo "Installing configuration files..."
$CMD mkdir -p ${INITRAM_ROOTDIR}/etc
#$CMD install -m 644 "${CONFIG_ROOT}/replace/fstab" "${INITRAM_ROOTDIR}/etc/fstab"
#$CMD ln -s /proc/mounts ${INITRAM_ROOTDIR}/etc/mtab


## /replace ##
echo "Installing replacement files..."
if [ -d "$REPLACE_LISTDIR" -o -d "$PATCH_LISTDIR" ]; then
	$CMD mkdir -p ${INITRAM_ROOTDIR}/replace
	$CMD touch ${INITRAM_ROOTDIR}/replace/live-replace.list
fi

# replace
if [ -d "$REPLACE_LISTDIR" ]; then
	find $REPLACE_LISTDIR -name "*.list" | xargs grep -v "^#" | while read SRC DST; do
		[ -e "${REPLACE_DATA}/${SRC}" ] || die "<< Can't find ${REPLACE_DATA}/${SRC} >>"
		$CMD cp -a ${REPLACE_DATA}/${SRC} ${INITRAM_ROOTDIR}/replace
		$CMD echo "$SRC $DST" >>${INITRAM_ROOTDIR}/replace/live-replace.list
	done
	[ "$?" != "0" ] && die "<< Can't install replace data >>"
fi

# patch
if [ -d "$PATCH_LISTDIR" ]; then
	find $PATCH_LISTDIR -name "*.list" | xargs grep -v "^#" | while read SRC DST; do
		[ -f "${PATCH_DATA}/${SRC}" ] || die "<< Can't find ${PATCH_DATA}/${SRC} >>"
		[ -f "${DST}" ] || die "<< Can't find ${DST} >>"
		$CMD cp -a ${DST} ${INITRAM_ROOTDIR}/replace/
		$CMD patch ${INITRAM_ROOTDIR}/replace/$(basename $DST) ${PATCH_DATA}/${SRC}
		$CMD echo "$(basename $DST) $DST" >>${INITRAM_ROOTDIR}/replace/live-replace.list
	done
	[ "$?" != "0" ] && die "<< Can't install patch data >>"
fi


## /modules ##
echo "Installing kernel modules..."
$CMD mkdir -p ${INITRAM_ROOTDIR}/modules
$CMD mkdir -p ${INITRAM_ROOTDIR}/modules/scsi
$CMD mkdir -p ${INITRAM_ROOTDIR}/modules/storage
$CMD mkdir -p ${INITRAM_ROOTDIR}/modules/add

# copying necessary kernel modules
for modules in ${MODULE_LIST}; do
	FOUND_MODULE="$(find /lib/modules/${KERNEL_RELEASE} -name ${modules})"
	[ -n "$FOUND_MODULE" ] && $CMD cp $FOUND_MODULE ${INITRAM_ROOTDIR}/modules/
done
for modules in ${SCSI_MODULE_LIST}; do
	FOUND_MODULE="$(find /lib/modules/${KERNEL_RELEASE} -name ${modules})"
	[ -n "$FOUND_MODULE" ] && $CMD cp $FOUND_MODULE ${INITRAM_ROOTDIR}/modules/scsi/
done
for modules in ${STORAGE_MODULE_LIST}; do
	FOUND_MODULE="$(find /lib/modules/${KERNEL_RELEASE} -name ${modules})"
	[ -n "$FOUND_MODULE" ] && $CMD cp $FOUND_MODULE ${INITRAM_ROOTDIR}/modules/storage/
done
for modules in $(make_list $IN_MOD_LIST | sed -e 's/\.ko//g'); do
	FOUND_MODULE="$(find /lib/modules/${KERNEL_RELEASE} -name ${modules}.ko)"
	[ -n "$FOUND_MODULE" ] && $CMD cp $FOUND_MODULE ${INITRAM_ROOTDIR}/modules/add/
done


## initramfs ##
echo "Creating initramfs image..."
#cd ${INITRAM_ROOTDIR}; find . | cpio -o -H newc | gzip --best >${INITRAM}
$CMD make_initramfs $INITRAM_ROOTDIR $INITRAM


## === fin. === ##
$CMD touch ${BUILD_ROOT}/molmake-initramfs.flag
echo "MOLMAKE-INITRAMFS Finished"
exit 0


