#!/bin/bash
# SPDX-License-Identifier: GPL-3.0-or-later
# created by Tobias Powalowski <tpowa@archlinux.org>
. /usr/lib/archboot/common.sh
. /usr/lib/archboot/installer/common.sh

echo "Automatic Archboot - Arch Linux Installation:"
echo "Logging is done on ${_LOG}..."

echo "10 seconds to stop the process with CTRL-C now..."
sleep 10

### localize
echo "Localization..."
echo "LANG=de_DE.UTF-8" > /etc/locale.conf
echo LC_COLLATE=C >> /etc/locale.conf
localectl set-locale "de_DE.UTF-8" &>"${_NO_LOG}"
sd '(^[a-z])' '#$1' /etc/locale.gen
sd "^#de_DE.UTF-8" "de_DE.UTF-8" /etc/locale.gen
locale-gen &>"${_NO_LOG}"
echo KEYMAP="de-latin1-nodeadkeys" > /etc/vconsole.conf
echo FONT="ter-v16n" >> /etc/vconsole.conf
systemctl restart systemd-vconsole-setup
export LANG="de_DE.UTF-8"
: > /.localize

### network profile
echo "Network..."
echo "#/etc/systemd/network/enp0s1-ethernet.network generated by Archboot setup" > "/etc/systemd/network/enp0s1-ethernet.network"
echo "[Match]"  >> "/etc/systemd/network/enp0s1-ethernet.network"
echo "Name=enp0s1" >> "/etc/systemd/network/enp0s1-ethernet.network"
echo "" >> "/etc/systemd/network/enp0s1-ethernet.network"
echo "[Network]" >> "/etc/systemd/network/enp0s1-ethernet.network"
echo "MulticastDNS=yes" >> "/etc/systemd/network/enp0s1-ethernet.network"
echo "DHCP=yes" >> "/etc/systemd/network/enp0s1-ethernet.network"
unset "http_proxy"
unset "https_proxy"
unset "ftp_proxy"
unset "rsync_proxy"
unset "HTTP_PROXY"
unset "HTTPS_PROXY"
unset "FTP_PROXY"
unset "RSYNC_PROXY"
rm -f /etc/systemd/network/10-wired-auto-dhcp.network
systemctl restart systemd-networkd
systemctl restart systemd-resolved
while true; do
  if getent hosts www.google.com &>"${_LOG}"; then
      break
    else
      sleep 1
    fi
done
: > /.network

### clock
echo "Clock..."
timedatectl set-timezone "Europe/Berlin"
echo 0.0 0 0.0 > /etc/adjtime
echo 0 >> /etc/adjtime
echo UTC >> /etc/adjtime
timedatectl set-local-rtc 0
systemctl restart systemd-timesyncd
timedatectl set-ntp 1
: > /.clock

### pacman mirror
echo "Pacman Server..."
sd '^Server' '#Server' "/etc/pacman.d/mirrorlist"
echo 'Server = https://mirror.selfnet.de/archlinux/$repo/os/$arch' >> "/etc/pacman.d/mirrorlist"

### pacman keyring
echo "Pacman keyring..."
_pacman_keyring
pacman -Sy --noconfirm --noprogressbar archlinux-keyring &>"${_LOG}"
: > /.pacsetup

### quicksetup
: > /tmp/.device-names
: > /tmp/.fstab
wipefs -a -f "/dev/vdb" &>"${_NO_LOG}"
dd if=/dev/zero of="/dev/vdb" bs=1M count=10 &>"${_NO_LOG}"
sync
### partition
echo "Partitioning /dev/vdb..."
sfdisk "/dev/vdb" << EOF &>"${_LOG}"
label: gpt
label-id: E4E29768-0CE2-49A3-BB15-F6EFA15CFCF7
device: /dev/vdb
unit: sectors
first-lba: 2048
last-lba: 8388574
sector-size: 512

/dev/vdb1 : start=        2048, size=        4096, type=21686148-6449-6E6F-744E-656564454649, uuid=D9CFAA50-9824-46AB-B206-719B7B6F3E06, name="BIOS_GRUB"
/dev/vdb2 : start=        6144, size=     2097152, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, uuid=27C63A33-AF19-44FC-8D00-9189D2A787A0, name="ESP"
/dev/vdb3 : start=     2103296, size=     1048576, type=BC13C2FF-59E6-4262-A352-B275FD6F7172, uuid=CBD1E4D2-5750-48ED-AB8F-8B68C61DE67D, name="XBOOTLDR"
/dev/vdb4 : start=     3151872, size=      524288, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F, uuid=981191FF-9C0F-4305-B693-B2C42B418AE7, name="SWAP"
/dev/vdb5 : start=     3676160, size=     4710400, type=4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709, uuid=51FE15D6-8085-4810-968A-5229C91F58F6, name="ARCH_LINUX_ROOT"
EOF

### quicksetup mountpoints
udevadm settle
echo "Creating btrfs on /dev/vdb5, mounting to /mnt/install/..."
mkfs.btrfs -f  -L "ARCH_ROOT" /dev/vdb5  &>"${_LOG}"
btrfs device scan &>"${_NO_LOG}"
mkdir -p "/tmp/btrfsmp.DyH3"
mount "/dev/vdb5" "/tmp/btrfsmp.DyH3"
btrfs subvolume create "/tmp/btrfsmp.DyH3"/"root" &>"${_LOG}"
umount "/tmp/btrfsmp.DyH3"
rm -r "/tmp/btrfsmp.DyH3"
btrfs device scan &>"${_NO_LOG}"
mkdir -p "/mnt/install""/"
mount -t "btrfs" -o "subvol=root,compress=zstd" "/dev/vdb5" "/mnt/install""/" &>"${_LOG}"
btrfs balance start --full-balance "/mnt/install""/" &>"${_LOG}"
echo "# DEVICE DETAILS: /dev/vdb5 PARTUUID=51fe15d6-8085-4810-968a-5229c91f58f6 PARTLABEL=ARCH_LINUX_ROOT UUID=$(lsblk -rpno UUID /dev/vdb5) LABEL=ARCH_ROOT" >> /tmp/.device-names
echo -n "PARTUUID=51fe15d6-8085-4810-968a-5229c91f58f6 / btrfs defaults,subvol=root,compress=zstd 0 " >>/tmp/.fstab
echo 0 >>/tmp/.fstab
btrfs subvolume set-default "${_DESTDIR}"/"/"
echo "Creating vfat on /dev/vdb2, mounting to /mnt/install/efi..."
mkfs.vfat -F32  -n "ESP" /dev/vdb2 &>"${_LOG}"
btrfs device scan &>"${_NO_LOG}"
mkdir -p "/mnt/install""/efi"
mount -t "vfat" -o "" "/dev/vdb2" "/mnt/install""/efi" &>"${_LOG}"
mkdir "/mnt/install/efi/EFI"
echo "# DEVICE DETAILS: /dev/vdb2 PARTUUID=27c63a33-af19-44fc-8d00-9189d2a787a0 PARTLABEL=ESP UUID=$(lsblk -rpno UUID /dev/vdb2) LABEL=ESP" >> /tmp/.device-names
echo -n "PARTUUID=27c63a33-af19-44fc-8d00-9189d2a787a0 /efi vfat defaults 0 " >>/tmp/.fstab
echo 1 >>/tmp/.fstab
echo "Creating vfat on /dev/vdb3, mounting to /mnt/install/boot..."
mkfs.vfat -F32  -n "XBOOTLDR" /dev/vdb3 &>"${_LOG}"
btrfs device scan &>"${_NO_LOG}"
mkdir -p "/mnt/install""/boot"
mount -t "vfat" -o "" "/dev/vdb3" "/mnt/install""/boot" &>"${_LOG}"
echo "# DEVICE DETAILS: /dev/vdb3 PARTUUID=cbd1e4d2-5750-48ed-ab8f-8b68c61de67d PARTLABEL=XBOOTLDR UUID=$(lsblk -rpno UUID /dev/vdb3) LABEL=XBOOTLDR" >> /tmp/.device-names
echo -n "PARTUUID=cbd1e4d2-5750-48ed-ab8f-8b68c61de67d /boot vfat defaults 0 " >>/tmp/.fstab
echo 1 >>/tmp/.fstab
echo "Creating and activating swapspace on /dev/vdb4..."
mkswap -L "SWAP" "/dev/vdb4" &>"${_LOG}"
swapon "/dev/vdb4" &>"${_LOG}"
echo "# DEVICE DETAILS: /dev/vdb4 PARTUUID=981191ff-9c0f-4305-b693-b2c42b418ae7 PARTLABEL=SWAP UUID=$(lsblk -rpno UUID /dev/vdb4) LABEL=SWAP" >> /tmp/.device-names

### pacman installation
_chroot_mount
mkdir -p "${_DESTDIR}/var/lib/pacman"
echo "Installing base linux polkit btrfs-progs dosfstools terminus-font linux-firmware..."
pacman --root /mnt/install --cachedir=/mnt/install/var/cache/pacman/pkg --noconfirm -Sy base linux polkit btrfs-progs dosfstools terminus-font linux-firmware &>"${_LOG}"
sync
_chroot_umount

### autoconfiguration
_chroot_mount
echo "Enable timezone setting on installed system..."
cp -a /etc/localtime "${_DESTDIR}"/etc/localtime
echo "Enable clock setting on installed system..."
cp /etc/adjtime "${_DESTDIR}"/etc/adjtime
echo "Enable network and proxy settings on installed system..."
cp /etc/systemd/network/* "${_DESTDIR}"/etc/systemd/network/ &>"${_NO_LOG}"
chroot "${_DESTDIR}" systemctl enable systemd-networkd &>"${_NO_LOG}"
mkdir -p "${_DESTDIR}/etc/systemd/network.conf.d"
cp /etc/systemd/network.conf.d/ipv6-privacy-extensions.conf "${_DESTDIR}"/etc/systemd/network.conf.d/ipv6-privacy-extensions.conf
echo "Create new fstab on installed system..."
sort /tmp/.device-names >>"${_DESTDIR}"/etc/fstab
sd '^[^#]*' '' "${_DESTDIR}"/etc/fstab
sort /tmp/.fstab >>"${_DESTDIR}"/etc/fstab
echo "Enable performance ioscheduler settings on installed system..."
cp /etc/udev/rules.d/60-ioschedulers.rules "${_DESTDIR}"/etc/udev/rules.d/60-ioschedulers.rules
echo "Enable sysctl swap settings on installed system..."
cp /etc/sysctl.d/99-sysctl.conf "${_DESTDIR}"/etc/sysctl.d/99-sysctl.conf
echo "Enable pacman's GPG keyring files on installed system..."
cp -ar /etc/pacman.d/gnupg "${_DESTDIR}"/etc/pacman.d &>"${_NO_LOG}"
echo "Enable pacman mirror on installed system..."
cat << EOF > /tmp/inst-mirrorlist
# Mirror used during installation
Server = https://mirror.selfnet.de/archlinux/$repo/os/$arch
EOF
cat "${_DESTDIR}"/etc/pacman.d/mirrorlist >> /tmp/inst-mirrorlist
mv /tmp/inst-mirrorlist "${_DESTDIR}/etc/pacman.d/mirrorlist"
echo "Setting keymap and font on installed system..."
cp /etc/vconsole.conf "${_DESTDIR}"/etc/vconsole.conf
echo "Set default hostname on installed system..."
echo "myhostname" > "${_DESTDIR}"/etc/hostname
echo "Set default locale on installed system..."
cp /etc/locale.conf "${_DESTDIR}"/etc/locale.conf
echo "Enable glibc locales based on locale.conf on installed system..."
sd "^#de_DE" "de_DE" "${_DESTDIR}"/etc/locale.gen
echo "Enable windowkeys in console on installed system..."
cp "/etc/systemd/system/windowkeys.service" "${_DESTDIR}/etc/systemd/system/windowkeys.service"
chroot "${_DESTDIR}" systemctl enable windowkeys &>"${_NO_LOG}"
echo "Setup bash with custom options on installed system..."
cp "${_DESTDIR}"/etc/skel/.bash* "${_DESTDIR}"/root/
echo ". /etc/profile.d/custom-bash-options.sh" >> "${_DESTDIR}/etc/skel/.bashrc"
echo ". /etc/profile.d/custom-bash-options.sh" >> "${_DESTDIR}/root/.bashrc"
cp /etc/profile.d/custom-bash-options.sh "${_DESTDIR}"/etc/profile.d/
_chroot_umount
echo "Rebuilding glibc locales on installed system..."
systemd-nspawn -q -D /mnt/install locale-gen &>"${_NO_LOG}"

### set root password
echo "123" > /tmp/.password
echo "123" >> /tmp/.password
passwd -R "${_DESTDIR}" "root" < /tmp/.password &>"${_NO_LOG}"
echo "New password set for root."
rm /tmp/.password

### pacman installation
_chroot_mount
echo "Installing nano..."
pacman --root /mnt/install --cachedir=/mnt/install/var/cache/pacman/pkg --noconfirm -Sy nano &>"${_LOG}"
sync
_chroot_umount

### hwdetect
echo "Preconfiguring mkinitcpio settings on installed system..."
sd "^MODULES=.*" "MODULES=(virtio_blk btrfs vfat crc32c)" "${_DESTDIR}"/etc/mkinitcpio.conf
sd "^HOOKS=.*" "HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block filesystems fsck)" "${_DESTDIR}"/etc/mkinitcpio.conf

### mkinitcpio disable fallback
sd " 'fallback'" '' "${_DESTDIR}"/etc/mkinitcpio.d/*.preset
rm -f "${_DESTDIR}/boot/initramfs-linux-fallback.img"

### mkinitcpio
_chroot_mount
echo "Running mkinitcpio on installed system..."
chroot "${_DESTDIR}" mkinitcpio -p "linux" &>"${_LOG}"
_chroot_umount

### pacman installation
_chroot_mount
echo "Installing amd-ucode..."
pacman --root /mnt/install --cachedir=/mnt/install/var/cache/pacman/pkg --noconfirm -Sy amd-ucode &>"${_LOG}"
sync
_chroot_umount

### pacman installation
_chroot_mount
echo "Installing efivar efibootmgr..."
pacman --root /mnt/install --cachedir=/mnt/install/var/cache/pacman/pkg --noconfirm -Sy efivar efibootmgr &>"${_LOG}"
sync
_chroot_umount

### systemd-boot
echo "Setting up SYSTEMD-BOOT now..."
mkdir -p "${_DESTDIR}/boot/loader/entries"
mkdir -p "${_DESTDIR}/efi/loader"
_chroot_mount
chroot "${_DESTDIR}" bootctl install &>"${_LOG}"
_chroot_umount

### /mnt/install/boot/loader/entries/archlinux-core-main.conf file
: > "/mnt/install/boot/loader/entries/archlinux-core-main.conf"
echo 'title    Arch Linux' >> /mnt/install/boot/loader/entries/archlinux-core-main.conf
echo 'linux    /vmlinuz-linux' >> /mnt/install/boot/loader/entries/archlinux-core-main.conf
echo 'initrd   /initramfs-linux.img' >> /mnt/install/boot/loader/entries/archlinux-core-main.conf
echo 'options  root=PARTUUID=51fe15d6-8085-4810-968a-5229c91f58f6 rootfstype=btrfs rw rootflags=rw,relatime,compress=zstd:3,discard=async,space_cache=v2,subvolid=256,subvol=/root ' >> /mnt/install/boot/loader/entries/archlinux-core-main.conf
echo '' >> /mnt/install/boot/loader/entries/archlinux-core-main.conf

### /mnt/install/efi/loader/loader.conf file
: > "/mnt/install/efi/loader/loader.conf"
echo 'timeout 5' >> /mnt/install/efi/loader/loader.conf
echo 'default archlinux-core-main' >> /mnt/install/efi/loader/loader.conf
echo '' >> /mnt/install/efi/loader/loader.conf

### pacman hook
mkdir -p "${_DESTDIR}"/etc/pacman.d/hooks
### /mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook file
: > "/mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook"
echo '[Trigger]' >> /mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook
echo 'Type = Package' >> /mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook
echo 'Operation = Upgrade' >> /mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook
echo 'Target = systemd' >> /mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook
echo '' >> /mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook
echo '[Action]' >> /mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook
echo 'Description = Gracefully upgrading systemd-boot...' >> /mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook
echo 'When = PostTransaction' >> /mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook
echo 'Exec = /usr/bin/systemctl restart systemd-boot-update.service' >> /mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook
echo '' >> /mnt/install/etc/pacman.d/hooks/999-systemd-bootd.hook