#!/usr/bin/env bash
source /root/source.txt
source /root/board.txt
source /root/userdata.txt
source /root/custom.txt
if [ $VERBOSE -eq 1 ]; then set -x; fi
if [[ -f "/root/services.txt" ]]; then source /root/services.txt; fi
source /root/miscellaneous.txt
source /root/networking.txt
URL="https://raw.githubusercontent.com/pyavitz/scripts/master/"

set -o errexit
set -o pipefail
set -o nounset

mount -t proc proc proc/
mount -t sysfs sys sys/

export DEBIAN_FRONTEND="noninteractive"

if [[ "$DISTRO" == "ubuntu" ]]; then rm -f /etc/resolv.conf; fi
echo "nameserver ${NAMESERVER1}" > /etc/resolv.conf
echo "nameserver ${NAMESERVER2}" >> /etc/resolv.conf

if [ $NETWORKMANAGER -eq 0 ] && [[ "$DISTRO_VERSION" == "jammy" ]]; then
	# systemd-resolved breaks static ip when using ifupdown, disable on jammy jellyfish
	unlink /etc/resolv.conf
	rm -f /etc/resolv.conf
	systemctl disable systemd-resolved
	echo "nameserver ${NAMESERVER1}" > /etc/resolv.conf
	echo "nameserver ${NAMESERVER2}" >> /etc/resolv.conf
fi

# do not accept new config files in an unattended install
mkdir -p /etc/apt/apt.conf.d
echo 'Dpkg::Options {"--force-confold";};' > /etc/apt/apt.conf.d/71debconf

# dpkg: error: failed to open package info file '/var/lib/dpkg/available' for reading: No such file or directory
if [[ "$DISTRO_VERSION" == "focal" ]]; then dpkg --clear-avail; fi

apt-get update
apt-get install -y apt-utils

# locales
apt install -y locales
export LANGUAGE=${LOCALE}
export LANG=${LOCALE}
export LC_ALL=${LOCALE_LC_ALL}
locale-gen ${LOCALE}

# timezone
ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime
echo -n "${TIMEZONE}" > /etc/timezone

apt upgrade -y
apt dist-upgrade -y
apt autoremove -y
if [[ "$DISTRO" =~ ^(kali|ubuntu)$ ]]; then apt_preferences; echo ""; fi
# network variables
if [ $NETWORKMANAGER -eq 1 ]; then NETWORKING="network-manager"; else NETWORKING="ifupdown"; fi
if [[ "$DISTRO" =~ ^(debian|raspbian)$ ]]; then
	apt install -y ${PKGS} ${USER_PKGS} ${SYSMODS} ${FIRMWARE} resolvconf openssh-client openssh-server ${NETWORKING}
fi
if [[ "$DISTRO" == "devuan" ]]; then
	apt install -y openssh-client openssh-server --no-install-recommends
	apt install -y ${PKGS} ${USER_PKGS} ${SYSMODS} ${FIRMWARE} openresolv ${NETWORKING}
fi
if [[ "$DISTRO" == "kali" ]]; then
	apt install -y ${PKGS} ${USER_PKGS} ${SYSMODS} ${FIRMWARE} openssh-client openssh-server dbus-user-session libical3 resolvconf haveged ntpdate ${NETWORKING}
fi
if [[ "$DISTRO" == "ubuntu" ]]; then
	if [[ "$DISTRO_VERSION" =~ ^(kinetic|lunar|mantic|noble)$ ]]; then RESOLVE="systemd-resolved"; else RESOLVE="openresolv"; fi
	apt install -y ${PKGS} ${USER_PKGS} ${SYSMODS} ${RESOLVE} openssh-client openssh-server ${NETWORKING}
	if [ $NETWORKMANAGER -eq 0 ] && [[ "$DISTRO_VERSION" == "jammy" ]]; then
		# disable systemd-networkd and mask systemd-networkd-wait-online
		systemctl disable systemd-networkd
		systemctl mask systemd-networkd-wait-online
	fi
fi
# apt clean
if [[ "$DISTRO" == "ubuntu" ]]; then
	if [[ -f "/etc/update-motd.d/88-esm-announce" ]]; then
		rm -f /etc/update-motd.d/88-esm-announce
		echo '#!/bin/sh' > /etc/update-motd.d/88-esm-announce
		chmod +x /etc/update-motd.d/88-esm-announce
	fi
	if [[ -f "/etc/update-motd.d/91-contract-ua-esm-status" ]]; then
		rm -f /etc/update-motd.d/91-contract-ua-esm-status
		echo '#!/bin/sh' > /etc/update-motd.d/91-contract-ua-esm-status
		chmod +x /etc/update-motd.d/91-contract-ua-esm-status
	fi
	if [[ -f "/etc/apt/apt.conf.d/20apt-esm-hook.conf" ]]; then
		rm -f /etc/apt/apt.conf.d/20apt-esm-hook.conf
		touch /etc/apt/apt.conf.d/20apt-esm-hook.conf
	fi
	# remove ubuntu pro adverts apt hook
	echo 'DPkg::Post-Invoke {"/usr/local/sbin/remove-ubuntu-advert";};' > /etc/apt/apt.conf.d/80remove-ubuntu-advert
	cat <<EOF > "/usr/local/sbin/remove-ubuntu-advert"
#!/bin/bash

if [[ -f "/etc/update-motd.d/88-esm-announce" ]]; then
	rm -f /etc/update-motd.d/88-esm-announce
	echo '#!/bin/sh' > /etc/update-motd.d/88-esm-announce
	chmod +x /etc/update-motd.d/88-esm-announce
fi
if [[ -f "/etc/update-motd.d/91-contract-ua-esm-status" ]]; then
	rm -f /etc/update-motd.d/91-contract-ua-esm-status
	echo '#!/bin/sh' > /etc/update-motd.d/91-contract-ua-esm-status
	chmod +x /etc/update-motd.d/91-contract-ua-esm-status
fi
if [[ -f "/etc/apt/apt.conf.d/20apt-esm-hook.conf" ]]; then
	rm -f /etc/apt/apt.conf.d/20apt-esm-hook.conf
	touch /etc/apt/apt.conf.d/20apt-esm-hook.conf
fi
EOF
	chmod +x /usr/local/sbin/remove-ubuntu-advert
fi
apt -y clean
apt -y autoclean

# user options
echo -n "${HOSTNAME}" > /etc/hostname;
sed -i "1 a 127.0.1.1	${HOSTNAME}" /etc/hosts;
if [ $USERACCT -eq 0 ]; then
	# prevent build fail because of white spaces
	NAME_FIXUP=`echo ${NAME} | sed "s/ //g"`
	echo "";
	adduser ${USERNAME} --gecos ${NAME_FIXUP} --disabled-password
	echo "${USERNAME}:${PASSWORD}" | chpasswd
	adduser ${USERNAME} sudo
	adduser ${USERNAME} audio
	adduser ${USERNAME} dialout
	adduser ${USERNAME} video
	adduser ${USERNAME} disk
	adduser ${USERNAME} plugdev
	adduser ${USERNAME} netdev
	adduser ${USERNAME} bluetooth
	adduser ${USERNAME} input
	adduser ${USERNAME} render
	adduser ${USERNAME} tty
	adduser ${USERNAME} i2c
	groupadd gpio
	groupadd spi
	adduser ${USERNAME} gpio
	adduser ${USERNAME} spi
fi
if [ $USERACCT -eq 1 ]; then
	mkdir -p /boot/broadcom
	mkdir -p /usr/local/sbin
	mv -f /root/useracct/useraccount /usr/local/sbin/
	chmod +x /usr/local/sbin/useraccount
	mv -f /root/{nanorc-user,user-ini} /etc/opt/
	mv -f /root/useracct/useraccount.txt /boot/broadcom/useraccount.txt
	if [[ "$DISTRO" == "devuan" ]]; then
		mkdir -p /etc/init.d
		mv -f /root/useracct/useraccount.init /etc/init.d/useraccount
		chmod +x /etc/init.d/useraccount
		update-rc.d useraccount defaults 5
		rm -fdr /root/useracct
	else
		mkdir -p /etc/systemd/system/
		mv -f /root/useracct/useraccount.service /etc/systemd/system/
		systemctl enable useraccount > /dev/null 2>&1
		rm -fdr /root/useracct
	fi
fi
if [ $ROOTPASSWD -eq 1 ]; then
	echo "root:toor" | chpasswd
fi

# sudoers file
if [ $USERACCT -eq 0 ]; then
	echo ""
	tee /etc/sudoers.d/010_${USERNAME}-nopasswd <<EOF
${USERNAME} ALL=(ALL) NOPASSWD: ALL
EOF
fi

# user script
if [ $USCRIPTS -eq 1 ]; then uscripts_stage2; fi

# skins
cd ~
mkdir -p /usr/share/mc/skins
mv -f darkgreen.ini /usr/share/mc/skins/darkgreen.ini
mv -f darkred.ini /usr/share/mc/skins/darkred.ini
mkdir -p /root/.config/mc
mv -f root-ini /root/.config/mc/ini
mv -f nanorc-root /root/.nanorc
chown -R root:root /root
if [ $USERACCT -eq 0 ]; then
	mkdir -p /home/${USERNAME}/.config/mc;
	mv -f user-ini /home/${USERNAME}/.config/mc/ini;
	mv -f nanorc-user /home/${USERNAME}/.nanorc;
	chown -R ${USERNAME}:${USERNAME} /home/${USERNAME};
fi

# scripts
echo ""
echo "Moving scripts ..."
cd ~
mkdir -p /usr/local/bin
mkdir -p /usr/local/sbin
if [[ "$BOARD_EXT" =~ ^(rpi-2+3|rpi-3|rpi-4|rpi-5)$ ]]; then
	wget -cq --show-progress ${URL}deb-eeprom
	mv -f deb-eeprom /usr/local/bin/
fi
if [ $NETWORKMANAGER -eq 0 ]; then
	wget -cq --show-progress ${URL}swh
	sleep .25
	mv -f swh /usr/local/bin/
fi
wget -cq --show-progress ${URL}governor
wget -cq --show-progress https://raw.githubusercontent.com/pyavitz/rpi-img-builder/menuconfig/menu-config
wget -cq --show-progress https://raw.githubusercontent.com/pyavitz/rpi-img-builder/menuconfig/menu-config-update
mv -f {governor,setup,sysinfo,smon,menu-config,menu-config-update,transfer} /usr/local/bin/
mv -f firstboot.sh /usr/local/sbin/firstboot
mv -f leds.sh /usr/local/sbin/leds
if [[ "$DISTRO" == "devuan" ]]; then
	# inits
	mv -f firstboot.init /etc/init.d/firstboot
	mv -f leds.init /etc/init.d/leds
	mv -f governor.init /etc/init.d/governor
	mv -f bthelper.init /etc/init.d/bthelper
	mv -f zramswap.init /etc/init.d/zramswap
	mv -f credentials.init /etc/init.d/credentials
fi
mv -f growpart /usr/bin/
chmod +x /usr/bin/growpart
chown root:root /usr/bin/growpart
chmod +x /usr/local/bin/*
chmod +x /usr/local/sbin/*
chown -R root:root /usr/local/bin/
chown -R root:root /usr/local/sbin/

# motd
mkdir -p /etc/update-motd.d
rm -f /etc/update-motd.d/{10-uname,00-header}
if [[ -f "/etc/update-motd.d/10-help-text" ]]; then
	rm -f /etc/update-motd.d/10-help-text
	echo '#!/bin/sh' > /etc/update-motd.d/10-help-text
	chmod +x /etc/update-motd.d/10-help-text
fi
mv -f {00-header,15-brand,20-sysinfo,90-dynamic-motd} /etc/update-motd.d/
chmod +x /etc/update-motd.d/*
echo "# DYNAMIC MOTD VARIABLES" > /etc/default/dynamic-motd
echo 'H_POS="-c"' >> /etc/default/dynamic-motd
echo 'B_POS="-r"' >> /etc/default/dynamic-motd
echo BRANDING='"'${BRANDING}'"' >> /etc/default/dynamic-motd
echo MOTD='"'${MOTD}'"' >> /etc/default/dynamic-motd
echo 'T_FONT="small"' >> /etc/default/dynamic-motd
echo 'T_FILTER="metal"' >> /etc/default/dynamic-motd
echo 'MENUCONFIG="true"' >> /etc/default/dynamic-motd
chown root:root /etc/update-motd.d/{00-header,15-brand,20-sysinfo,90-dynamic-motd}
rm -f /etc/motd
echo "" > /etc/motd
chown root:root /etc/motd

# kali services
if [[ "$DISTRO" == "kali" ]]; then 
	if [ $VERBOSE -eq 1 ]; then kali_services; else kali_services > /dev/null 2>&1; fi
fi

# debian bookworm fixups
if [[ "$DISTRO_VERSION" == "bookworm" ]]; then
	apt install -y binfmt-support
	mv -f /root/systemd-binfmt-fixups /usr/local/sbin/systemd-binfmt-fixups
	chmod +x /usr/local/sbin/systemd-binfmt-fixups
	binfmt_fixups_service > /dev/null 2>&1
else
	rm -f /root/systemd-binfmt-fixups
fi

# rpi firmware
extra_firmware

# udev rules
cd ~
mkdir -p /etc/udev/rules.d/
mkdir -p /lib/udev/rules.d/
if [[ -f "/root/99-com.rules" ]]; then
	mv -f 99-com.rules /etc/udev/rules.d/
fi
if [[ -f "/root/10-local-rpi.rules" ]]; then
	# camera
	mv -f 10-local-rpi.rules /lib/udev/rules.d/
fi
if [[ -f "/root/60-rpi.gpio-common.rules" ]]; then
	mv -f 60-rpi.gpio-common.rules /lib/udev/rules.d/
fi

# wireless regdb
wireless_regdb

# network Setup
if [ $NETWORKMANAGER -eq 1 ]; then
	networkmanager-setup > /dev/null 2>&1
	networkmanager-credentials > /dev/null 2>&1
else
	ifupdown-setup > /dev/null 2>&1
	ifupdown-credentials > /dev/null 2>&1
fi

# board information
if [[ -f "/root/board.txt" ]]; then
	cp -f /root/board.txt /etc/opt/
	ln -sr /etc/opt/board.txt /etc/opt/soc.txt
	chown root:root /etc/opt/board.txt
fi

# zswap virtual memory
if [[ -f "/etc/default/zramswap" ]]; then
	sed -i 's/#ALLOCATION=256/ALLOCATION=1024/g' /etc/default/zramswap
	sed -i 's/#SIZE=256/SIZE=1024/g' /etc/default/zramswap
	sed -i 's/#PRIORITY=100/PRIORITY=100/g' /etc/default/zramswap
fi

# adding sys-mods
raspberrypi_sys_mods
if [[ -f "/etc/sudoers.d/010_pi-nopasswd" ]]; then
	# security risk
	rm -f /etc/sudoers.d/010_pi-nopasswd
fi

# pi-bluetooth
echo ""
echo "Installing pi-bluetooth ..."
if [[ "$DISTRO" == "ubuntu" ]]; then
	git clone https://github.com/pyavitz/pi-bluetooth.git -b ubuntu
else
	git clone https://github.com/pyavitz/pi-bluetooth.git
fi
cd pi-bluetooth
chmod +x debian/rules
dpkg-buildpackage -us -uc
cd ~
dpkg -i pi-bluetooth_*.deb
rm -fdR pi-bluetooth*

#  userland
rpi_userland

# eeprom
if [[ "$BOARD_EXT" =~ ^(rpi-2+3|rpi-3|rpi-4|rpi-5)$ ]]; then eeprom_support; fi

# remove zstd compression (not supported by older kernels)
if [[ "$DISTRO" == "ubuntu" ]]; then
	if [[ `grep -w "COMPRESS=zstd" "/etc/initramfs-tools/initramfs.conf"` ]]; then
		sed -i 's/COMPRESS=zstd/COMPRESS=xz/g' /etc/initramfs-tools/initramfs.conf
	fi
fi

# kernel
stage2_kernel # miscellaneous

# brcm modules
bcm_modules > /dev/null 2>&1
echo "snd_bcm2835" >> /etc/modules

# clean misc files
rm -f {*.patch,*led*,*eeprom*}

# whiptail color palette
if [[ "$DISTRO" == "ubuntu" ]]; then
	mkdir -p /etc/newt
	palette-dark > /dev/null 2>&1
	ln -sf /etc/newt/palette.dark  /etc/alternatives/newt-palette
fi

# xorg confs
if [[ "$BOARD_EXT" =~ ^(rpi-4|rpi-5)$ ]]; then xorg_confs; fi

# hack
if [[ "$BOARD" == "bcm2708" ]] && [[ -f "/lib/ld-linux.so.3" ]]; then
	ln -s /lib/ld-linux.so.3 /lib/ld-linux-armhf.so.3
fi

# flush runtime journal
if [[ -f "/etc/systemd/journald.conf" ]]; then
	sed -i 's/#Storage=auto/Storage=volatile/g' /etc/systemd/journald.conf
	sed -i 's/#SystemMaxFileSize=/SystemMaxFileSize=50M/g' /etc/systemd/journald.conf
	sed -i 's/#SystemMaxFiles=100/SystemMaxFiles=5/g' /etc/systemd/journald.conf
fi

# services
echo ""
echo "Checking Services ..."
sleep 1s
if [[ "$DISTRO" == "devuan" ]]; then
	echo "== Sysvinit"
	sysvinit_services > /dev/null 2>&1
else
	echo "== Systemd"
	firstboot_service > /dev/null 2>&1
	credentials_service > /dev/null 2>&1
	governor_service > /dev/null 2>&1
	led_service > /dev/null 2>&1
	rc-local_service > /dev/null 2>&1
	systemd_services > /dev/null 2>&1
fi

# finish
rm -f /etc/apt/apt.conf.d/71debconf
rm -fdr /*usr-is-merged*
if [[ "$DISTRO" == "ubuntu" ]]; then rm -f /etc/resolv.conf; fi
echo ""
echo "Finalizing ..."
echo ""
sleep .75

umount /proc /sys
