#!/bin/mksh
# This file is part of the OpenADK project.
# install Gentoo to a block/flash device

if [ $(id -u) -ne 0 ]; then
  print installation is only possible as root
  exit 1
fi

# get architecture
arch=$(uname -m)
# get adk target system
target=$(cat /etc/.adktarget)
if [ -z $target ]; then
  print autodetection of target failed
  exit 1
fi

function help {
	cat >&2 <<EOF
Syntax: gentooinstall <archive> <device> <hostname>
EOF
	exit 1
}

if [ -z $1 ]; then
  print no archive given
  help 
fi

if [ -z $2 ]; then
  print no device given
  help 
fi

if [ -z $3 ]; then
  print no hostname given
  help 
fi

archive=$1
device=$2
hostname=$3
swapsize=2048000
fs=ext4
tools="parted partprobe sfdisk mkfs.ext2"

f=0
for tool in $tools;do
  if ! which $tool >/dev/null; then
    echo "checking if $tool is installed... failed"
    f=1
  fi
done
if [ $f -eq 1 ]; then 
  exit 1
fi

# create empty partition table
function create_label {
  print "creating empty partition table"
  parted -s $1 mklabel msdos > /dev/null 2>&1
  if [ $? -ne 0 ]; then
    echo "creating empty partition failed!"
    exit 1
  fi
}

# create partition, with fstype start and end in sectors
function create_partition {
  print creating partition on $1 with $2
  parted -s $1 -- unit MiB mkpart primary $2 $3 $4 > /dev/null 2>&1
  if [ $? -ne 0 ]; then
    echo "creating primary partition failed!"
    exit 1
  fi
}

function set_boot_flag {
  print setting bootflag on $1 partition $2
  parted -s $1 set $2 boot on > /dev/null 2>&1
  if [ $? -ne 0 ]; then
    echo "setting bootflag failed!"
    exit 1
  fi
}

function change_part_type {
  print setting partition type on $1 partition $2 to $3
  sfdisk --change-id $1 $2 $3 >/dev/null 2>&1
  if [ $? -ne 0 ]; then
    echo "changing partition type failed!"
    exit 1
  fi
}

function create_filesystem {
  print creating filesystem $2 on $1 partition $3
  mkfs.ext2 -j -F -q ${1}${3} >/dev/null 2>&1
  if [ $? -ne 0 ]; then
    echo "creating filesystem on partition failed!"
    exit 1
  fi
}

function mount_fs {
  print mounting ${1}${2} to $4 with filesystem $3
  mount -t $3 ${1}${2} $4
  if [ $? -ne 0 ]; then
    echo "mounting filesystem failed!"
    exit 1
  fi
}

function extract_archive {
  print extracting archive $1 onto $2
  tar -C $2 -xpf $1
  if [ $? -ne 0 ]; then
    echo "archive extraction failed!"
    exit 1
  fi
}

function create_chroot_installer {
(
  print emerge-webrsync
  print emerge dhcpcd
  print rc-update add sshd default
  print emerge grub:2
) >/mnt/install
  chmod 755 /mnt/install
}

function create_chroot_grubinstaller {
(
  print 'grub-mkconfig > /boot/grub/grub.cfg'
  print grub-install /dev/sda
) >/mnt/installgrub
  chmod 755 /mnt/installgrub
}

function chroot_install {
  print Installing Gentoo
  cat /etc/resolv.conf > /mnt/etc/resolv.conf
  mount -t proc proc /mnt/proc
  mount -t sysfs sys /mnt/sys
  mount -o bind /dev /mnt/dev
  mount -t tmpfs tmpfs /mnt/dev/shm
  chroot /mnt /install
  if [ $? -ne 0 ]; then
    echo "Gentoo installation failed!"
    umount /mnt/dev/shm
    umount /mnt/{proc,dev,sys}
    umount /mnt
    exit 1
  fi
  printf "Now manually install a kernel"
  chroot /mnt /bin/bash
  printf "Now installang bootloader"
  chroot /mnt /installgrub
  if [ $? -ne 0 ]; then
    echo "Gentoo installation failed!"
    umount /mnt/dev/shm
    umount /mnt/{proc,dev,sys}
    umount /mnt
    exit 1
  fi
}

case $arch {
  (x86|x86_64)
    create_label $device
    create_partition $device sw 2 2048
    create_partition $device ext2 2049 -1
    set_boot_flag $device 2
    partprobe $device
    sync
    create_filesystem $device $fs 2
    [[ -x /sbin/mdev ]] && mdev -s
    mount_fs $device 2 $fs /mnt
    extract_archive $archive /mnt
    create_chroot_installer
    chroot_install /mnt
    print "/dev/sda2	/	ext4	defaults	0	1" > /mnt/etc/fstab
    print hostname=\"$hostname\" > /mnt/etc/conf.d/hostname
    chmod 1777 /mnt/tmp
    sync
    umount /mnt/dev/shm
    umount /mnt/{proc,dev,sys}
    umount /mnt
    ;;
}

echo "Successfully installed Gentoo on $target."
exit 0
