#!/bin/sh

usage() {
	echo "quickinst <install_mode> <destdir> <package_directory|server_url>"
	echo
	echo "This script is for users who would rather partition/mkfs/mount their target"
	echo "media manually than go through the routines in the setup script."
	echo
	echo "First make sure you have all your filesystems mounted under <destdir>."
	echo "e.g. mount -t iso9660 /dev/sdc or /dev/sr0 (for new naming sheme) /src "
	echo "Then run this script to install all base packages to <destdir>."
	echo
	if [ -e /usr/bin/wget ]; then
		echo "<install_mode> must be either 'ftp' or 'cd'"
	else
		echo "<install_mode> must be 'cd'"
	fi
	echo
	echo "Examples:"
	if [ -e /usr/bin/wget ]; then
		if [ "$(uname -m)" = "x86_64" ]; then
    			echo "  quickinst ftp /mnt ftp://ftp.archlinux.org/core/os/x86_64"
		else 	
			echo "  quickinst ftp /mnt ftp://ftp.archlinux.org/core/os/i686"
		fi
	fi

	echo "  quickinst cd  /mnt /src/core/pkg"
	echo ""
	exit 0
}

INSTMODE=$1
DESTDIR=$2
PKGARG=$3

if [ "$PKGARG" = "" ]; then
	usage
fi

! [ -d /tmp ] && mkdir /tmp

# sometimes this gets mounted RO, dunno why
/bin/mount -o remount,rw / >/dev/null 2>&1

PACMAN=
[ -f /tmp/usr/bin/pacman.static ] && PACMAN=/tmp/usr/bin/pacman.static
[ -f /usr/bin/pacman.static ] && PACMAN=/usr/bin/pacman.static
if [ "$PACMAN" = "" ]; then
	cd /tmp
	if [ "$INSTMODE" = "ftp" ]; then
		echo "Downloading pacman..."
		wget $PKGARG/pacman*.pkg.tar.gz
		if [ $? -gt 0 ]; then
			echo "error: Download failed"
			exit 1
		fi
		tar -xzf pacman*.pkg.tar.gz
	elif [ "$INSTMODE" = "cd" ]; then
		echo "Unpacking pacman..."
		tar -xzf $PKGARG/pacman*.pkg.tar.gz
	fi
fi
[ -f /tmp/usr/bin/pacman.static ] && PACMAN=/tmp/usr/bin/pacman.static
if [ "$PACMAN" = "" ]; then
	echo "error: Cannot find the pacman.static binary!"
	exit 1
fi

if [ "$INSTMODE" = "ftp" ]; then
	echo "[core]" >/tmp/pacman.conf
	echo "Server = $PKGARG" >>/tmp/pacman.conf
	mkdir -p $DESTDIR/var/cache/pacman/pkg /var/cache/pacman >/dev/null 2>&1
	rm -f /var/cache/pacman/pkg >/dev/null 2>&1
	ln -sf $DESTDIR/var/cache/pacman/pkg /var/cache/pacman/pkg >/dev/null 2>&1
fi

if [ "$INSTMODE" = "cd" ]; then
	echo "[core]" >/tmp/pacman.conf
	echo "Server = file://$PKGARG" >>/tmp/pacman.conf
	mkdir -p $DESTDIR/var/cache/pacman/pkg /var/cache/pacman >/dev/null 2>&1
	rm -f /var/cache/pacman/pkg >/dev/null 2>&1
	ln -sf $PKGARG /var/cache/pacman/pkg >/dev/null 2>&1
fi

! [ -d $DESTDIR/var/lib/pacman ] && mkdir -p $DESTDIR/var/lib/pacman
! [ -d /var/lib/pacman ] && mkdir -p /var/lib/pacman
# mount proc/sysfs first, so mkinitrd can use auto-detection if it wants
! [ -d $DESTDIR/proc ] && mkdir $DESTDIR/proc
! [ -d $DESTDIR/sys ] && mkdir $DESTDIR/sys
! [ -d $DESTDIR/dev ] && mkdir $DESTDIR/dev
mount -t proc none $DESTDIR/proc
mount -t sysfs none $DESTDIR/sys
mount -o bind /dev $DESTDIR/dev	
$PACMAN -r $DESTDIR --config /tmp/pacman.conf -Sy base
umount $DESTDIR/proc $DESTDIR/sys $DESTDIR/dev
if [ $? -gt 0 ]; then
	echo
	echo "Package installation FAILED."
	echo
	exit 1
fi

echo 
echo "Package installation complete."
echo 
echo "Please install a bootloader.  Edit the appropriate config file for"
echo "your loader, and chroot into your system to install it into the"
echo "boot sector:"
echo "  # mount -o bind /dev $DESTDIR/dev"
echo "  # mount -t proc none $DESTDIR/proc"
echo "  # mount -t sysfs none $DESTDIR/sys"
echo "  # chroot $DESTDIR /bin/bash"
echo 
echo "For GRUB:"
echo "  # install-grub /dev/sda /dev/sdaX (replace with your boot partition)"
echo "  (or install manually by invoking the GRUB shell)"
echo "HINT XFS FILESYSTEM:" 
echo "If you have created xfs filesystems, freeze them before and unfreeze them after"
echo "installing grub (outside the chroot):"
echo "- freeze:"
echo "  # xfs_freeze -f $DESTDIR/boot"
echo "  # xfs_freeze -f $DESTDIR/"
echo "- unfreeze:"
echo "  # xfs_freeze -u $DESTDIR/boot"
echo "  # xfs_freeze -u $DESTDIR/"
echo 
echo "For LILO:"
echo "  # lilo"
echo
echo "Next step, initramfs setup:"
echo "Edit your /etc/mkinitcpio.conf and /etc/mkinitcpio.d/kernel26-fallback.conf"
echo "to fit your needs. After that run:" 
echo "# mkinitcpio -p kernel26"
echo 
echo "Then exit your chroot shell, edit $DESTDIR/etc/fstab and"
echo "$DESTDIR/etc/rc.conf, and reboot!"
echo 
exit 0
