#!/bin/bash

################################################
KERNEL_CMDLINE="quiet selinux=0"
################################################
IAM=$(readlink -e $0) # /opt/zmb-setup/zmb-setup
SVC=$(basename $IAM)  # zmb-setup
LOG=/dev/shm/$SVC     # /dev/shm/zmb-setup
################################################

_interactive()
{

if [ -z "$SSH_CLIENT$SSH_CONNECTION" ]
then
  nm-online
  clear
fi

echo
echo "Network configuration:"
echo "----------------------"
echo

while true
do
  for i in $(ls -1 /sys/class/net)
  do
    SRV=$(nmcli --mode multiline --fields DHCP4 device show $i | \
          grep " next_server = " | awk '{print $4}')
    if [ -n "$SRV" ]
    then
      echo "ip=$(nmcli --mode multiline --fields DHCP4 device show $i | \
                 grep " ip_address = " | awk '{print $4}'\
                ) mac=$(</sys/class/net/$i/address) srv=$SRV nic=$i"
      break 2
    fi
  done
  sleep 1
done

if [ $(id -u) -ne 0 ]
then
  curl --head http://$SRV/setup/$SVC:0 &> /dev/null
  echo
  su -c $IAM
  return
fi

systemctl status $SVC 2> /dev/null && return

echo
echo "Disk to install on:"
echo "-------------------"
echo

HDD=null
IFS=$'\n'
select HDD in $(lsblk -dno NAME,SIZE,TYPE -x NAME | grep -i " disk$")
do
  [ -n "$HDD" ] && break
done
HDD="/dev/$(echo "$HDD" | awk '{print $1}')"

echo
echo "Setup overview:"
echo "---------------"
echo
echo "The Managed Box (ZMB) -> $HDD"
echo

select YES in "No" "Maybe" "Yes"
do
  case $YES in
   Y*) break
       ;;
    *) return
       ;;
  esac
done

echo -e "[Service]\nExecStart=$IAM $HDD $SRV" > $IAM.service

systemctl --now enable $IAM.service &> /dev/null
systemctl stop getty@\*.service

echo
echo "Installation started in the background mode."

}

_service()
{

if ls /sys/firmware/efi &> /dev/null
then
  FDISK="g\nn\n\n\n104447\nt\n1\nn\n\n\n\nw\n"
  GRUB="dosfstools grub2-efi-x64 shim-x64"
else
  FDISK="o\nn\n\n\n\n\na\nw\n"
  GRUB="grub2-pc"
fi

while ! echo -e "$FDISK" | fdisk -w always -W always $1
do
  sync; sleep 1
done

P=$(ls -1 $1* | tail -1)
mkfs -t ext4 -F -m 0 $P
mount -v $P /media

touch /dev/shm/$SVC.conf
cat > /dev/shm/$SVC.repo << EOF
[$SVC]
baseurl=http://$2/os/x86_64
gpgcheck=0
EOF

source /etc/os-release
microdnf \
    --best \
    --config=/dev/shm/$SVC.conf \
    --installroot=/media \
    --nodocs \
    --noplugins \
    --releasever=$VERSION_ID \
    --setopt=module_platform_id=$PLATFORM_ID \
    --setopt=cachedir=/media$IAM.microdnf \
    --setopt=install_weak_deps=0 \
    --setopt=reposdir=/dev/shm \
    --setopt=varsdir=/media$IAM.microdnf \
    install dnf e2fsprogs kernel NetworkManager openssh-server $GRUB

rm -rf \
    /media/dev/* \
    /media/etc/systemd/system/* \
    /media/etc/systemd/user/* \
    /media/run/* \
    /media/var/cache/dnf \
    /media/var/lib/dnf \
    /media/var/lib/systemd/random-seed \
    /media/var/log/*.log \
    /media/var/log/journal

install -vDT $IAM /media$IAM
for m in dev proc run sys; do mount -Bv /$m /media/$m; done
chroot /media $IAM $1

install -vDT -m 0600 /root/.ssh/authorized_keys /media/root/.ssh/authorized_keys
install -vDT -m 0755 $IAM:2 /media$IAM
echo -e "[Service]\nExecStart=$IAM\n[Install]\nWantedBy=multi-user.target" > /media$IAM.service
echo "$2" > /media$IAM.server

sed -i "s/.*ForwardToWall=.*/ForwardToWall=no/g" /media/etc/systemd/journald.conf

systemctl --root=/media enable NetworkManager sshd $IAM.service
systemctl --root=/media set-default multi-user.target

cp -fv $LOG /media/var/log

sync
umount -Rv /media

systemctl reboot

}

_chroot()
{

P1=$(ls -1 $1* | tail -2 | head -1)
P2=$(ls -1 $1* | tail -1)

eval $(blkid -o export $P2)
echo "UUID=$UUID / ext4 defaults 0 1" > /etc/fstab

if ls /sys/firmware/efi &> /dev/null
then
  mv    -fv /boot/efi{,.bak}
  mkdir -pv /boot/efi

  mkfs -t vfat -F 32 $P1
  eval $(blkid -o export $P1)
  echo "UUID=$UUID /boot/efi vfat umask=0077,shortname=winnt 0 2" >> /etc/fstab
  mount -v /boot/efi

  cp -aRv /boot/efi{.bak/*,}
  rm -rfv /boot/efi.bak
fi

cat > /etc/default/grub << EOF
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR="\$(sed 's, release .*\$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT=console
GRUB_CMDLINE_LINUX="$KERNEL_CMDLINE"
GRUB_DISABLE_RECOVERY=true
GRUB_ENABLE_BLSCFG=true
EOF

cat > /etc/sysconfig/kernel << EOF
UPDATEDEFAULT=yes
DEFAULTKERNEL=kernel-core
EOF

if ls /sys/firmware/efi &> /dev/null
then
  grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
else
  grub2-install $1
  grub2-mkconfig -o /boot/grub2/grub.cfg
fi

}

case "$#" in
  0) _interactive
     ;;
  1) _chroot "$@"
     ;;
  *) _service "$@" 2>&1 | tee -a /dev/console $LOG
     ;;
esac
