#!/bin/bash -ue

<< MIT-LICENSE
Copyright (c) 2023 Jianjun Liu<jianjunliu@126.com> https://www.pkglinux.top

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
MIT-LICENSE

pkglinux-install-dir()
{
  echo "Installing to $1 ..."
  $PKGLINUX_INSTALL_GNOME && echo "with GNOME ..." || echo "without GNOME ..."
  $PKGLINUX_INSTALL_KDE   && echo "with KDE ..."   || echo "without KDE ..."
  
  mkdir -p $PKGLINUX_INSTALL_VERBOSE "$1"
  
  pkg-strap $PKGLINUX_INSTALL_VERBOSE -p $PKGLINUX_INSTALL_PREFIX -d $1 $PKGLINUX_INSTALL_REPO
  
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin up
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in nawk -y
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in nbsed -y
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in bootscripts -y
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in diffutils -y
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 cp -a /pkg/gnu/bin/* /usr/bin/
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 cp -a /pkg/gnu/bin/* /bin/
  if $PKGLINUX_INSTALL_MIN; then
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in pkgiso -y
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in firmware -y
  else
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in pkglinux -y
  fi
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 cp -a /pkg/gnu/bin/* /usr/bin/
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 cp -a /pkg/gnu/bin/* /bin/
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in openntpd -y
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in NetworkManager -y
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 depmod -a
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 passwd -d root
  if $PKGLINUX_INSTALL_GNOME || $PKGLINUX_INSTALL_KDE; then
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in modular-xorg -y
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in profile-data -y
    if $PKGLINUX_INSTALL_GNOME; then
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in gnome -y
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in lm-sensors -y
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in gnome-tweaks-tools -y
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in extension-manager -y
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in gnome-shell-extensions -y
    fi
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in xscreensaver -y
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in devilspie -y
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in sudo -y
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in firefox -y
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in fcitx5-chinese-addons -y
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in fcitx5-configtool -y
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in fcitx5-gtk -y
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in git -y
    if $PKGLINUX_INSTALL_KDE; then
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in kde4 -y
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in kde-workspace4 -y
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in clipit -y
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in network-manager-applet -y
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in consolekit -y
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in upower -y
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in alsa-plugins -y
      pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin in gcc7-libs -y
      (cd $1/pkg/share/kde4/services/kded/; mv -v powerdevil.desktop powerdevil.desktop.sav)
    fi
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /root/update.sh
  fi
  pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 /pkg/bin/pkgin clean
  
  if $PKGLINUX_INSTALL_GNOME || $PKGLINUX_INSTALL_KDE; then
    (mkdir $PKGLINUX_INSTALL_VERBOSE -p $1/home/alex)
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 usermod -a -G adm,root,lp,wheel,floppy,dialout,audio,video,cdrom,plugdev,power,pulse,netdev,scanner,uucp alex
    (mkdir $PKGLINUX_INSTALL_VERBOSE -p $1/pkg/etc/sudoers.d/)
    (cd $1/pkg/etc/sudoers.d/; echo "alex ALL=(ALL:ALL) NOPASSWD: ALL" >> alex)
    (cd $1; ln $PKGLINUX_INSTALL_VERBOSE -snf pkg/native/boot; rm -vf libx32)
    (cd $1/etc; mv $PKGLINUX_INSTALL_VERBOSE inittab.alex inittab)
    (cd $1/etc; mv $PKGLINUX_INSTALL_VERBOSE fstab.iso fstab)
    (cd $1/etc/conf.d; echo "agetty_options=\"--autologin alex --delay 1 --noclear tty1 38400 linux\"" >> agetty.tty1)
    (cd $1/pkg/native/etc; ln -snf ../usr/share/zoneinfo/Asia/Shanghai localtime)
    (cd $1/lib/; ln $PKGLINUX_INSTALL_VERBOSE -snf ../etc/modprobe.d)
    (cd $1/pkg/etc/polkit-1/rules.d/; cp $PKGLINUX_INSTALL_VERBOSE /root/lfs/49-nopasswd_global.rules .)
    (cd $1/pkg/etc/polkit-1/rules.d/; cp $PKGLINUX_INSTALL_VERBOSE /root/lfs/51-android.rules .)
    (cd $1/pkg/etc/polkit-1/rules.d/; cp $PKGLINUX_INSTALL_VERBOSE /root/lfs/55-inhibit-shutdown.rules .)
    (cd $1/pkg/etc/rc.d; cp $PKGLINUX_INSTALL_VERBOSE ../../share/examples/rc.d/dhcpcd .)
    (cd $1/pkg/etc/rc.d; cp $PKGLINUX_INSTALL_VERBOSE ../../share/examples/rc.d/NetworkManager .)
    (cd $1/pkg/etc/rc.d; cp $PKGLINUX_INSTALL_VERBOSE ../../share/examples/rc.d/dbus .)
    (cd $1/pkg/etc/rc.d; cp $PKGLINUX_INSTALL_VERBOSE ../../share/examples/rc.d/sshd .)
    (cd $1/pkg/etc/rc.d; cp $PKGLINUX_INSTALL_VERBOSE ../../share/examples/rc.d/nscd .)
    (cd $1/pkg/etc/rc.d; cp $PKGLINUX_INSTALL_VERBOSE ../../share/examples/rc.d/openntpd .)
    (cd $1/pkg/etc; echo "#dhcpcd=YES" >> rc.conf)
    (cd $1/pkg/etc; echo sshd=YES >> rc.conf)
    (cd $1/pkg/etc; echo dbus=YES >> rc.conf)
    (cd $1/pkg/etc; echo NetworkManager=YES >> rc.conf)
    (cd $1/pkg/etc; echo nscd=YES >> rc.conf)
    (cd $1/pkg/etc; echo openntpd=YES >> rc.conf)
    (cd $1/pkg/etc/pkgin/; sed -i -e 's#[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}:[0-9]\+.\+/current#repos.pkglinux.top/dist#g' repositories.conf)
    (cd $1/pkg/etc/pkgin/; sed -i -e 's#localhost:[0-9]\+.\+/current#repos.pkglinux.top/dist#g' repositories.conf)
    (cd $1/root; cp $PKGLINUX_INSTALL_VERBOSE alex.bashrc .bashrc)
    (cd $1/home/alex; cp $PKGLINUX_INSTALL_VERBOSE $1/root/.bashrc .)
    (cd $1/home/alex; cp $PKGLINUX_INSTALL_VERBOSE $1/root/.bash_profile .)
    (cd $1/home/alex; sed -i 's:echo startx:startx &> /dev/null #echo startx:g' .bash_profile)
    (cd $1/home/alex; cp $PKGLINUX_INSTALL_VERBOSE -r $1/root/.devilspie .)
    (cd $1/home/alex; cp $PKGLINUX_INSTALL_VERBOSE $1/root/dircolors.ansi-universal .)
    if $PKGLINUX_INSTALL_GNOME; then
      (cd $1/home/alex; cp $PKGLINUX_INSTALL_VERBOSE $1/root/xinitrc .)
      (cd $1/home/alex; cp $PKGLINUX_INSTALL_VERBOSE xinitrc .xinitrc)
    fi
    if $PKGLINUX_INSTALL_KDE; then
      (cd $1/home/alex; cp $PKGLINUX_INSTALL_VERBOSE $1/root/xinitrc.kde .)
      (cd $1/home/alex; cp $PKGLINUX_INSTALL_VERBOSE xinitrc.kde .xinitrc)
    fi
    (cd $1/home/alex; tar $PKGLINUX_INSTALL_VERBOSE -xJf $1/root/alex.config.txz)
    (cd $1/home/alex; tar $PKGLINUX_INSTALL_VERBOSE -xJf $1/root/alex.local.txz)
    (cd $1/home/alex; tar $PKGLINUX_INSTALL_VERBOSE -xJf $1/root/alex.Desktop.txz)
    (cd $1/home/alex; tar $PKGLINUX_INSTALL_VERBOSE -xzf $1/root/alex.themes.txz)
    (cd $1/home/alex; tar $PKGLINUX_INSTALL_VERBOSE -xJf $1/root/alex.fonts.txz)
    if $PKGLINUX_INSTALL_KDE; then
      (cd $1/home/alex; tar $PKGLINUX_INSTALL_VERBOSE -xJf $1/root/alex.kde.txz)
      (cd $1/home/alex/.kde/share/config/; mv $PKGLINUX_INSTALL_VERBOSE plasma-desktop-appletsrc plasma-desktop-appletsrc.bak)
    fi
    pkg-chroot $PKGLINUX_INSTALL_VERBOSE -d $1 chown -R 1000:1000 /home/alex
    (cd $1/pkg/share/icons/; tar $PKGLINUX_INSTALL_VERBOSE -xJf $1/root/aero.txz)
  else
    (cd $1; ln $PKGLINUX_INSTALL_VERBOSE -snf pkg/native/boot; rm -vf libx32)
    (cd $1/etc; cp $PKGLINUX_INSTALL_VERBOSE inittab.root inittab)
    (cd $1/etc; mv $PKGLINUX_INSTALL_VERBOSE fstab.iso fstab)
    (cd $1/etc/conf.d; echo "agetty_options=\"--autologin root --delay 1 --noclear tty1 38400 linux\"" >> agetty.tty1)
    (cd $1/lib/; ln $PKGLINUX_INSTALL_VERBOSE -snf ../etc/modprobe.d)
    (cd $1/pkg/etc/rc.d; cp $PKGLINUX_INSTALL_VERBOSE ../../share/examples/rc.d/dhcpcd .)
    (cd $1/pkg/etc/rc.d; cp $PKGLINUX_INSTALL_VERBOSE ../../share/examples/rc.d/NetworkManager .)
    (cd $1/pkg/etc/rc.d; cp $PKGLINUX_INSTALL_VERBOSE ../../share/examples/rc.d/dbus .)
    (cd $1/pkg/etc/rc.d; cp $PKGLINUX_INSTALL_VERBOSE ../../share/examples/rc.d/sshd .)
    (cd $1/pkg/etc; echo "#dhcpcd=YES" >> rc.conf)
    (cd $1/pkg/etc; echo sshd=YES >> rc.conf)
    (cd $1/pkg/etc; echo dbus=YES >> rc.conf)
    (cd $1/pkg/etc; echo NetworkManager=YES >> rc.conf)
    (cd $1/pkg/etc/pkgin/; sed -i -e 's#[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}:[0-9]\+.\+/current#repos.pkglinux.top/dist#g' repositories.conf)
    (cd $1/pkg/etc/pkgin/; sed -i -e 's#localhost:[0-9]\+.\+/current#repos.pkglinux.top/dist#g' repositories.conf)
    if $PKGLINUX_INSTALL_MIN; then
      (cd $1; rm -f $PKGLINUX_INSTALL_VERBOSE lib/*.a usr/lib/*.a pkg/lib/*.a)
      (cd $1; rm -rf $PKGLINUX_INSTALL_VERBOSE lib/pkgconfig usr/lib/pkgconfig pkg/lib/pkgconfig)
      (cd $1; rm -rf $PKGLINUX_INSTALL_VERBOSE pkg/include usr/include)
    fi
  fi
}

PKGLINUX_INSTALL_VERBOSE=""
PKGLINUX_INSTALL_PREFIX="2022Q2"
PKGLINUX_INSTALL_ARCH="$(uname -m)"
PKGLINUX_INSTALL_REPO="https://repos.pkglinux.top/dist/$PKGLINUX_INSTALL_ARCH/packages.$PKGLINUX_INSTALL_PREFIX/All"
PKGLINUX_INSTALL_REPO_ROOT="$(dirname $(dirname $PKGLINUX_INSTALL_REPO))/iso"
curl --head --silent --fail -k "$PKGLINUX_INSTALL_REPO_ROOT/LATEST.txt" 2>&1> /dev/null &&
PKGLINUX_INSTALL_PREFIX="$(curl -sk "$PKGLINUX_INSTALL_REPO_ROOT/LATEST.txt" | grep -v "^#" | cut -f1 | tail -1)"
[ -L /pkg ] && [ -d /pkg ] && PKGLINUX_INSTALL_PREFIX="$(readlink /pkg)"
PKGLINUX_INSTALL_CONF="/$PKGLINUX_INSTALL_PREFIX/etc/pkgin/repositories.conf"
[ -f "$PKGLINUX_INSTALL_CONF" ] && PKGLINUX_INSTALL_REPO=$(grep -v -e "^#" -e "^$" "$PKGLINUX_INSTALL_CONF")
PKGLINUX_INSTALL_MIN=false
PKGLINUX_INSTALL_GNOME=false
PKGLINUX_INSTALL_KDE=false
PKGLINUX_INSTALL_QCK=false
PKGLINUX_INSTALL_SFS=false
PKGLINUX_INSTALL_NONE=false
PKGLINUX_INSTALL_WAIT="2"
PKGLINUX_INSTALL_FORCE=false

pkglinux-install-usage()
{
	# Display Help
	echo "Install pkglinux into squashfs file, directory, or disk."
	echo
	echo "Syntax: $0 [ -h|v|V|r|p|m|g|k|q|s|n|w|f ] [ --help|verbose|version|repo|prefix|minimal|min|gnome|kde|quick|qck|sfs|squashfs|none|wait|rootwait|rootdelay|force ] [ dir | blockdev ]"
	echo "options:"
	echo "h     Print this help."
	echo "v     Verbose mode."
	echo "V     Print software version and exit."
	echo "r     Set new repository url."
	echo "p     Set new pkglinux prefix."
	echo "m     Install minimal console pkglinux."
	echo "g     Install standard console pkglinux with gnome desktop."
	echo "k     Install standard console pkglinux with kde desktop."
	echo "q     Extract /pkglinux.sfs instead of download packages."
	echo "s     Install /pkglinux.sfs boot option."
	echo "n     Don't install tranditional root file system at all."
	echo "w     Set seconds of rootdelay/rootwait (default 2)."
	echo "f     Confirm to zap target file or device."
	echo
}

: '
while [ "$#" -gt 0 ]; do
	case "$1" in
		-h|--help)
			pkglinux-install-usage
			shift 1
			exit;;
		-v|--verbose)
			PKGLINUX_INSTALL_VERBOSE="-v"
			shift 1
			;;
		-V|--version)
			echo "1.0"	
			shift 1
			exit;;
		-r|--repo)
			PKGLINUX_INSTALL_REPO="$2"
			shift 2
			;;
		-p|--prefix)
			PKGLINUX_INSTALL_PREFIX="$2"
			shift 2
			;;
		*)
			echo "Unknown option: $1"
			shift 1
			;;
	esac
done
'
PKGLINUX_INSTALL_ARGS="$@"
echo Starting $0 $@

for arg in "$@"; do
	shift
	case "$arg" in
		"--help")	set -- "$@" "-h" ;;
		"--verbose")	set -- "$@" "-v" ;;
		"--version")	set -- "$@" "-V" ;;
		"--repo")	set -- "$@" "-r" ;;
		"--prefix")	set -- "$@" "-p" ;;
		"--minimal")	set -- "$@" "-m" ;;
		"--min")	set -- "$@" "-m" ;;
		"--gnome")	set -- "$@" "-g" ;;
		"--kde")	set -- "$@" "-k" ;;
		"--quick")	set -- "$@" "-q" ;;
		"--qck")	set -- "$@" "-q" ;;
		"--sfs")	set -- "$@" "-s" ;;
		"--suashfs")	set -- "$@" "-s" ;;
		"--none")	set -- "$@" "-n" ;;
		"--wait")	set -- "$@" "-w" ;;
		"--rootwait")	set -- "$@" "-w" ;;
		"--rootdelay")	set -- "$@" "-w" ;;
		"--force")	set -- "$@" "-f" ;;
		*)		set -- "$@" "$arg"
	esac
done

while getopts ':hvVr:p:mgkqsnw:f' OPTION; do
	case "$OPTION" in
		h)	# display usage
			pkglinux-install-usage
			exit;;
		v)	# verbose mode
			PKGLINUX_INSTALL_VERBOSE="-v"
			;;
		V)	# display version
			echo "2023.12"	
			exit;;
		r)	# set new repo
			PKGLINUX_INSTALL_REPO="$OPTARG" ;;
		p)	# set new prefix
			PKGLINUX_INSTALL_PREFIX="$OPTARG" ;;
		m)	# Minimal only?
			PKGLINUX_INSTALL_MIN=true ;;
		g)	# with gnome?
			PKGLINUX_INSTALL_GNOME=true ;;
		k)	# with kde?
			PKGLINUX_INSTALL_KDE=true ;;
		q)	# quick install?
			PKGLINUX_INSTALL_QCK=true ;;
		s)	# with sfs?
			PKGLINUX_INSTALL_SFS=true ;;
		n)	# not rootfs?
			PKGLINUX_INSTALL_NONE=true ;;
		w)	# seconds of rootdelay/rootwait
			PKGLINUX_INSTALL_WAIT="$OPTARG" ;;
		f)	# force mode?
			PKGLINUX_INSTALL_FORCE=true ;;
		\?)	# Invalid option
			echo "Error: Invalid option: -$OPTARG"
			exit 1 ;;
		:)	# Missing argument
			echo "Error: Option -$OPTARG requires an argument."
			exit 1 ;;
	esac
done

shift "$(($OPTIND -1))"

[ "$#" -gt 1 ] && pkglinux-install-usage && exit 1;

[ ${UID} -ne 0 ] && echo "$0 will not be performed when not running as root" && exit 1

PKGLINUX_INSTALL_REPO_ROOT="$(dirname $(dirname $PKGLINUX_INSTALL_REPO))/iso"

if [[ "$PKGLINUX_INSTALL_PREFIX" =~ 20[2-9][0-9]Q[1-4] ]]; then
  if curl --head --silent --fail -k "$PKGLINUX_INSTALL_REPO_ROOT/LATEST.txt" 2>&1> /dev/null; then
     if [ -n "$(curl -sk "$PKGLINUX_INSTALL_REPO_ROOT/LATEST.txt" | \
	     grep -v "^#" | cut -f1 | grep $PKGLINUX_INSTALL_PREFIX)" ]; then
       echo "Found $PKGLINUX_INSTALL_PREFIX in $PKGLINUX_INSTALL_REPO_ROOT/LATEST.txt"
     else
       echo "$PKGLINUX_INSTALL_PREFIX is invalid as it's not in $PKGLINUX_INSTALL_REPO_ROOT/LATEST.txt"
       exit 1
     fi
   fi
else
  echo "$PKGLINUX_INSTALL_PREFIX is not a valid prefix."
  exit 1
fi

$PKGLINUX_INSTALL_MIN && PKGLINUX_INSTALL_GNOME=false && PKGLINUX_INSTALL_KDE=false

PKGLINUX_INSTALL_CONF="/$PKGLINUX_INSTALL_PREFIX/etc/pkgin/repositories.conf"
PKGLINUX_INSTALL_REPO=$(grep -v -e "^#" -e "^$" "$PKGLINUX_INSTALL_CONF")
PKGLINUX_INSTALL_REPO_ROOT="$(dirname $(dirname $PKGLINUX_INSTALL_REPO))/iso"
PKGLINUX_INSTALL_TAG="std"
$PKGLINUX_INSTALL_MIN && PKGLINUX_INSTALL_TAG="min"
$PKGLINUX_INSTALL_GNOME && PKGLINUX_INSTALL_TAG="gnome"
$PKGLINUX_INSTALL_KDE && PKGLINUX_INSTALL_TAG="kde"
$PKGLINUX_INSTALL_KDE && $PKGLINUX_INSTALL_GNOME && PKGLINUX_INSTALL_TAG="kde+gnome"
PKGLINUX_INSTALL_SFILE="pkglinux-$PKGLINUX_INSTALL_PREFIX-$PKGLINUX_INSTALL_ARCH-$PKGLINUX_INSTALL_TAG.sfs"

if [ "$#" -lt 1 ]; then
	$PKGLINUX_INSTALL_FORCE && rm $PKGLINUX_INSTALL_VERBOSE -f $PKGLINUX_INSTALL_SFILE
	[ -e $PKGLINUX_INSTALL_SFILE ] && echo "$PKGLINUX_INSTALL_SFILE exists." && exit 1

	PKGLINUX_INSTALL_TMPDIR="/root/pkglinux-install-sfs.tmp.d"
	$PKGLINUX_INSTALL_FORCE && rm -rf $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_TMPDIR
	[ -e $PKGLINUX_INSTALL_TMPDIR ] && echo "$PKGLINUX_INSTALL_TMPDIR exists." && exit 1
	mkdir -p $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_TMPDIR

	pkglinux-install-dir $PKGLINUX_INSTALL_TMPDIR
#	gensquashfs -D $PKGLINUX_INSTALL_TMPDIR -b 1048576 -c xz $PKGLINUX_INSTALL_SFILE
	mksquashfs $PKGLINUX_INSTALL_TMPDIR $PKGLINUX_INSTALL_SFILE -b 1M -comp xz -always-use-fragments
	rm -rf $PKGLINUX_INSTALL_VERBOSE "$PKGLINUX_INSTALL_TMPDIR"
	md5sum $PKGLINUX_INSTALL_SFILE > $PKGLINUX_INSTALL_SFILE.md5
	$PKGLINUX_INSTALL_FORCE && rm $PKGLINUX_INSTALL_VERBOSE -f "$PKGLINUX_INSTALL_SFILE".zsync
	zsyncmake -u $PKGLINUX_INSTALL_SFILE $PKGLINUX_INSTALL_SFILE
	exit 0
fi

[ "$#" -gt 0 ] && PKGLINUX_INSTALL_DEST=$(realpath "$1")

if [ -d $PKGLINUX_INSTALL_DEST ]; then
	if [ "$(ls -A $PKGLINUX_INSTALL_DEST)" ]; then
		echo "$PKGLINUX_INSTALL_DEST is not empty."
	       	exit 1
	fi
	pkglinux-install-dir $PKGLINUX_INSTALL_DEST
	exit 0
fi

[[ "$1" == "/dev/"* ]] || { echo "$1 is not a device."; exit 1; }
[ -b "$1" ] || { echo "$1 is not a device."; exit 1; }
[ "$(lsblk -ndo tran $1)" = "usb" ] || [ "$(lsblk -ndo tran $1)" = "sata" ] || {
	echo "$1 is not a block device."; exit 1;
}

$PKGLINUX_INSTALL_FORCE || {
	echo "Confirm to zap all data on $1 please use --force or -f. Please retype the command:"
	echo "$0 --force $PKGLINUX_INSTALL_ARGS"
	echo "$0 -f $PKGLINUX_INSTALL_ARGS"
	exit 1
}

PKGLINUX_INSTALL_PART1="$1""1"
PKGLINUX_INSTALL_PART2="$1""2"
PKGLINUX_INSTALL_PART3="$1""3"

findmnt -S $PKGLINUX_INSTALL_PART1 && umount $PKGLINUX_INSTALL_VERBOSE -f $PKGLINUX_INSTALL_PART1
findmnt -S $PKGLINUX_INSTALL_PART2 && umount $PKGLINUX_INSTALL_VERBOSE -f $PKGLINUX_INSTALL_PART2
findmnt -S $PKGLINUX_INSTALL_PART3 && umount $PKGLINUX_INSTALL_VERBOSE -f $PKGLINUX_INSTALL_PART3
dd if=/dev/zero of=$1 bs=512 count=1
sync
sfdisk --force --no-reread --no-tell-kernel $1 << EOF
,+100M,ef
,+100M,,*
;
EOF
sync
mkfs.fat -F 32 $PKGLINUX_INSTALL_PART1
mkfs.ext4 -F $PKGLINUX_INSTALL_PART2
mkfs.ext4 -F $PKGLINUX_INSTALL_PART3

PKGLINUX_INSTALL_LABEL="$PKGLINUX_INSTALL_PREFIX"-"$(cat /dev/urandom | base64 | head -c7)"
e2label $PKGLINUX_INSTALL_PART2 ""
e2label $PKGLINUX_INSTALL_PART3 "$PKGLINUX_INSTALL_LABEL"

if [ ! -f /pkglinux.sfs ]; then
  PKGLINUX_INSTALL_QCK=false
  PKGLINUX_INSTALL_SFS=false
fi
if $PKGLINUX_INSTALL_NONE; then
  $PKGLINUX_INSTALL_QCK || $PKGLINUX_INSTALL_SFS || exit 0
fi

PKGLINUX_INSTALL_SFSID="$(tr -dc 'A-F0-9' < /dev/urandom | head -c32)"
PKGLINUX_INSTALL_UUID=$(blkid.static -sUUID "$PKGLINUX_INSTALL_PART3" | cut -d'"' -f2)
PKGLINUX_INSTALL_TMPDIR1="/root/pkglinux-install.tmp.1.d"
PKGLINUX_INSTALL_TMPDIR2="/root/pkglinux-install.tmp.2.d"
PKGLINUX_INSTALL_TMPDIR3="/root/pkglinux-install.tmp.3.d"
findmnt -M $PKGLINUX_INSTALL_TMPDIR1 && umount $PKGLINUX_INSTALL_VERBOSE -f $PKGLINUX_INSTALL_TMPDIR1
findmnt -M $PKGLINUX_INSTALL_TMPDIR2 && umount $PKGLINUX_INSTALL_VERBOSE -f $PKGLINUX_INSTALL_TMPDIR2
findmnt -M $PKGLINUX_INSTALL_TMPDIR3 && umount $PKGLINUX_INSTALL_VERBOSE -f $PKGLINUX_INSTALL_TMPDIR3
rm $PKGLINUX_INSTALL_VERBOSE -rf $PKGLINUX_INSTALL_TMPDIR1 $PKGLINUX_INSTALL_TMPDIR2 $PKGLINUX_INSTALL_TMPDIR3
mkdir $PKGLINUX_INSTALL_VERBOSE -p $PKGLINUX_INSTALL_TMPDIR1 $PKGLINUX_INSTALL_TMPDIR2 $PKGLINUX_INSTALL_TMPDIR3
mount $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_PART1 $PKGLINUX_INSTALL_TMPDIR1
mount $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_PART2 $PKGLINUX_INSTALL_TMPDIR2
mount $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_PART3 $PKGLINUX_INSTALL_TMPDIR3
rm $PKGLINUX_INSTALL_VERBOSE -rf $PKGLINUX_INSTALL_TMPDIR1/* $PKGLINUX_INSTALL_TMPDIR2/* $PKGLINUX_INSTALL_TMPDIR3/*

if $PKGLINUX_INSTALL_SFS; then
  mkdir $PKGLINUX_INSTALL_VERBOSE -p $PKGLINUX_INSTALL_TMPDIR3/$PKGLINUX_INSTALL_SFSID/
  cp $PKGLINUX_INSTALL_VERBOSE /pkglinux.sfs $PKGLINUX_INSTALL_TMPDIR3/$PKGLINUX_INSTALL_SFSID/
  (cd $PKGLINUX_INSTALL_TMPDIR3/; ln $PKGLINUX_INSTALL_VERBOSE -snf $PKGLINUX_INSTALL_SFSID/pkglinux.sfs .)
fi
if $PKGLINUX_INSTALL_QCK; then
  unsquashfs -d $PKGLINUX_INSTALL_TMPDIR3 "$(realpath /pkglinux.sfs)"
elif ! $PKGLINUX_INSTALL_NONE; then
  pkglinux-install-dir $PKGLINUX_INSTALL_TMPDIR3
fi

mkdir $PKGLINUX_INSTALL_VERBOSE -p $PKGLINUX_INSTALL_TMPDIR1/boot/grub/
cat > $PKGLINUX_INSTALL_TMPDIR1/boot/grub/device.map <<EOF
  (hd0) $1
EOF
mkdir -pv $PKGLINUX_INSTALL_TMPDIR2/boot/grub/
cat > $PKGLINUX_INSTALL_TMPDIR2/boot/grub/device.map <<EOF
  (hd0) $1
EOF
set +e
grub-install-efi $PKGLINUX_INSTALL_VERBOSE --force --boot-directory=$PKGLINUX_INSTALL_TMPDIR1/boot --efi-directory=$PKGLINUX_INSTALL_TMPDIR1 --target=x86_64-efi $1
set -e
mkdir $PKGLINUX_INSTALL_VERBOSE -p $PKGLINUX_INSTALL_TMPDIR1/EFI/BOOT
cp $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_TMPDIR1/EFI/grub/grubx64.efi $PKGLINUX_INSTALL_TMPDIR1/EFI/BOOT/BOOTx64.EFI
grub-install $PKGLINUX_INSTALL_VERBOSE --force --boot-directory=$PKGLINUX_INSTALL_TMPDIR2/boot $1

if $PKGLINUX_INSTALL_SFS; then
  PKGLINUX_INSTALL_SFSFILE="$PKGLINUX_INSTALL_TMPDIR3/$PKGLINUX_INSTALL_SFSID/pkglinux.sfs"
  PKGLINUX_INSTALL_VMLINUZ=$(unsquashfs -l $PKGLINUX_INSTALL_SFSFILE $PKGLINUX_INSTALL_PREFIX/native/boot/vmlinuz-* | grep vmlinuz | cut -c 15-)
  PKGLINUX_INSTALL_KDIR=$(dirname $PKGLINUX_INSTALL_VMLINUZ)
  PKGLINUX_INSTALL_KVER=$(basename $PKGLINUX_INSTALL_VMLINUZ | cut -d'-' -f 2)
  unsquashfs -cat $PKGLINUX_INSTALL_SFSFILE $PKGLINUX_INSTALL_VMLINUZ > $PKGLINUX_INSTALL_TMPDIR1/boot/vmlinuz-$PKGLINUX_INSTALL_KVER
  unsquashfs -cat $PKGLINUX_INSTALL_SFSFILE $PKGLINUX_INSTALL_VMLINUZ > $PKGLINUX_INSTALL_TMPDIR2/boot/vmlinuz-$PKGLINUX_INSTALL_KVER
  unsquashfs -cat $PKGLINUX_INSTALL_SFSFILE $PKGLINUX_INSTALL_KDIR/initramfs-$PKGLINUX_INSTALL_KVER > $PKGLINUX_INSTALL_TMPDIR1/boot/initramfs-$PKGLINUX_INSTALL_KVER
  unsquashfs -cat $PKGLINUX_INSTALL_SFSFILE $PKGLINUX_INSTALL_KDIR/initramfs-$PKGLINUX_INSTALL_KVER > $PKGLINUX_INSTALL_TMPDIR2/boot/initramfs-$PKGLINUX_INSTALL_KVER
  unsquashfs -cat $PKGLINUX_INSTALL_SFSFILE $PKGLINUX_INSTALL_KDIR/native-linux-kernel-$PKGLINUX_INSTALL_KVER.config > $PKGLINUX_INSTALL_TMPDIR1/boot/native-linux-kernel-$PKGLINUX_INSTALL_KVER.config
  unsquashfs -cat $PKGLINUX_INSTALL_SFSFILE $PKGLINUX_INSTALL_KDIR/native-linux-kernel-$PKGLINUX_INSTALL_KVER.config > $PKGLINUX_INSTALL_TMPDIR2/boot/native-linux-kernel-$PKGLINUX_INSTALL_KVER.config
else
  PKGLINUX_INSTALL_VMLINUZ=$(ls $PKGLINUX_INSTALL_TMPDIR3/pkg/native/boot/vmlinuz-* | head -1)
  PKGLINUX_INSTALL_KDIR=$(dirname $PKGLINUX_INSTALL_VMLINUZ)
  PKGLINUX_INSTALL_KVER=$(basename $PKGLINUX_INSTALL_VMLINUZ | cut -d'-' -f 2)
  cp $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_VMLINUZ $PKGLINUX_INSTALL_TMPDIR1/boot/
  cp $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_VMLINUZ $PKGLINUX_INSTALL_TMPDIR2/boot/
  cp $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_KDIR/initramfs-$PKGLINUX_INSTALL_KVER $PKGLINUX_INSTALL_TMPDIR1/boot/
  cp $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_KDIR/initramfs-$PKGLINUX_INSTALL_KVER $PKGLINUX_INSTALL_TMPDIR2/boot/
  cp $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_KDIR/native-linux-kernel-$PKGLINUX_INSTALL_KVER.config $PKGLINUX_INSTALL_TMPDIR1/boot/
  cp $PKGLINUX_INSTALL_VERBOSE $PKGLINUX_INSTALL_KDIR/native-linux-kernel-$PKGLINUX_INSTALL_KVER.config $PKGLINUX_INSTALL_TMPDIR2/boot/
fi

mkdir $PKGLINUX_INSTALL_VERBOSE -p "$PKGLINUX_INSTALL_TMPDIR2/boot/grub"
cat << EOF > "$PKGLINUX_INSTALL_TMPDIR2/boot/grub/grub.cfg"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

#insmod ext2
#insmod ext4
#set root=(hd0,1)

insmod part_msdos
insmod fat
insmod iso9660
insmod search
insmod probe
insmod ext2
insmod ext4

#search --no-floppy --set=__USBROOT_ --file '/boot/$PKGLINUX_INSTALL_LABEL'
#probe --set __USB_UUID --fs-uuid "\${__USBROOT}"

menuentry "pkgLinux / KERNEL $PKGLINUX_INSTALL_KVER" {
#	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER sfs=$PKGLINUX_INSTALL_SFSID root=LABEL=$PKGLINUX_INSTALL_LABEL prefix=$PKGLINUX_INSTALL_PREFIX rootdelay=$PKGLINUX_INSTALL_WAIT
	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER sfs=$PKGLINUX_INSTALL_SFSID root=UUID=$PKGLINUX_INSTALL_UUID prefix=$PKGLINUX_INSTALL_PREFIX rootdelay=$PKGLINUX_INSTALL_WAIT
	initrd  /boot/initramfs-$PKGLINUX_INSTALL_KVER
}
menuentry "pkgLinux / KERNEL $PKGLINUX_INSTALL_KVER (boot into /pkglinux.sfs for maintainance)" {
#	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER sfs=$PKGLINUX_INSTALL_SFSID root=LABEL=$PKGLINUX_INSTALL_LABEL rootdelay=$PKGLINUX_INSTALL_WAIT
	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER sfs=$PKGLINUX_INSTALL_SFSID root=UUID=$PKGLINUX_INSTALL_UUID rootdelay=$PKGLINUX_INSTALL_WAIT
	initrd  /boot/initramfs-$PKGLINUX_INSTALL_KVER
}
menuentry "pkgLinux / KERNEL $PKGLINUX_INSTALL_KVER (minimal busybox for rescue)" {
#	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER single root=LABEL=$PKGLINUX_INSTALL_LABEL rootdelay=$PKGLINUX_INSTALL_WAIT
	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER single root=UUID=$PKGLINUX_INSTALL_UUID rootdelay=$PKGLINUX_INSTALL_WAIT
	initrd  /boot/initramfs-$PKGLINUX_INSTALL_KVER
}
EOF

mkdir $PKGLINUX_INSTALL_VERBOSE -p "$PKGLINUX_INSTALL_TMPDIR1/boot/grub"
cat << EOF > "$PKGLINUX_INSTALL_TMPDIR1/boot/grub/grub.cfg"
set default=0
set timeout=5

#loadfont "unicode"
#set gfxmode=auto
#set gfxpayload=keep
#insmod all_video
#insmod gfxterm
#terminal_output gfxterm
#GRUB_TERMINAL=console

#no suitable video mode found
#Booting in blind mode

insmod all_video
set gfxmode=0


#search --no-floppy --set=__USBROOT_ --file '/boot/$PKGLINUX_INSTALL_LABEL'
#probe --set __USB_UUID --fs-uuid "\${__USBROOT}"

menuentry "pkgLinux / KERNEL $PKGLINUX_INSTALL_KVER" {
#	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER sfs=$PKGLINUX_INSTALL_SFSID root=LABEL=$PKGLINUX_INSTALL_LABEL prefix=$PKGLINUX_INSTALL_PREFIX rootdelay=$PKGLINUX_INSTALL_WAIT
	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER sfs=$PKGLINUX_INSTALL_SFSID root=UUID=$PKGLINUX_INSTALL_UUID prefix=$PKGLINUX_INSTALL_PREFIX rootdelay=$PKGLINUX_INSTALL_WAIT
	initrd  /boot/initramfs-$PKGLINUX_INSTALL_KVER
}
menuentry "pkgLinux / KERNEL $PKGLINUX_INSTALL_KVER (boot into /pkglinux.sfs for maintainance)" {
#	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER sfs=$PKGLINUX_INSTALL_SFSID root=LABEL=$PKGLINUX_INSTALL_LABEL rootdelay=$PKGLINUX_INSTALL_WAIT
	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER sfs=$PKGLINUX_INSTALL_SFSID root=UUID=$PKGLINUX_INSTALL_UUID rootdelay=$PKGLINUX_INSTALL_WAIT
	initrd  /boot/initramfs-$PKGLINUX_INSTALL_KVER
}
menuentry "pkgLinux / KERNEL $PKGLINUX_INSTALL_KVER (minimal busybox for rescue)" {
#	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER single root=LABEL=$PKGLINUX_INSTALL_LABEL rootdelay=$PKGLINUX_INSTALL_WAIT
	linux   /boot/vmlinuz-$PKGLINUX_INSTALL_KVER single root=UUID=$PKGLINUX_INSTALL_UUID rootdelay=$PKGLINUX_INSTALL_WAIT
	initrd  /boot/initramfs-$PKGLINUX_INSTALL_KVER
}
EOF

echo "Umounting temp dirs ..."
umount $PKGLINUX_INSTALL_VERBOSE -f $PKGLINUX_INSTALL_TMPDIR1 $PKGLINUX_INSTALL_TMPDIR2 $PKGLINUX_INSTALL_TMPDIR3
rm $PKGLINUX_INSTALL_VERBOSE -r $PKGLINUX_INSTALL_TMPDIR1 $PKGLINUX_INSTALL_TMPDIR2 $PKGLINUX_INSTALL_TMPDIR3
echo "Sync disks ..."
sync


syntax highlighted by Code2HTML, v. 0.9.1