#!/bin/bash -ex

apt update

if grep stretch /etc/os-release &>/dev/null; then
  apt install -t stretch-backports -y ostree 
else
  apt install -y ostree 
fi

apt install -y dosfstools efibootmgr jq mdadm 
apt install -y gdisk || true
apt install -y fdisk || true

INTERFACE=
for INTF in enp2s0 enp8s0; do
    if ip a show $INTF; then
        INTERFACE=$INTF
        break
    fi
done
if [[ "z$INTERFACE" == "z" ]]; then
    exit 1
fi

# Nuke existing RAID
for f in /os/boot/efi /os/boot /os/etc /os/usr /os/var /os/sysroot /os/dev /os/sys /os/proc /os; do
    umount $f &>/dev/null || true
done
OLD_MD_DEVICE=
if [ -e /sys/block/md*/md/dev-sdb2 ]; then
  OLD_MD_DEVICE=$(basename $(dirname $(dirname /sys/block/md*/md/dev-sdb2)))
fi
if [ -b /dev/$OLD_MD_DEVICE ]; then
  mdadm /dev/$OLD_MD_DEVICE --fail /dev/sda2 || true
  mdadm /dev/$OLD_MD_DEVICE --remove /dev/sda2 || true
  mdadm --zero-superblock /dev/sda2 || true
fi
if [ ! -b /dev/$OLD_MD_DEVICE ]; then
    OLD_MD_DEVICE=$(basename $(echo /sys/block/md* | awk '{ print $1 }'))
fi
if [ ! -b /dev/$OLD_MD_DEVICE ]; then
    OLD_MD_DEVICE=bozo
fi
umount /dev/sda1 || true
for f in 1 2 4; do
  if [ -e "/dev/md${f}" ]; then
    mdadm --manage --stop "/dev/md${f}"
    mdadm --zero-superblock "/dev/sda${f}" || true
  fi
done

sync
sleep 10

sgdisk --zap /dev/sda

sync
sleep 5

cat <<EOF | sfdisk /dev/sda
label: gpt
start=2048, size=2097152, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, name="esp"
start=2099200, size=2097152, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, name="boot"
start=4196352, size=4194304, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F, name="swap"
start=8390656, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, name="rootfs"
EOF

sync
sleep 5

echo y | mdadm --create --verbose /dev/md1 --level=1 --metadata=1.0 --raid-devices=2 /dev/sda1 missing # ESP
echo y | mdadm --create --verbose /dev/md2 --level=1 --metadata=1.2 --raid-devices=2 /dev/sda2 missing # boot
# swap doesn't need raid
echo y | mdadm --create --verbose /dev/md4 --level=1 --metadata=1.2 --raid-devices=2 /dev/sda4 missing # rootfs

mkfs.fat -n ESP -F 32 /dev/md1 # ESP
mkfs.ext4 -L boot -F /dev/md2 # boot
mkswap -L swap /dev/sda3 # swap
mkfs.ext4 -L rootfs -F /dev/md4 # rootfs

if [ -b /dev/$OLD_MD_DEVICE ]; then
    OLD_MD_DEVICE_HASH=$(mdadm --detail /dev/$OLD_MD_DEVICE | grep UUID | awk '{ print $3 }')
else
    OLD_MD_DEVICE_HASH=$OLD_MD_DEVICE
fi
mdadm --detail --scan | grep -v $OLD_MD_DEVICE_HASH > /tmp/mdadm-info.conf

# mkfs.fat -n ESP -F 32 /dev/sda1 # ESP
# mkfs.ext4 -L boot -F /dev/sda2 # boot
# mkswap -L swap /dev/sda3 # swap
# mkfs.ext4 -L rootfs -F /dev/sda4 # rootfs

mkdir -p /os
mount /dev/md4 /os
mkdir -p /os/boot
mount /dev/md2 /os/boot
mkdir -p /os/boot/efi
mount /dev/md1 /os/boot/efi
mkdir -p /os/sysroot
mount /dev/md4 /os/sysroot
ostree admin init-fs /os
ostree admin os-init --sysroot=/os repo

ostree --repo=/os/ostree/repo remote add scu-update https://carton.bryx.com/ostree-repo/ main --no-gpg-verify
ostree --repo=/os/ostree/repo pull --disable-static-deltas scu-update
cat <<EOF > /tmp/chom.origin
[origin]
refspec=scu-update:main
EOF
ostree admin deploy --sysroot=/os --os=repo --origin-file=/tmp/chom.origin scu-update:main --karg=root=LABEL=rootfs --karg=rw --karg=splash --karg=quiet $(cat /tmp/mdadm-info.conf | awk '{ print tolower("--karg-append=rd.md."$5) }')
rm /tmp/chom.origin

mkdir -p /os/usr
mkdir -p /os/etc
mkdir -p /os/var
mount --bind  `find /os/ostree/deploy/repo/deploy/ -maxdepth 1 | grep "\.0$"`/usr /os/usr 
mount --bind  `find /os/ostree/deploy/repo/deploy/ -maxdepth 1 | grep "\.0$"`/etc /os/etc
mount --bind /os/ostree/deploy/repo/var /os/var
cd /os
mkdir -p sysroot/ostree sysroot/tmp
ln -s usr/bin bin
ln -s usr/sbin sbin
ln -s usr/lib lib
ln -s usr/lib64 lib64
ln -s sysroot/ostree ostree
ln -s sysroot/tmp tmp

# Copy SCU configs:
mkdir -p /os/var/bryx
if [ -d /opt/bryx/res ]; then
  cp -r /opt/bryx/res /os/var/bryx/tones
fi
if [ -d /opt/bryx/json ]; then
  cp -r /opt/bryx/json /os/var/bryx/json
fi
chown -R bryx:bryx /os/var/bryx
if [ -e /opt/netboss/etc/netboss.conf ]; then
  cp /opt/netboss/etc/netboss.conf /os/var/bryx/netboss.conf
  if ! grep "^ *iface $INTERFACE inet dhcp" /etc/network/interfaces /etc/network/interfaces.d/*; then
      IP_ADDRESS_PLUS_MASK=$(ip a show $INTERFACE | grep 'inet ' | awk '{ print $2 }' | head -n 1)
      SUBNET_MASK=$(echo $IP_ADDRESS_PLUS_MASK | sed 's/.*\/\(.*\)/\1/')
      IP_ADDRESS=$(echo $IP_ADDRESS_PLUS_MASK | sed 's/\(.*\)\/\(.*\)/\1/')
      GATEWAY=$(ip r show dev $INTERFACE | grep default | head -n 1 | awk '{ print $3 }')
      DNS=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }' | tr '\n' ';' | sed 's/;$//')

      cat <<EOF > /os/etc/NetworkManager/system-connections/wan0.nmconnection
# Generated by scu_migrate.sh
[connection]
id=wan0
uuid=82c6272d-1ff7-4d56-9c7c-0eb27c300029
type=ethernet
interface-name=wan0
timestamp=1719235064

[ethernet]

[ipv4]
address1=$IP_ADDRESS_PLUS_MASK,$GATEWAY
dns=$DNS
method=manual

[ipv6]
method=disabled

[proxy]
EOF
      chmod 600 /os/etc/NetworkManager/system-connections/wan0.nmconnection

      jq -n --arg "IP_ADDRESS" "$IP_ADDRESS" \
         --arg "SUBNET_MASK" "$SUBNET_MASK" \
         --arg "GATEWAY" "$GATEWAY" \
         --arg "DNS" "$DNS" \
         '{ "address": $IP_ADDRESS, "gateway": $GATEWAY, "dns": $DNS | split(";"), "subnet": $SUBNET_MASK }' > /os/var/bryx/netboss_wan0.json
  fi
fi
if [ -d /var/lib/tailscale ]; then
    mkdir -p /os/var/lib
    cp -r /var/lib/tailscale /os/var/lib/
fi
if grep sa- /etc/hostname; then
    cp /etc/hostname /os/etc/
    cp /etc/machine-id /os/etc/
fi

if [ -d /home/bryx/.config/bryx-station-kiosk-wrapper/ ]; then
    cp -r /home/bryx/.config/bryx-station-kiosk-wrapper /os/var/bryx-kiosk
fi

echo "127.0.0.1 $(cat /etc/hostname)" >> /os/etc/hosts
echo "127.0.0.1 $(cat /etc/hostname).bryx.com" >> /os/etc/hosts

# tee /os/etc/mdadm/mdadm.conf < /tmp/mdadm-info.conf
touch /os/var/bryx-please-conquer-existing-raid-arrays

mount --bind /dev/ /os/dev
mount --bind /sys  /os/sys
mount --bind /proc /os/proc
chroot . grub-install /dev/sda || chroot . grub-install --removable /dev/sda
chroot . grub-mkconfig -o /boot/loader/grub.cfg
ln -s ../loader/grub.cfg /os/boot/grub/grub.cfg

efibootmgr --create -d /dev/sda \
           --loader '\EFI\debian\grubx64.efi' \
           --label "BryxOstree1"

sync

# reboot
