#!/bin/bash -e

#----------------------------------------------------------------------------
# DARKNESS i386 QUASI-INSTALLER - (c) Nikolaus Klepp office@klepp.biz
#----------------------------------------------------------------------------
# This program creates a debootstrap boilerplate installation of DEVUAN CERES
# with last i386 kernel, installs TDE and injects DARKNESS customisations.
# Locales/language settings are taken from your working environment.
# Please note: this is intended to be used from inside a DARKNESS LIVE ISO,
# especially the custumisations. When you use it from a different environment
# you will lose these customisatione ('cause I did not package them ... yet)
#----------------------------------------------------------------------------
# 2026-05-18 : initial release
#----------------------------------------------------------------------------

# will most likely only work as root
if [ $UID != 0 ]; then
    echo "you need to be root for this to work."
    exit 1
fi


# Usage ...
if [ $# -ne 1 ]; then
    echo "Usage:  $(basename $0) TARGET"
    echo "TARGET must be either a disk or file but not a partition."
    exit 1
fi




# Sanitycheck
if [ -f "$1" ]; then
    IMG="$1"
    DEV=/dev/loop0
    PART=${DEV}p
    losetup -D
    sleep 1
    losetup $DEV "$IMG"
else
    if [ -z "$(lsblk $1 | grep ' disk')" ]; then
        echo "ERROR: $1 is not a disc."
        exit 1
    fi
    if [ 0 -lt $(mount|grep "$1"|wc -l) ]; then
        mount | grep "$1"
        echo "ERROR: $1 or one of its partitions is in use."
        exit 1
    fi
    IMG=
    DEV="$1"
    PART=$(echo "$DEV"|sed 's#\(/[^sh][^/]*\)$#\1p#')
fi

# Check, if target device is a block device and present
if [ ! -b "$DEV" ]; then
    echo \"$DEV\" not present.
    exit 1
fi



# clear the device and create one MSDOS partition
for i in $(ls $DEV* | sort -r); do
     wipefs -a $i
done
blkdiscard -f $DEV || dd if=/dev/zero of=$DEV bs=1M count=128
sfdisk $DEV << XXX
label: dos
label-id: 0xdeadbeef
unit: sectors
sector-size: 512

${PART}1 : start=        2048, size=    , type=83, bootable
XXX


# file target need special treating ...
if [ -n "$IMG" ]; then
    losetup -D
    sleep 1
    losetup $DEV "$IMG" --partscan
fi


# automounter fun ...
sleep 5
if [ -n "$(mount|grep $PART)" ]; then
    for i in $(mount|grep $PART|awk '{print $1}'|sort -r); do
        umount $i
    done
fi


# Format and mount target ...
MNT=/tmp/i386
mkdir -p $MNT
mkfs.ext4 -F -L rootfs ${PART}1
mount ${PART}1 $MNT


# Install base system without kernel
while ! debootstrap --arch=i386 \
    --include=ca-certificates,locales,dpkg,grub-pc,acpi-support,devuan-keyring,wget,curl,grub-pc,initramfs-tools,console-setup \
    ceres $MNT http://deb.devuan.org/merged
do 
	echo retry debootstrap ...
	sleep 3
done


# prepare chroot environment
mount x $MNT/proc    -t proc
mount x $MNT/sys     -t sysfs
mount x $MNT/tmp     -t tmpfs
mount x $MNT/dev     -t devtmpfs
mount x $MNT/dev/pts -t devpts



# Now we are set for cdroot and other modifications

# frontend for deb/apt/etc.
export DEBIAN_FRONTEND=noninteractive


# fstab for our needs
cat > $MNT/etc/fstab << XXX
#LABEL=rootfs          /                 ext4     defaults,noatime   0 1
PARTUUID=deadbeef-01  /                 ext4     defaults,noatime   0 1
tmpfs                 /tmp              tmpfs    relatime           0 1
XXX


# Locales & keyboard
cp /etc/default/keyboard $MNT/etc/default/keyboard
cp /etc/locale.gen       $MNT/etc/locale.gen
cp /etc/locale.conf      $MNT/etc/locale.conf
cp /etc/default/locale   $MNT/etc/default/locale
cp ~/.bashrc             $MNT/root
chroot $MNT locale-gen
chroot $MNT update-locale LANG=$LANG LANGUAGE=\"$LANGUAGE\"

chroot $MNT dpkg-reconfigure keyboard-configuration
chroot $MNT dpkg-reconfigure console-setup

# remove old sources
rm -f $MNT/etc/apt/sources.list

# upgrade to devuan ceres and install vulnerability mitigations
cat > $MNT/etc/apt/sources.list.d/devuan.sources << XXX
Types: deb
URIs: http://deb.devuan.org/merged
Suites: ceres
Components: main contrib non-free non-free-firmware
Enabled: yes
Signed-By: /usr/share/keyrings/devuan-archive-keyring.gpg
XXX


# add TDE sources and install TDE
cat > $MNT/etc/apt/sources.list.d/trinity.sources << XXX
Types: deb
URIs: http://mirror.ppa.trinitydesktop.org/trinity-testing
Suites: ceres
Components: main deps extra
Enabled: yes
Signed-By: /etc/apt/trusted.gpg.d/trinity-archive-keyring.gpg
XXX
chroot $MNT wget https://mirror.ppa.trinitydesktop.org/trinity/deb/trinity-keyring.deb
chroot $MNT dpkg -i trinity-keyring.deb
chroot $MNT rm trinity-keyring.deb

# Xlibre - gibt's nicht für i386
#cp /etc/apt/sources.list.d/xlibre-debian.sources $MNT/etc/apt/sources.list.d/xlibre-debian.sources
#cp /usr/share/keyrings/NexusSfan.pgp             $MNT/usr/share/keyrings/NexusSfan.pgp


# DARKNESS sources and install tweaks
KEY=$(curl https://darkness.klepp.cn/devuan/pool/main/ --silent | tr '"' '\n' | grep '^darkness-key.*.deb$')
chroot $MNT wget https://darkness.klepp.cn/devuan/pool/main/$KEY
chroot $MNT dpkg -i $KEY
chroot $MNT rm $KEY

# install all remaining packages and do a final upgrade
chroot $MNT apt update
chroot $MNT apt --assume-yes install linux-image-darkness
chroot $MNT apt -o Dpkg::Options::="--force-confnew" --assume-yes install linux-vulnerability-mitigation
chroot $MNT apt -o Dpkg::Options::="--force-confnew" --assume-yes dist-upgrade
apt-mark minimize-manual
chroot $MNT apt --assume-yes install $(apt-mark showmanual | joe openscad $(apt-mark showmanual |\
  grep --invert-match refractainstaller | grep '\(trinity\|network\|darkness\)')
chroot $MNT apt --assume-yes dist-upgrade
chroot $MNT apt --assume-yes autoremove

# kernel + initrd symlinks
chroot $MNT ln -s boot/initrd.img-*-darkness initrd.img
chroot $MNT ln -s boot/vmlinuz-*-darkness vmlinuz


# Grub + Kernelparameter
sed 's#^GRUB_CMDLINE_LINUX_DEFAULT=.*$#GRUB_CMDLINE_LINUX_DEFAULT=""#' -i $MNT/etc/default/grub
sed 's#^GRUB_CMDLINE_LINUX=.*$#GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"#' -i $MNT/etc/default/grub
sed 's#^GRUB_TIMEOUT=.*$#GRUB_TIMEOUT=0#'  -i $MNT/etc/default/grub

chroot $MNT grub-install $DEV
chroot $MNT update-grub



# Q&D: copy global configs & user
#rsync -av --delete /root/ $MNT/root
#rsync -av --delete /etc/ $MNT/etc
#rsync -av --delete /home/user $MNT/home

# set root password
chroot $MNT passwd -s << XXX
toor
toor
XXX

# add user "user"
echo | chroot $MNT adduser --disabled-password user
chroot $MNT passwd user -s << XXX
user
user
XXX
chroot $MNT usermod -a -G $(groups user|sed 's#^.*: *##'|tr ' ' ','|sed 's#,bluetooth##') user
cp $MNT/opt/darkness/dot.profile $MNT/root/.profile
cp $MNT/opt/darkness/dot.bashrc  $MNT/root/.bashrc
cp $MNT/opt/darkness/dot.profile $MNT/home/user/.profile
cp $MNT/opt/darkness/dot.bashrc  $MNT/home/user/.bashrc
chroot $MNT chown user:user /home/user/ -R


# make it autologin
sed -i 's/^#\(AutoLoginAgain\)=.*$/\1=true/'   $MNT/etc/trinity/tdm/tdmrc
sed -i 's/^#\(AutoLoginDelay\)=.*$/\1=0/'      $MNT/etc/trinity/tdm/tdmrc
sed -i 's/^#\(AutoLoginEnable\)=.*$/\1=true/'  $MNT/etc/trinity/tdm/tdmrc
sed -i 's/^#\(AutoLoginLocked\)=.*$/\1=false/' $MNT/etc/trinity/tdm/tdmrc
sed -i 's/^#\(AutoLoginUser\)=.*$/\1=user/'    $MNT/etc/trinity/tdm/tdmrc

# Hostname ...
echo darkness32 > $MNT/etc/hostname
echo "127.0.0.1	darkness32" >> $MNT/etc/hosts

# unmount target
umount $MNT/dev/pts
umount $MNT/dev
umount $MNT/tmp
umount $MNT/sys
umount $MNT/proc

sync
umount $MNT
rmdir $MNT

if [ -n "$IMG" ]; then
    losetup -D
fi

