#!/bin/bash
#================
# FILE          : linuxrc
#----------------
# PROJECT       : OpenSuSE KIWI Image System
# COPYRIGHT     : (c) 2006 SUSE LINUX Products GmbH. All rights reserved
#               :
# AUTHOR        : Marcus Schaefer <ms@suse.de>
#               :
# BELONGS TO    : Operating System images
#               :
# DESCRIPTION   : This file is changed to become the real
#               : linuxrc script which is used to prepare the
#               : operating system for the main image
#               :
#               :
# STATUS        : BETA
#----------------
#======================================
# Exports (General)
#--------------------------------------
export PATH="/sbin:/bin:/usr/sbin:/usr/bin"
export IFS_ORIG=$IFS
export ARCH=`arch`
export DEBUG=0

#======================================
# Exports (Booting)
#--------------------------------------
export DOMURD_MODULES="xennet xenblk"
export INITRD_MODULES="reiserfs"
export LOCAL_BOOT="no"
export systemIntegrity="clean"
export KERNEL_LIST

#======================================
# Exports (Alias)
#--------------------------------------
export SYSALIAS="undefined"
export NAME=0

#======================================
# Exports (Partitioning)
#--------------------------------------
export PART_FILE="/etc/partition.table"
export PART_MOUNT
export PART_DEV
export PART_COUNT=0
export PART_NUMBER=0
export PART_NEED_EXTENDED=0
export PART_NEED_FILL=0
export NO_FILE_SYSTEM=0

#======================================
# Exports (Status)
#--------------------------------------
export SYSTEM_INTEGRITY
export SYSTEM_MD5STATUS

#======================================
# Functions
#--------------------------------------
. /include

#======================================
# Functions
#--------------------------------------
VMFindSystem () {
	for rdevice in /dev/hda2 /dev/sda2 /dev/hda1 /dev/sda1;do
		imageRootDevice=$rdevice
		imageDiskDevice=`echo $imageRootDevice | tr -d [0-9]`
		if ! mount $imageRootDevice /mnt &>/dev/null;then
			mount -t squashfs $imageRootDevice /mnt &>/dev/null
		fi
		if [ $? = 0 ];then
			umount /mnt
			break
		fi
	done
}
#======================================
# Beautify Startup
#--------------------------------------
clear
echo "Loading KIWI VMX Boot-System..."
echo "-------------------------------"

#======================================
# 1) Mounting local file systems
#--------------------------------------
mount -t proc  proc    /proc
mount -t sysfs sysfs   /sys
mount -t devpts devpts /dev/pts
closeKernelConsole

#======================================
# 2) Prepare module load support 
#--------------------------------------
touch /etc/modules.conf
touch /lib/modules/*/modules.dep

#======================================
# 3) Including required kernel modules
#--------------------------------------
probeDevices

#======================================
# 4) Mount VM (boot)
#--------------------------------------
VMFindSystem

#======================================
# 5) Get filesystem type
#--------------------------------------
probeFileSystem $imageRootDevice
if [ $FSTYPE = "unknown" ];then
	systemException \
		"Couldn't determine filesystem type... abort" \
	"reboot"
fi

#======================================
# 6) Resize filesystem to full space
#--------------------------------------
Echo "Filesystem of VMX system is: $FSTYPE -> $imageRootDevice"
if test "$FSTYPE" = "squashfs";then
	export UNIONFS_CONFIG="$imageDiskDevice"3,"$imageDiskDevice"2,aufs
else
	Echo "Resize filesystem to full partition space..."
	if test "$FSTYPE" = "reiserfs";then
		resize_reiserfs $imageRootDevice
		INITRD_MODULES="$INITRD_MODULES reiserfs"
	fi
	if test "$FSTYPE" = "ext2";then
		e2fsck -y -f $imageRootDevice
		resize2fs -F -p $imageRootDevice
		INITRD_MODULES="$INITRD_MODULES ext2"
	fi
	if test "$FSTYPE" = "ext3";then
		e2fsck -y -f $imageRootDevice
		resize2fs -F -p $imageRootDevice
		tune2fs -j $imageRootDevice
		INITRD_MODULES="$INITRD_MODULES ext3"
	fi
fi

#======================================
# 7) Mount VM (boot)
#--------------------------------------
if ! mountSystem $imageRootDevice;then
	systemException "Failed to mount root filesystem" "reboot"
fi

#======================================
# 8) Get kernel list for local boot
#--------------------------------------
kernelList /mnt

#======================================
# 9) Create system dependant files
#--------------------------------------
#======================================
# a) /etc/fstab
#--------------------------------------
mkdir -p /config/etc
if [ -z "$UNIONFS_CONFIG" ]; then
	echo "$imageRootDevice / $FSTYPE defaults 0 0"    > /config/etc/fstab
fi
echo "devpts  /dev/pts   devpts mode=0620,gid=5 0 0" >> /config/etc/fstab
echo "proc    /proc   proc    defaults 0 0"          >> /config/etc/fstab
echo "sysfs   /sys    sysfs   noauto 0 0"            >> /config/etc/fstab
echo "tmpfs   /dev/shm tmpfs  defaults 0 0"          >> /config/etc/fstab

#======================================
# b) /boot/grub/menu.lst
#--------------------------------------
console=""
gdev="(hd0,0)"
menu=/config/boot/grub/menu.lst
mkdir -p /config/boot/grub
if [ ! -z "$UNIONFS_CONFIG" ]; then
	gnum=`echo $imageRootDevice | sed -e "s/\/dev.*\([0-9]\)/\\1/"`
	gdev="(hd0,$gnum)"
fi
echo "timeout 10"                                      > $menu
if [ -f /image/loader/message ];then
	echo "gfxmenu $gdev/boot/message"                 >> $menu
fi
IFS="," ; for i in $KERNEL_LIST;do
	if test ! -z "$i";then
		kernel=`echo $i | cut -f1 -d:`
		initrd=`echo $i | cut -f2 -d:`
		echo "title KIWI VM boot" >> $menu
		if [ $kernel = "vmlinuz-xen" ];then
			echo " root $gdev"                        >> $menu
			echo " kernel /boot/xen.gz"               >> $menu
			echo -n " module /boot/$kernel"           >> $menu
			echo -n " root=$imageRootDevice $console" >> $menu
			echo " vga=0x314"                         >> $menu
			echo " module /boot/$initrd"              >> $menu
		else
			echo -n " kernel $gdev/boot/$kernel"      >> $menu
			echo -n " root=$imageRootDevice $console" >> $menu
			echo " vga=0x314"                         >> $menu
			echo " initrd $gdev/boot/$initrd"         >> $menu
		fi
	fi
done

#======================================
# c) /etc/grub.conf
#--------------------------------------
mkdir -p /config/etc
gconf=/config/etc/grub.conf
gdev="(hd0,1)"
if [ ! -z "$UNIONFS_CONFIG" ]; then
	gnum=`echo $imageRootDevice | sed -e "s/\/dev.*\([0-9]\)/\\1/"`
	gdev="(hd0,$gnum)"
fi
echo -en "root $gdev\ninstall"           > $gconf
echo -n " --stage2=/boot/grub/stage2"   >> $gconf
echo -n " /boot/grub/stage1 d (hd0)"    >> $gconf
echo -n " /boot/grub/stage2 0x8000"     >> $gconf
echo " $gdev/boot/grub/menu.lst"        >> $gconf
echo "quit"                             >> $gconf

#======================================
# d) /etc/sysconfig/kernel
#--------------------------------------
mkdir -p /config/etc/sysconfig
syskernel=/config/etc/sysconfig/kernel
echo "INITRD_MODULES=\"$INITRD_MODULES\""       > $syskernel
echo "DOMU_INITRD_MODULES=\"$DOMURD_MODULES\"" >> $syskernel

#======================================
# 10) copy system dependant files
#--------------------------------------
cd /config
find . -type d | while read d ; do  mkdir -p /mnt/$d ; done
find . -type f | while read f ; do  cp $f /mnt/$f ; done
cd /
rm -rf /config

#======================================
# 11) setup real root device
#--------------------------------------
echo 256 > /proc/sys/kernel/real-root-dev

#======================================
# 12) umount system filesystems
#--------------------------------------
umount /dev/pts
umount /sys
umount /proc

#======================================
# 13) copy initrd files to image
#--------------------------------------
if [ -f /image/loader/message ];then
	mv /image/loader/message /mnt/boot
fi
cp /preinit /mnt
cp /include /mnt

#======================================
# 14) Activate new root
#--------------------------------------
Echo "Activating Image: [$imageRootDevice]"
cd /mnt && exec < dev/console >dev/console 2>&1
Echo "Calling preinit phase..."
reopenKernelConsole
/mnt/sbin/pivot_root . mnt >/dev/null 2>&1
if test $? != 0;then
	PIVOT=false
	cleanInitrd && mount --move . / && chroot . ./preinit
	chroot . rm ./preinit
	chroot . rm ./include
else
	PIVOT=true
	./preinit
	rm ./preinit
	rm ./include
fi
#======================================
# 15) Unmount initrd / system init
#--------------------------------------
echo " "
echo "Booting into final System..."
echo "----------------------------"
export IFS=$IFS_ORIG
mount -n -o remount,rw / 2>/dev/null
if [ $PIVOT = "true" ];then
	exec umount -n -l /mnt
else
	exec chroot . /sbin/init $@
fi
