#!/bin/sh -eu

echo "Creating bootable qcow2 VM image from container"

echo "Parse .containerinfo"
ORIGFILE=$(jq -r '.file' /usr/src/packages/DOCKER/*.containerinfo)
RAWFILE=${ORIGFILE/.tar/.raw}
QCOW2FILE=${ORIGFILE/.tar/.qcow2}
CONTAINERTAG=$(jq -r '.tags | .[]' /usr/src/packages/DOCKER/*.containerinfo)

echo "Creating image file $RAWFILE"
qemu-img create -f raw $RAWFILE 40G

echo "Creating MBR partition table"
parted -s $RAWFILE mklabel msdos
parted -s $RAWFILE mkpart primary 2048s 100%
parted -s $RAWFILE print

echo "Formatting $RAWFILE as btrfs"
losetup -f $RAWFILE
LOOP_DEV_PATH=`losetup -a | grep $RAWFILE | awk -F: '{print $1;}'`
mkfs.btrfs -f $LOOP_DEV_PATH

echo "Mount $RAWFILE as Loop"
mount $LOOP_DEV_PATH /mnt

echo "Creating Subvolumes"
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@/.snapshots
mkdir /mnt/@/.snapshots/1
btrfs subvolume create /mnt/@/.snapshots/1/snapshot
mkdir -p /mnt/@/boot/grub2/
btrfs subvolume create /mnt/@/boot/grub2/i386-pc
btrfs subvolume create /mnt/@/boot/grub2/x86_64-efi
btrfs subvolume create /mnt/@/boot/writable
btrfs subvolume create /mnt/@/home
btrfs subvolume create /mnt/@/opt
btrfs subvolume create /mnt/@/root
btrfs subvolume create /mnt/@/srv
mkdir /mnt/@/usr/
btrfs subvolume create /mnt/@/usr/local
btrfs subvolume create /mnt/@/var
chattr +C /mnt/@/var

echo "Create snapper snapshot/1 metadata"
DATE=$(date +"%Y-%m-%d %T")
cat <<EOF > /mnt/@/.snapshots/1/info.xml
<?xml version="1.0"?>
<snapshot>
  <type>single</type>
  <num>1</num>
  <date>$DATE</date>
  <description>first root filesystem</description>
</snapshot>
EOF

echo "Make @ default"
btrfs subvolume set-default $(btrfs subvolume list /mnt | grep "@/.snapshots/1/snapshot" | grep -oP '(?<=ID )[0-9]+') /mnt
umount /mnt
mount $LOOP_DEV_PATH /mnt

echo "Mount Subvolumes"
mkdir /mnt/.snapshots
mkdir -p /mnt/boot/grub2/i386-pc
mkdir -p /mnt/boot/grub2/x86_64-efi
mkdir /mnt/boot/writable
mkdir /mnt/home
mkdir /mnt/opt
mkdir /mnt/root
mkdir /mnt/srv
mkdir -p /mnt/usr/local
mkdir /mnt/var

mount -o subvol=@/.snapshots $LOOP_DEV_PATH /mnt/.snapshots
mount -o subvol=@/boot/grub2/i386-pc $LOOP_DEV_PATH /mnt/boot/grub2/i386-pc
mount -o subvol=@/boot/grub2/x86_64-efi $LOOP_DEV_PATH /mnt/boot/grub2/x86_64-efi
mount -o subvol=@/boot/writable $LOOP_DEV_PATH /mnt/boot/writable
mount -o subvol=@/home $LOOP_DEV_PATH /mnt/home
mount -o subvol=@/opt $LOOP_DEV_PATH /mnt/opt
mount -o subvol=@/root $LOOP_DEV_PATH /mnt/root
mount -o subvol=@/srv $LOOP_DEV_PATH /mnt/srv
mount -o subvol=@/usr/local $LOOP_DEV_PATH /mnt/usr/local
mount -o subvol=@/var $LOOP_DEV_PATH /mnt/var

echo "Untar image to /mnt/"
podman create --name "tempcontainer" localhost/$CONTAINERTAG
podman export tempcontainer | tar x -C /mnt
podman rm tempcontainer

echo "Write /etc/fstab"
BTRFSUUID=$(btrfs fi show /mnt|grep uuid|awk '{print $4}')
cat <<EOF > /mnt/etc/fstab
UUID=$BTRFSUUID / btrfs ro 0 0
UUID=$BTRFSUUID /.snapshots btrfs subvol=/@/.snapshots 0 0
UUID=$BTRFSUUID /boot/grub2/i386-pc btrfs subvol=/@/boot/grub2/i386-pc 0 0
UUID=$BTRFSUUID /boot/grub2/x86_64-efi btrfs subvol=/@/boot/grub2/x86_64-efi 0 0
UUID=$BTRFSUUID /boot/writable btrfs subvol=/@/boot/writable 0 0
UUID=$BTRFSUUID /home btrfs subvol=/@/home 0 0
UUID=$BTRFSUUID /opt btrfs subvol=/@/opt 0 0
UUID=$BTRFSUUID /root btrfs subvol=/@/root 0 0
UUID=$BTRFSUUID /srv btrfs subvol=/@/srv 0 0
UUID=$BTRFSUUID /usr/local btrfs subvol=/@/usr/local 0 0
UUID=$BTRFSUUID /var btrfs subvol=/@/var 0 0
EOF

echo "Bindmounts for bootloader setup"
mount -o bind /dev /mnt/dev
mount -o bind /proc /mnt/proc
mount -o bind /sys /mnt/sys

echo "Fix dracut"
chroot /mnt /usr/bin/dracut -f --regenerate-all

echo "Fix grub2 config"
sed -i -e 's|GRUB_CMDLINE_LINUX_DEFAULT=.*|GRUB_CMDLINE_LINUX_DEFAULT="rw quiet systemd.show_status=1 mitigations=auto \\$ignition_firstboot"|g' /mnt/etc/default/grub
echo -e 'SUSE_BTRFS_SNAPSHOT_BOOTING="true"\nGRUB_DISABLE_OS_PROBER="true"' >> /mnt/etc/default/grub
echo 'LOADER_TYPE="grub2"' > /mnt/etc/sysconfig/bootloader
echo -e "$LOOP_DEV_PATH\nactivate" > /mnt/etc/default/grub_installdevice
# $YAST_IS_RUNNING is set as instsys in OBS, this breaks pbl, clear it
unset YAST_IS_RUNNING
chroot /mnt pbl --config --install
sed -i "s|\/$RAWFILE|UUID=$BTRFSUUID|g" /mnt/boot/grub2/grub.cfg

echo "Cleanup mounts"
umount /mnt/dev
umount /mnt/proc
umount /mnt/sys

echo "Unmount subvolumes"
umount /mnt/.snapshots
umount /mnt/boot/grub2/i386-pc
umount /mnt/boot/grub2/x86_64-efi
umount /mnt/boot/writable
umount /mnt/home
umount /mnt/opt
umount /mnt/root
umount /mnt/srv
umount /mnt/usr/local
umount /mnt/var

echo "Unmount loop"
umount /mnt

echo "Delete loop device"
losetup -d $LOOP_DEV_PATH
losetup -l

echo "Convert raw to qcow2"
mkdir -p /usr/src/packages/OTHER
qemu-img convert -f raw -O qcow2 $RAWFILE /usr/src/packages/OTHER/$QCOW2FILE
