#!/bin/sh

# TODO - this shell script file needs serios refactoring since right now it does
# too many things:
# 
# 1) Deal with 'src' copy.
# 2) Generate the 'overlay' software bundles.
# 3) Create proper overlay structure.
# 4) Prepare the actual ISO structure.
# 5) Generate the actual ISO image.
#
# Probably it's best to create separate shell scripts for each functionality. 

echo "*** GENERATE ISO BEGIN ***"

setvar SRC_DIR = $(pwd)

# Save the kernel installation directory.
setvar KERNEL_INSTALLED = "$SRC_DIR/work/kernel/kernel_installed"

# Find the Syslinux build directory.
cd work/syslinux
cd $(ls -d *)
setvar WORK_SYSLINUX_DIR = $(pwd)
cd $SRC_DIR

# Remove the old ISO file if it exists.
rm -f minimal_linux_live.iso
echo "Old ISO image files has been removed."

# Remove the old ISO generation area if it exists.
echo "Removing old ISO image work area. This may take a while..."
rm -rf work/isoimage

# This is the root folder of the ISO image.
mkdir work/isoimage
echo "Prepared new ISO image work area."

# Read the 'COPY_SOURCE_ISO' property from '.config'
setvar COPY_SOURCE_ISO = "$(grep -i ^COPY_SOURCE_ISO .config | cut -f2 -d'=')"

if test $COPY_SOURCE_ISO = "true"  {
  # Copy all prepared source files and folders to '/src'. Note that the scripts
  # will not work there because you also need proper toolchain.
  cp -r work/src work/isoimage
  echo "Source files and folders have been copied to '/src'."
} else {
  echo "Source files and folders have been skipped."
}

# Read the 'OVERLAY_BUNDLES' property from '.config'
setvar OVERLAY_BUNDLES = "$(grep -i ^OVERLAY_BUNDLES .config | cut -f2 -d'=')"

if test ! $OVERLAY_BUNDLES = ""  {
  echo "Generating additional overlay bundles. This may take a while..."
  cd minimal_overlay
  time sh overlay_build.sh
  cd $SRC_DIR
} else {
  echo "Generation of additional overlay bundles has been skipped."
}

cd work/isoimage

# Now we copy the kernel.
cp $KERNEL_INSTALLED/kernel ./kernel.xz

# Now we copy the root file system.
cp ../rootfs.cpio.xz ./rootfs.xz

# Read the 'OVERLAY_TYPE' property from '.config'
setvar OVERLAY_TYPE = "$(grep -i ^OVERLAY_TYPE $SRC_DIR/.config | cut -f2 -d'=')"

if test $OVERLAY_TYPE = "sparse" -a $(id -u) = "0"  {
  # Use sparse file as storage place. The above check guarantees that the whole
  # script is executed with root permissions or otherwise this block is skipped.
  # All files and folders located in the folder 'minimal_overlay' will be merged
  # with the root folder on boot.
  
  echo "Using sparse file for overlay."
  
  # This is the BusyBox executable that we have already generated.
  setvar BUSYBOX = "../rootfs/bin/busybox"  
  
  # Create sparse image file with 1MB size. Note that this increases the ISO
  # image size.
  $BUSYBOX truncate -s 1M minimal.img
  
  # Find available loop device.
  setvar LOOP_DEVICE = $($BUSYBOX losetup -f)
  
  # Associate the available loop device with the sparse image file.
  $BUSYBOX losetup $LOOP_DEVICE minimal.img
  
  # Format the sparse image file with Ext2 file system. 
  $BUSYBOX mkfs.ext2 $LOOP_DEVICE
  
  # Mount the sparse file in folder 'sparse".
  mkdir sparse
  $BUSYBOX mount minimal.img sparse
  
  # Create the overlay folders.
  mkdir -p sparse/rootfs
  mkdir -p sparse/work  
  
  # Copy the overlay content.
  cp -r $SRC_DIR/work/src/minimal_overlay/rootfs/* sparse/rootfs/
  
  # Unmount the sparse file and delete the temporary folder.
  $BUSYBOX umount sparse
  rm -rf sparse
  
  # Detach the loop device since we no longer need it.
  $BUSYBOX losetup -d $LOOP_DEVICE
} elif test $OVERLAY_TYPE = "folder"  {
  # Use normal folder structure for overlay. All files and folders located in
  # the folder 'minimal_overlay' will be merged with the root folder on boot.
  
  echo "Using folder structure for overlay."
  
  mkdir -p minimal/rootfs
  mkdir -p minimal/work  
  
  cp -rf $SRC_DIR/work/src/minimal_overlay/rootfs/* \
    minimal/rootfs/
} else {
  echo "Generating ISO image with no overlay structure..."
}

# Copy the precompiled files 'isolinux.bin' and 'ldlinux.c32' in the ISO image
# root folder.
cp $WORK_SYSLINUX_DIR/bios/core/isolinux.bin .
cp $WORK_SYSLINUX_DIR/bios/com32/elflink/ldlinux/ldlinux.c32 .

# Create the ISOLINUX configuration file.
echo 'default kernel.xz  initrd=rootfs.xz vga=ask' > ./syslinux.cfg

# Create UEFI start script.
mkdir -p efi/boot
cat <<< """ > ./efi/boot/startup.nsh
echo -off
echo Minimal Linux Live is starting...
'\'kernel.xz initrd='\'rootfs.xz
"""
> ./efi/boot/startup.nsh
echo -off
echo Minimal Linux Live is starting...
\\kernel.xz initrd=\\rootfs.xz
CEOF

# Now we generate the ISO image file.
genisoimage \
  -J \
  -r \
  -o ../minimal_linux_live.iso \
  -b isolinux.bin \
  -c boot.cat \
  -input-charset UTF-8 \
  -no-emul-boot \
  -boot-load-size 4 \
  -boot-info-table \
  ./

# Copy the ISO image to the root project folder.
cp ../minimal_linux_live.iso ../../

if test $(id -u) = "0"  {
  # Apply ownership back to original owner for all affected files.
  chown $(logname) ../../minimal_linux_live.iso
  chown $(logname) ../../work/minimal_linux_live.iso
  chown -R $(logname) .
  echo "Applied original ownership to all affected files and folders."
}

cd $SRC_DIR

echo "*** GENERATE ISO END ***"