#!/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_MAKEUSB_VERBOSE=""
PKGLINUX_MAKEUSB_TAG="std"
PKGLINUX_MAKEUSB_KVER="$(uname -r)"
PKGLINUX_MAKEUSB_BLANK="0"
PKGLINUX_MAKEUSB_PREFIX="2022Q2"
PKGLINUX_MAKEUSB_ARCH="$(uname -m)"
PKGLINUX_MAKEUSB_REPO="https://repos.pkglinux.top/dist/$PKGLINUX_MAKEUSB_ARCH/packages.$PKGLINUX_MAKEUSB_PREFIX/All"
PKGLINUX_MAKEUSB_REPO_ROOT="$(dirname $(dirname $PKGLINUX_MAKEUSB_REPO))/iso"
curl --head --silent --fail -k "$PKGLINUX_MAKEUSB_REPO_ROOT/LATEST.txt" 2>&1> /dev/null &&
PKGLINUX_MAKEUSB_PREFIX="$(curl -sk "$PKGLINUX_MAKEUSB_REPO_ROOT/LATEST.txt" | grep -v "^#" | cut -f1 | tail -1)"
[ -L /pkg ] && [ -d /pkg ] && PKGLINUX_MAKEUSB_PREFIX="$(readlink /pkg)"
PKGLINUX_MAKEUSB_CONF="/$PKGLINUX_MAKEUSB_PREFIX/etc/pkgin/repositories.conf"
[ -f "$PKGLINUX_MAKEUSB_CONF" ] && PKGLINUX_MAKEUSB_REPO=$(grep -v -e "^#" -e "^$" "$PKGLINUX_MAKEUSB_CONF")
PKGLINUX_MAKEUSB_WAIT="2"
PKGLINUX_MAKEUSB_FORCE=false


pkglinux-makeusb-usage()
{
	# Display Help
	echo "Create pkglinux disk image for usb or write it to block device."
	echo
	echo "Syntax: $0 [ -h|v|V|p|t|w|b|f ] [ --help|verbose|version|prefix|arch|tag|wait|rootwait|rootdelay|blank|force ] [ blockdev ]"
	echo "options:"
	echo "h     Print this help."
	echo "v     Verbose mode."
	echo "V     Print software version and exit."
	echo "p     Set new prefix."
	echo "m     Set new machine architecture."
	echo "t     Sub tag name for target image file."
	echo "w     Seconds of rootdelay/rootwait."
	echo "b     Expected extra MiB for the image file."
	echo "f     Confirm to zap target file or device."
	echo
}

PKGLINUX_MAKEUSB_ARGS="$@"
echo Starting $0 $@

for arg in "$@"; do
	shift
	case "$arg" in
		"--help")	set -- "$@" "-h" ;;
		"--verbose")	set -- "$@" "-v" ;;
		"--version")	set -- "$@" "-V" ;;
		"--prefix")	set -- "$@" "-p" ;;
		"--arch")	set -- "$@" "-m" ;;
		"--tag")	set -- "$@" "-t" ;;
		"--wait")	set -- "$@" "-w" ;;
		"--rootwait")	set -- "$@" "-w" ;;
		"--rootdelay")	set -- "$@" "-w" ;;
		"--blank")	set -- "$@" "-b" ;;
		"--force")	set -- "$@" "-f" ;;
		*)		set -- "$@" "$arg"
	esac
done

while getopts ':hvVp:m:t:w:b:f' OPTION; do
	case "$OPTION" in
		h)	# display usage
			pkglinux-makeusb-usage
			exit;;
		v)	# verbose mode
			PKGLINUX_MAKEUSB_VERBOSE="-v"
			;;
		V)	# display version
			echo "2023.12"	
			exit;;
		p)	# set new prefix
			PKGLINUX_MAKEUSB_PREFIX="$OPTARG"
			;;
		m)	# set new machine architecture
			PKGLINUX_MAKEUSB_ARCH="$OPTARG"
			;;
		t)	# subtag different from "min", like "gnome","kde", or "gnome+kde"
			PKGLINUX_MAKEUSB_TAG="$OPTARG" ;;
		w)	# seconds of rootdelay/rootwait
			PKGLINUX_MAKEUSB_WAIT="$OPTARG" ;;
		b)	# extra MiB space needed for the image file.
			PKGLINUX_MAKEUSB_BLANK="$OPTARG" ;;
		f)	# force mode.
			PKGLINUX_MAKEUSB_FORCE=true ;;
		\?)	# Invalid option
	                echo "Error: Invalid option"
			exit;;
	esac
done

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

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

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

[ "${PKGLINUX_MAKEUSB_PREFIX^^}" = "LATEST" ] &&
curl --head --silent --fail -k "$PKGLINUX_MAKEUSB_REPO_ROOT/LATEST.txt" 2>&1> /dev/null &&
PKGLINUX_MAKEUSB_PREFIX="$(curl -sk "$PKGLINUX_MAKEUSB_REPO_ROOT/LATEST.txt" | grep -v "^#" | cut -f1 | tail -1)"
PKGLINUX_MAKEUSB_REPO_ROOT="$(dirname $(dirname $PKGLINUX_MAKEUSB_REPO))/iso"

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

case "$PKGLINUX_MAKEUSB_TAG" in
	min)		;;
	std)		;;
	gnome)		;;
	kde)		;;
	kde+gnome)	;;
	*)		#
  if curl --head --silent --fail -k "$PKGLINUX_MAKEUSB_REPO_ROOT/TAGS.txt" 2>&1> /dev/null; then
    if [ -n "$(curl -sk "$PKGLINUX_MAKEUSB_REPO_ROOT/TAGS.txt" | \
	    grep -v "^#" | cut -f1 | grep $PKGLINUX_MAKEUSB_TAG)" ]; then
      echo "Found $PKGLINUX_MAKEUSB_TAG in $PKGLINUX_MAKEUSB_REPO_ROOT/TAGS.txt"
    else
      echo "$PKGLINUX_MAKEUSB_TAG is invalid as it's not in $PKGLINUX_MAKEUSB_REPO_ROOT/TAGS.txt"
      exit 1
    fi
  else
    echo "$PKGLINUX_MAKEUSB_REPO_ROOT/TAGS.txt is not available. Network problem?"
    echo "Couldn't validate the tag $PKGLINUX_MAKEUSB_TAG"
    exit 1
  fi
			;;
esac

PKGLINUX_MAKEUSB_CONF="/$PKGLINUX_MAKEUSB_PREFIX/etc/pkgin/repositories.conf"

[ -f "$PKGLINUX_MAKEUSB_CONF" ] && PKGLINUX_MAKEUSB_REPO=$(grep -v -e "^#" -e "^$" "$PKGLINUX_MAKEUSB_CONF")
PKGLINUX_MAKEUSB_REPO_ROOT="$(dirname $(dirname $PKGLINUX_MAKEUSB_REPO))/iso"
PKGLINUX_MAKEUSB_IMG="pkglinux-$PKGLINUX_MAKEUSB_PREFIX-$PKGLINUX_MAKEUSB_ARCH-$PKGLINUX_MAKEUSB_TAG.usb"
PKGLINUX_MAKEUSB_SFSFILE="pkglinux-$PKGLINUX_MAKEUSB_PREFIX-$PKGLINUX_MAKEUSB_TAG.sfs"

if [ "$#" -gt 0 ]; then
  [[ "$1" == "/dev/"* ]] || { 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_MAKEUSB_FORCE || {
    echo "Confirm to zap all data on $1 please use --force or -f. Please retype the command:"
    echo "$0 --force $PKGLINUX_MAKEUSB_ARGS"
    echo "$0 -f $PKGLINUX_MAKEUSB_ARGS"
    exit 1
  }

  if [ -f ${PKGLINUX_MAKEUSB_IMG} ]; then
    echo "$PKGLINUX_MAKEUSB_IMG exists in the current directory."
    echo "Writting $PKGLINUX_MAKEUSB_IMG to the block device $1 ..."
    cat "${PKGLINUX_MAKEUSB_IMG}" | dd bs=1M of=$1
  elif curl --head --silent --fail -k "$PKGLINUX_MAKEUSB_REPO_ROOT/$PKGLINUX_MAKEUSB_IMG" 2>&1> /dev/null; then
    echo "$PKGLINUX_MAKEUSB_IMG doesn't exist in the current directory."
    echo "$PKGLINUX_MAKEUSB_REPO_ROOT/$PKGLINUX_MAKEUSB_IMG is available."
    echo "Copying $PKGLINUX_MAKEUSB_REPO_ROOT/$PKGLINUX_MAKEUSB_IMG to the block device $1 ..."
    curl -k "${PKGLINUX_MAKEUSB_REPO_ROOT}/${PKGLINUX_MAKEUSB_IMG}" | dd bs=1M of=$1
  elif [ -f ${PKGLINUX_MAKEUSB_SFSFILE} ]; then
    echo "$PKGLINUX_MAKEUSB_IMG doesn't exist in the current directory."
    echo "$PKGLINUX_MAKEUSB_REPO_ROOT/$PKGLINUX_MAKEUSB_IMG is not available either."
    echo "Most likely $PKGLINUX_MAKEUSB_PREFIX is not the latest one."
    echo "However, $PKGLINUX_MAKEUSB_SFSFILE is found in the current directory."
    echo "With this file existing, a $PKGLINUX_MAKEUSB_IMG file can easiy be created quickly."
    echo "Retype the same $0 command and flags without specifying blockdev as the last arguments."
    exit 0
  elif curl --head --silent --fail -k "$PKGLINUX_MAKEUSB_REPO_ROOT/$PKGLINUX_MAKEUSB_SFSFILE" 2>&1> /dev/null; then
    echo "$PKGLINUX_MAKEUSB_IMG doesn't exist in the current directory."
    echo "$PKGLINUX_MAKEUSB_REPO_ROOT/$PKGLINUX_MAKEUSB_IMG is not available either."
    echo "Most likely $PKGLINUX_MAKEUSB_PREFIX is not the latest one."
    echo "$PKGLINUX_MAKEUSB_SFSFILE is not found in the current directory."
    echo "However, $PKGLINUX_MAKEUSB_REPO_ROOT/$PKGLINUX_MAKEUSB_SFSFILE is available."
    echo "With this file being available, a $PKGLINUX_MAKEUSB_IMG file can easiy be created locally."
    echo "Retype the same $0 command and flags without specifying blockdev as the last arguments."
    exit 0
  else
    echo "$PKGLINUX_MAKEUSB_IMG doesn't exist in the current directory."
    echo "$PKGLINUX_MAKEUSB_REPO_ROOT/$PKGLINUX_MAKEUSB_IMG is not available either."
    echo "Most likely $PKGLINUX_MAKEUSB_PREFIX is not the latest one."
    echo "$PKGLINUX_MAKEUSB_SFSFILE is not found in the current directory."
    echo "Weird! $PKGLINUX_MAKEUSB_REPO_ROOT/$PKGLINUX_MAKEUSB_SFSFILE is NOT available."
    echo "Most likely there is a network problem."
    exit 1
  fi

  echo "Syncing disks ..."
  sync
  echo "Trying to enlarge the last partition of $1 ..."
  echo "- +" | sfdisk --force --no-reread --no-tell-kernel -N 3 $1
  echo "Trying to resize the file system of the last partition of $1 ..."
  resize2fs "$1""3"
  sync
  exit 0
fi

$PKGLINUX_MAKEUSB_FORCE && rm $PKGLINUX_MAKEUSB_VERBOSE -f $PKGLINUX_MAKEUSB_IMG
[ -e ${PKGLINUX_MAKEUSB_IMG} ] && { echo "$PKGLINUX_MAKEUSB_IMG exists." && exit 1; }

[[ $PKGLINUX_MAKEUSB_BLANK =~ ^[0-9]+$ ]] || { echo "$PKGLINUX_MAKEUSB_BLANK is not a number." && exit 1; }

#find /dev -type b -name "loop?p?" | xargs -I D umount $PKGLINUX_MAKEUSB_VERBOSE -f D
losetup $PKGLINUX_MAKEUSB_VERBOSE -D

if [ -f ${PKGLINUX_MAKEUSB_SFSFILE} ]; then
  PKGLINUX_MAKEUSB_SIZE=$(($(stat -c%s "$PKGLINUX_MAKEUSB_SFSFILE")/1024/1024))
else
  PKGLINUX_MAKEUSB_SIZE=$(($(curl -skLI $PKGLINUX_MAKEUSB_REPO_ROOT/$PKGLINUX_MAKEUSB_SFSFILE | grep -i content-length | cut -d' ' -f 2 | sed 's/[^0-9]*//g')/1024/1024))
fi
[ $PKGLINUX_MAKEUSB_BLANK -ne 0 ] || PKGLINUX_MAKEUSB_BLANK=$(($PKGLINUX_MAKEUSB_SIZE/10+200));
PKGLINUX_MAKEUSB_SIZE=$(($PKGLINUX_MAKEUSB_SIZE+$PKGLINUX_MAKEUSB_BLANK))

rm $PKGLINUX_MAKEUSB_VERBOSE -f $PKGLINUX_MAKEUSB_IMG
truncate -s "$PKGLINUX_MAKEUSB_SIZE""M" $PKGLINUX_MAKEUSB_IMG
sfdisk --force --no-reread --no-tell-kernel $PKGLINUX_MAKEUSB_IMG << EOF
,+100M,ef
,+100M,,*
;
EOF
sync
PKGLINUX_MAKEUSB_LOOP0="$(losetup $PKGLINUX_MAKEUSB_VERBOSE --show -f -P "$PKGLINUX_MAKEUSB_IMG")"
PKGLINUX_MAKEUSB_LOOP0P1="${PKGLINUX_MAKEUSB_LOOP0}p1"
PKGLINUX_MAKEUSB_LOOP0P2="${PKGLINUX_MAKEUSB_LOOP0}p2"
PKGLINUX_MAKEUSB_LOOP0P3="${PKGLINUX_MAKEUSB_LOOP0}p3"

mkfs.fat -F 32 $PKGLINUX_MAKEUSB_LOOP0P1
mkfs.ext4 -F $PKGLINUX_MAKEUSB_LOOP0P2
mkfs.ext4 -F $PKGLINUX_MAKEUSB_LOOP0P3

PKGLINUX_MAKEUSB_SFSID="$(tr -dc 'A-F0-9' < /dev/urandom | head -c32)"
PKGLINUX_MAKEUSB_LABEL="$PKGLINUX_MAKEUSB_PREFIX"-"$(cat /dev/urandom | base64 | head -c7)"
e2label $PKGLINUX_MAKEUSB_LOOP0P2 ""
e2label $PKGLINUX_MAKEUSB_LOOP0P3 "$PKGLINUX_MAKEUSB_LABEL"
PKGLINUX_MAKEUSB_UUID=$(blkid.static -sUUID "$PKGLINUX_MAKEUSB_LOOP0P3" | cut -d'"' -f2)
PKGLINUX_MAKEUSB_TMPDIR1="/root/pkg-usb.tmp.1.d"
PKGLINUX_MAKEUSB_TMPDIR2="/root/pkg-usb.tmp.2.d"
PKGLINUX_MAKEUSB_TMPDIR3="/root/pkg-usb.tmp.3.d"
rm $PKGLINUX_MAKEUSB_VERBOSE -rf $PKGLINUX_MAKEUSB_TMPDIR1 $PKGLINUX_MAKEUSB_TMPDIR2 $PKGLINUX_MAKEUSB_TMPDIR3
mkdir $PKGLINUX_MAKEUSB_VERBOSE -p $PKGLINUX_MAKEUSB_TMPDIR1 $PKGLINUX_MAKEUSB_TMPDIR2 $PKGLINUX_MAKEUSB_TMPDIR3
mount $PKGLINUX_MAKEUSB_VERBOSE $PKGLINUX_MAKEUSB_LOOP0P1 $PKGLINUX_MAKEUSB_TMPDIR1
mount $PKGLINUX_MAKEUSB_VERBOSE $PKGLINUX_MAKEUSB_LOOP0P2 $PKGLINUX_MAKEUSB_TMPDIR2
mount $PKGLINUX_MAKEUSB_VERBOSE $PKGLINUX_MAKEUSB_LOOP0P3 $PKGLINUX_MAKEUSB_TMPDIR3
rm $PKGLINUX_MAKEUSB_VERBOSE -rf $PKGLINUX_MAKEUSB_TMPDIR1/* $PKGLINUX_MAKEUSB_TMPDIR2/* $PKGLINUX_MAKEUSB_TMPDIR3/*

mkdir $PKGLINUX_MAKEUSB_VERBOSE -p $PKGLINUX_MAKEUSB_TMPDIR1/boot/grub/
cat > $PKGLINUX_MAKEUSB_TMPDIR1/boot/grub/device.map <<EOF
  (hd0) $PKGLINUX_MAKEUSB_LOOP0
EOF
mkdir -pv $PKGLINUX_MAKEUSB_TMPDIR2/boot/grub/
cat > $PKGLINUX_MAKEUSB_TMPDIR2/boot/grub/device.map <<EOF
  (hd0) $PKGLINUX_MAKEUSB_LOOP0
EOF
set +e
grub-install-efi $PKGLINUX_MAKEUSB_VERBOSE --force --boot-directory=$PKGLINUX_MAKEUSB_TMPDIR1/boot --efi-directory=$PKGLINUX_MAKEUSB_TMPDIR1 --target=x86_64-efi $PKGLINUX_MAKEUSB_LOOP0
set -e
mkdir $PKGLINUX_MAKEUSB_VERBOSE -p $PKGLINUX_MAKEUSB_TMPDIR1/EFI/BOOT
cp $PKGLINUX_MAKEUSB_VERBOSE $PKGLINUX_MAKEUSB_TMPDIR1/EFI/grub/grubx64.efi $PKGLINUX_MAKEUSB_TMPDIR1/EFI/BOOT/BOOTx64.EFI
grub-install $PKGLINUX_MAKEUSB_VERBOSE --force --boot-directory=$PKGLINUX_MAKEUSB_TMPDIR2/boot --target=i386-pc  $PKGLINUX_MAKEUSB_LOOP0

mkdir $PKGLINUX_MAKEUSB_VERBOSE -p $PKGLINUX_MAKEUSB_TMPDIR3/$PKGLINUX_MAKEUSB_SFSID

if [ -f ${PKGLINUX_MAKEUSB_SFSFILE} ]; then
#  cat "${PKGLINUX_MAKEUSB_ISO}" | bsdtar -Oxf - */pkglinux.sfs > $PKGLINUX_MAKEUSB_TMPDIR3/$PKGLINUX_MAKEUSB_SFSID/pkglinux.sfs
  cp $PKGLINUX_MAKEUSB_VERBOSE $PKGLINUX_MAKEUSB_SFSFILE $PKGLINUX_MAKEUSB_TMPDIR3/$PKGLINUX_MAKEUSB_SFSID/pkglinux.sfs
else
#  curl -k "${PKGLINUX_MAKEUSB_REPO_ROOT}/${PKGLINUX_MAKEUSB_ISO}" | bsdtar -Oxf - */pkglinux.sfs > $PKGLINUX_MAKEUSB_TMPDIR3/$PKGLINUX_MAKEUSB_SFSID/pkglinux.sfs
  curl -k "${PKGLINUX_MAKEUSB_REPO_ROOT}/${PKGLINUX_MAKEUSB_SFSFILE}" > $PKGLINUX_MAKEUSB_TMPDIR3/$PKGLINUX_MAKEUSB_SFSID/pkglinux.sfs
fi

PKGLINUX_MAKEUSB_SFSFILE="$PKGLINUX_MAKEUSB_TMPDIR3/$PKGLINUX_MAKEUSB_SFSID/pkglinux.sfs"
[ -f ${PKGLINUX_MAKEUSB_SFSFILE} ] || { echo "Missing ${PKGLINUX_MAKEUSB_SFSFILE}." && exit 1; }

PKGLINUX_MAKEUSB_VMLINUZ=$(unsquashfs -l $PKGLINUX_MAKEUSB_SFSFILE $PKGLINUX_MAKEUSB_PREFIX/native/boot/vmlinuz-* | grep vmlinuz | cut -c 15-)
PKGLINUX_MAKEUSB_KDIR=$(dirname $PKGLINUX_MAKEUSB_VMLINUZ)
PKGLINUX_MAKEUSB_KVER=$(basename $PKGLINUX_MAKEUSB_VMLINUZ | cut -d'-' -f 2)
unsquashfs -cat $PKGLINUX_MAKEUSB_SFSFILE $PKGLINUX_MAKEUSB_VMLINUZ > $PKGLINUX_MAKEUSB_TMPDIR1/boot/vmlinuz-$PKGLINUX_MAKEUSB_KVER
unsquashfs -cat $PKGLINUX_MAKEUSB_SFSFILE $PKGLINUX_MAKEUSB_VMLINUZ > $PKGLINUX_MAKEUSB_TMPDIR2/boot/vmlinuz-$PKGLINUX_MAKEUSB_KVER
unsquashfs -cat $PKGLINUX_MAKEUSB_SFSFILE $PKGLINUX_MAKEUSB_KDIR/initramfs-$PKGLINUX_MAKEUSB_KVER > $PKGLINUX_MAKEUSB_TMPDIR1/boot/initramfs-$PKGLINUX_MAKEUSB_KVER
unsquashfs -cat $PKGLINUX_MAKEUSB_SFSFILE $PKGLINUX_MAKEUSB_KDIR/initramfs-$PKGLINUX_MAKEUSB_KVER > $PKGLINUX_MAKEUSB_TMPDIR2/boot/initramfs-$PKGLINUX_MAKEUSB_KVER
unsquashfs -cat $PKGLINUX_MAKEUSB_SFSFILE $PKGLINUX_MAKEUSB_KDIR/native-linux-kernel-$PKGLINUX_MAKEUSB_KVER.config > $PKGLINUX_MAKEUSB_TMPDIR1/boot/native-linux-kernel-$PKGLINUX_MAKEUSB_KVER.config
unsquashfs -cat $PKGLINUX_MAKEUSB_SFSFILE $PKGLINUX_MAKEUSB_KDIR/native-linux-kernel-$PKGLINUX_MAKEUSB_KVER.config > $PKGLINUX_MAKEUSB_TMPDIR2/boot/native-linux-kernel-$PKGLINUX_MAKEUSB_KVER.config

mkdir $PKGLINUX_MAKEUSB_VERBOSE -p "$PKGLINUX_MAKEUSB_TMPDIR2/boot/grub"
cat << EOF > "$PKGLINUX_MAKEUSB_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_MAKEUSB_LABEL'
#probe --set __USB_UUID --fs-uuid "\${__USBROOT}"

menuentry "pkgLinux / KERNEL $PKGLINUX_MAKEUSB_KVER" {
#	linux   /boot/vmlinuz-$PKGLINUX_MAKEUSB_KVER sfs=$PKGLINUX_MAKEUSB_SFSID root=LABEL=$PKGLINUX_MAKEUSB_LABEL rootdelay=$PKGLINUX_MAKEUSB_WAIT
	linux   /boot/vmlinuz-$PKGLINUX_MAKEUSB_KVER sfs=$PKGLINUX_MAKEUSB_SFSID root=UUID=$PKGLINUX_MAKEUSB_UUID rootdelay=$PKGLINUX_MAKEUSB_WAIT
	initrd  /boot/initramfs-$PKGLINUX_MAKEUSB_KVER
}
menuentry "pkgLinux / KERNEL $PKGLINUX_MAKEUSB_KVER (minimal busybox for rescue)" {
#	linux   /boot/vmlinuz-$PKGLINUX_MAKEUSB_KVER single root=LABEL=$PKGLINUX_MAKEUSB_LABEL rootdelay=$PKGLINUX_MAKEUSB_WAIT
	linux   /boot/vmlinuz-$PKGLINUX_MAKEUSB_KVER single root=UUID=$PKGLINUX_MAKEUSB_UUID rootdelay=$PKGLINUX_MAKEUSB_WAIT
	initrd  /boot/initramfs-$PKGLINUX_MAKEUSB_KVER
}
EOF

mkdir $PKGLINUX_MAKEUSB_VERBOSE -p "$PKGLINUX_MAKEUSB_TMPDIR1/boot/grub"
cat << EOF > "$PKGLINUX_MAKEUSB_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_MAKEUSB_LABEL'
#probe --set __USB_UUID --fs-uuid "\${__USBROOT}"

menuentry "pkgLinux / KERNEL $PKGLINUX_MAKEUSB_KVER" {
#	linux   /boot/vmlinuz-$PKGLINUX_MAKEUSB_KVER sfs=$PKGLINUX_MAKEUSB_SFSID root=LABEL=$PKGLINUX_MAKEUSB_LABEL rootdelay=$PKGLINUX_MAKEUSB_WAIT
	linux   /boot/vmlinuz-$PKGLINUX_MAKEUSB_KVER sfs=$PKGLINUX_MAKEUSB_SFSID root=UUID=$PKGLINUX_MAKEUSB_UUID rootdelay=$PKGLINUX_MAKEUSB_WAIT
	initrd  /boot/initramfs-$PKGLINUX_MAKEUSB_KVER
}
menuentry "pkgLinux / KERNEL $PKGLINUX_MAKEUSB_KVER (minimal busybox for rescue)" {
#	linux   /boot/vmlinuz-$PKGLINUX_MAKEUSB_KVER single root=LABEL=$PKGLINUX_MAKEUSB_LABEL rootdelay=$PKGLINUX_MAKEUSB_WAIT
	linux   /boot/vmlinuz-$PKGLINUX_MAKEUSB_KVER single root=UUID=$PKGLINUX_MAKEUSB_UUID rootdelay=$PKGLINUX_MAKEUSB_WAIT
	initrd  /boot/initramfs-$PKGLINUX_MAKEUSB_KVER
}
EOF

umount $PKGLINUX_MAKEUSB_VERBOSE -f $PKGLINUX_MAKEUSB_LOOP0P1
umount $PKGLINUX_MAKEUSB_VERBOSE -f $PKGLINUX_MAKEUSB_LOOP0P2
umount $PKGLINUX_MAKEUSB_VERBOSE -f $PKGLINUX_MAKEUSB_LOOP0P3
echo "Sync disks ..."
sync
losetup $PKGLINUX_MAKEUSB_VERBOSE -d $PKGLINUX_MAKEUSB_LOOP0
rm $PKGLINUX_MAKEUSB_VERBOSE -rf $PKGLINUX_MAKEUSB_TMPDIR1 $PKGLINUX_MAKEUSB_TMPDIR2 $PKGLINUX_MAKEUSB_TMPDIR3
md5sum $PKGLINUX_MAKEUSB_IMG > $PKGLINUX_MAKEUSB_IMG.md5
$PKGLINUX_MAKEUSB_FORCE && rm $PKGLINUX_MAKEUSB_VERBOSE -f "$PKGLINUX_MAKEUSB_IMG".zsync
zsyncmake -u $PKGLINUX_MAKEUSB_IMG $PKGLINUX_MAKEUSB_IMG


syntax highlighted by Code2HTML, v. 0.9.1