#!/bin/bash
#
# Copyright (c) Authors: https://www.armbian.com/authors
#
# This file is licensed under the terms of the GNU General Public
# License version 2. This program is licensed "as is" without any
# warranty of any kind, whether express or implied.

# read distribution status
# shellcheck source=/dev/null
[[ -f /etc/lsb-release ]] && . /etc/lsb-release
[[ -f /etc/os-release ]] && . /etc/os-release
[[ -z "$DISTRIB_CODENAME" ]] && DISTRIB_CODENAME="${VERSION_CODENAME}"
[[ -n "$DISTRIB_CODENAME" && -f /etc/armbian-distribution-status ]] && DISTRIBUTION_STATUS=$(grep "$DISTRIB_CODENAME" /etc/armbian-distribution-status | cut -d"=" -f2)

. /etc/armbian-release

check_abort() {

	echo -e "\nDisabling user account creation procedure\n"
	rm -f /root/.not_logged_in_yet
	if [[ ${USER_SHELL} == zsh ]]; then
		printf "\nYou selected \e[0;91mZSH\x1B[0m as your default shell. If you want to use it right away, please logout and login! \n\n"
	fi
	trap - INT
	exit 0

}

mask2cidr() {
	nbits=0
	IFS=.
	for dec in $1 ; do
		case $dec in
			255) let nbits+=8;;
			254) let nbits+=7;;
			252) let nbits+=6;;
			248) let nbits+=5;;
			240) let nbits+=4;;
			224) let nbits+=3;;
			192) let nbits+=2;;
			128) let nbits+=1;;
			0);;
			*) echo "Error: $dec is not recognised"; exit 1
		esac
	done
	echo "$nbits"
}

do_firstrun_automated_network_configuration()
{
	#-----------------------------------------------------------------------------
	#Config FP
	local fp_config='/root/.not_logged_in_yet'

	#-----------------------------------------------------------------------------
	#Grab user requested settings
	if [[ -f $fp_config ]]; then

		# Convert line endings to Unix from Dos
		sed -i $'s/\r$//' "$fp_config"

		# check syntax
		bash -n "$fp_config" || return

		# Load vars directly from file
		source "$fp_config"

		# Obtain backward configuration compatibility
		PRESET_NET_STATIC_DNS=${PRESET_NET_STATIC_DNS// /,}
		PRESET_NET_STATIC_MASK=$(mask2cidr $PRESET_NET_STATIC_MASK)

		#-----------------------------------------------------------------------------
		# Set Network
		if [[ $PRESET_NET_CHANGE_DEFAULTS == 1 ]]; then
			# Only run at tty1
			if [ "$(who am i | awk '{print $2}')" != "tty1" ];then
				exit
			fi
			# - Get name of 1st available ethernet and wifi adapter
			eth_index="$(nmcli d | grep ethernet | cut -d ' ' -f 1 | head -n 1)"
			wlan_index="$(nmcli d | grep wifi | cut -d ' ' -f 1 | head -n 1)"

			# for static IP we only append settings
			if [[ $PRESET_NET_USE_STATIC == 1 ]]; then
				local FIXED_IP_SETTINGS="ipv4.method manual ipv4.address ${PRESET_NET_STATIC_IP}/${PRESET_NET_STATIC_MASK} ipv4.dns ${PRESET_NET_STATIC_DNS} ipv4.gateway ${PRESET_NET_STATIC_GATEWAY}"
			fi

			if [[ -n $eth_index || -n $wlan_index ]]; then
				# delete all current connections
				LC_ALL=C nmcli -t -f UUID,DEVICE connection show | awk '{print $1}' | cut -f1 -d":" | xargs nmcli connection delete

				# - Wifi enable
				if [[ $PRESET_NET_WIFI_ENABLED == 1 ]]; then

					#Set wifi country code
					iw reg set "$PRESET_NET_WIFI_COUNTRYCODE"

					nmcli con add con-name "Armbian wireless" type wifi ifname ${wlan_index} ssid "$PRESET_NET_WIFI_SSID" -- wifi-sec.key-mgmt wpa-psk wifi-sec.psk "$PRESET_NET_WIFI_KEY" ${FIXED_IP_SETTINGS}
					nmcli con up "Armbian wireless"

					#Enable Wlan, disable Eth
					PRESET_NET_ETHERNET_ENABLED=0

				# - Ethernet enable
				elif [[ $PRESET_NET_ETHERNET_ENABLED == 1 ]]; then

					nmcli con add con-name "Armbian ethernet" type ethernet ifname ${eth_index} -- ${FIXED_IP_SETTINGS}
					nmcli con up "Armbian ethernet"

					#Enable Eth, disable Wlan
					PRESET_NET_WIFI_ENABLED=0

				fi
			fi
		fi
	fi
} #do_firstrun_automated_network_configuration

read_password() {

	unset password
	unset charcount
	prompt="$1 password: "

	stty -echo

	charcount=0
	while IFS= read -p "$prompt" -r -s -n 1 char; do
		if [[ $char == $'\0' ]]; then
			break
		fi

		# Handle backspace
		if [[ $char == $'\177' ]]; then
			if [ $charcount -gt 0 ]; then
				charcount=$((charcount - 1))
				prompt=$'\b \b'
				password="${password%?}"
			else
				prompt=''
			fi
		else
			charcount=$((charcount + 1))
			prompt='*'
			password+="$char"
		fi
	done

	stty echo

}

set_shell() {

	readarray -t optionsAudits <<< "$(grep "zsh\|/bash" /etc/shells | sed 's/\/bin\///g' | sed 's/\/usr//g' | uniq)"
	USER_SHELL="bash"

	if [[ "${#optionsAudits[@]}" -gt 1 ]]; then
		while :; do
			while [[ ! "${reply}" =~ ^(1|2)$ ]]; do
				i=1
				echo -e "\nChoose default system command shell:\n"
				for o in "${optionsAudits[@]}"; do
					echo "$i) $o"
					((i++)) || true
				done
				if [ -z $PRESET_USER_SHELL ];then
					read -r reply
				else
					reply=1
					for index in "${!optionsAudits[@]}"; do
						if [[ "${optionsAudits[$index]}" == "$PRESET_USER_SHELL" ]]; then
							reply=$(($index + 1))
							break
						fi
					done
				fi
			done
			case $reply in
				"1" | "${optionsAudits[0]}")
					USER_SHELL="${optionsAudits[0]}"
					break
					;;
				"2" | "${optionsAudits[1]}")
					USER_SHELL="${optionsAudits[1]}"
					break
					;;
				*)
					USER_SHELL="${optionsAudits[0]}"
					break
					;;
			esac
		done
	fi
	SHELL_PATH=$(grep "/$USER_SHELL$" /etc/shells | tail -1)

	chsh -s "$(grep -iF "/$USER_SHELL" /etc/shells | tail -1)"
	echo -e "\nShell: \x1B[92m${USER_SHELL^^}\x1B[0m"

	# change shell for future users
	sed -i "s|^SHELL=.*|SHELL=${SHELL_PATH}|" /etc/default/useradd
	sed -i "s|^DSHELL=.*|DSHELL=${SHELL_PATH}|" /etc/adduser.conf

}

set_timezone_and_locales() {

	# Grab this machine's public IP address
	PUBLIC_IP=$(curl --max-time 5 -s https://ipinfo.io/ip)

	# Check if we have wireless adaptor
	WIFI_DEVICE=$(LC_ALL=C nmcli dev status | grep " wifi " 2> /dev/null)

	if [ -z "$PUBLIC_IP" ]; then

		# ask for connecting to wireless if wifi device is found
		if [[ -n "$WIFI_DEVICE" ]]; then
			echo -e "Internet connection was \x1B[91mnot detected\x1B[0m."
			echo ""
			unset response
			while [[ ! "${response}" =~ ^(Y|y|N|n)$ ]]; do
				if [ -z $PRESET_CONNECT_WIRELESS ];then
					read -r -p "Connect via wireless? [Y/n] " response
					response=${response:-Y}
				else
					response=n
				fi
				echo "$response"
			done
			if [[ "${response}" =~ ^(Y|y)$ ]]; then
				nmtui-connect
			fi
			echo ""
		fi
	fi

	# Grab IP once again if not found
	[[ -z "$PUBLIC_IP" && -n "$WIFI_DEVICE" ]] && PUBLIC_IP=$(curl --max-time 5 -s https://ipinfo.io/ip)

	# Call the geolocation API and capture the output
	RES=$(
		curl --max-time 5 -s "http://ipwhois.app/json/${PUBLIC_IP}" |
			jq '.timezone, .country, .country_code' |
			while read -r TIMEZONE; do
				read -r COUNTRY
				echo "${TIMEZONE},${COUNTRY},${COUNTRYCODE}" | tr --delete '"\n'
			done
	)

	TZDATA=$(echo "${RES}" | cut -d"," -f1)
	CCODE=$(echo "${RES}" | cut -d"," -f3 | xargs)
	echo -e "Detected timezone: \x1B[92m$TZDATA\x1B[0m"
	echo ""
	unset response
	while [[ ! "${response}" =~ ^(Y|y|N|n)$ ]]; do
		if [ -z $SET_LANG_BASED_ON_LOCATION ];then
			read -r -p "Set user language based on your location? [Y/n] " response
			response=${response:-Y}
		else
			response=$SET_LANG_BASED_ON_LOCATION
		fi
		echo "$response"
	done
	# change it only if we have a match and if we agree
	if [[ "${response}" =~ ^(N|n)$ ]]; then
		unset CCODE TZDATA
	fi

	LOCALES=$(grep territory /usr/share/i18n/locales/* | grep _"$CCODE" | cut -d ":" -f 1 | cut -d "/" -f 6 |
		xargs -I{} grep {} /usr/share/i18n/SUPPORTED | grep "UTF-8$" | cut -d " " -f 1)
	# UTF8 is not present everywhere so check again in case it returns empty value
	[[ -z "$LOCALES" ]] && LOCALES=$(grep territory /usr/share/i18n/locales/* | grep _"$CCODE" | cut -d ":" -f 1 | cut -d "/" -f 6 |
		xargs -I{} grep {} /usr/share/i18n/SUPPORTED | cut -d " " -f 1)

	readarray -t options <<< "${LOCALES}"

	if [ -z $PRESET_LOCALE ];then
		# when having more locales, prompt for choosing one
		if [[ "${#options[@]}" -gt 1 ]]; then

			options+=("Skip generating locales")
			echo -e "\nAt your location, more locales are possible:\n"
			PS3='Please enter your choice:'
			select opt in "${options[@]}"; do
				if [[ " ${options[*]} " == *" ${opt} "* ]]; then
					LOCALES=${opt}
					break
				fi
			done
		fi
	else
		LOCALES=$PRESET_LOCALE
	fi

	if [[ "${LOCALES}" != *Skip* ]]; then

		if [ -z $PRESET_TIMEZONE ];then
			# if TZDATA was not detected, we need to select one
			if [[ -z ${TZDATA} ]]; then
				TZDATA=$(tzselect | tail -1)
			fi
		else
			TZDATA=$PRESET_TIMEZONE
		fi

		timedatectl set-timezone "${TZDATA}"
		dpkg-reconfigure --frontend=noninteractive tzdata > /dev/null 2>&1

		# generate locales
		echo ""
		sed -i 's/# '"${LOCALES}"'/'"${LOCALES}"'/' /etc/locale.gen
		echo -e "Generating locales: \x1B[92m${LOCALES}\x1B[0m"
		locale-gen "${LOCALES}" > /dev/null 2>&1

		# setting detected locales only for user
		{
			echo "export LC_ALL=$LOCALES"
			echo "export LANG=$LOCALES"
			echo "export LANGUAGE=$LOCALES"
		} >> /home/"$RealUserName"/.bashrc
		{
			echo "export LC_ALL=$LOCALES"
			echo "export LANG=$LOCALES"
			echo "export LANGUAGE=$LOCALES"
		} >> /home/"$RealUserName"/.xsessionrc

	fi
}

add_profile_sync_settings() {
	if [[ ! -f /usr/bin/psd ]]; then
		return 0
	fi

	/usr/bin/psd > /dev/null 2>&1
	config_file="${HOME}/.config/psd/psd.conf"
	if [ -f "${config_file}" ]; then
		# test for overlayfs
		sed -i 's/#USE_OVERLAYFS=.*/USE_OVERLAYFS="yes"/' "${config_file}"
		case $(/usr/bin/psd p 2> /dev/null | grep Overlayfs) in
			*active*)
				echo -e "\nConfigured profile sync daemon with overlayfs."
				;;
			*)
				echo -e "\nConfigured profile sync daemon."
				sed -i 's/USE_OVERLAYFS="yes"/#USE_OVERLAYFS="no"/' "${config_file}"
				;;
		esac
	fi
	systemctl --user enable psd.service > /dev/null 2>&1
	systemctl --user start psd.service > /dev/null 2>&1
}

add_user() {
	read -r -t 0 _
	REPEATS=3
	while [ -f "/root/.not_logged_in_yet" ]; do
		echo -e "\nPlease provide a username (eg. your first name): \c"
		if [ -z $PRESET_USER_NAME ];then
			read -r -e username
		else
			username=$PRESET_USER_NAME
		fi
		if ! grep '^[a-zA-Z][a-zA-Z0-9]*$' <<< "$username" > /dev/null; then
			echo -e "\n\x1B[91mError\x1B[0m: illegal characters in username"
			return
		fi

		RealUserName="$(echo "$username" | tr '[:upper:]' '[:lower:]' | tr -d -c '[:alnum:]')"
		[ -z "$RealUserName" ] && return
		if ! id "$RealUserName" > /dev/null 2>&1; then break; else echo -e "Username \e[0;31m$RealUserName\x1B[0m already exists on the system."; fi
	done

	while [ -f "/root/.not_logged_in_yet" ]; do
		if [ -z $PRESET_USER_PASSWORD ];then
			read_password "Create user ($username)"
		else
			password=$PRESET_USER_PASSWORD
		fi
		first_input="$password"
		echo ""
		if [ -z $PRESET_USER_PASSWORD ];then
			read_password "Repeat user ($username)"
		else
			password=$PRESET_USER_PASSWORD
		fi
		second_input="$password"
		echo ""
		if [[ "$first_input" == "$second_input" ]]; then
			# minimal images might not have this
			if command -v cracklib-check > /dev/null 2>&1; then
				result="$(cracklib-check <<< "$password")"
				okay="$(awk -F': ' '{ print $2}' <<< "$result")"
				if [[ "$okay" != "OK" ]]; then
					echo -e "\n\e[0;31mWarning:\x1B[0m Weak password, $okay \b!"
				fi
			fi
			echo -e ""
			if [ -z $PRESET_DEFAULT_REALNAME ];then
				read -r -e -p "Please provide your real name: " -i "${RealUserName^}" RealName
			else
				RealName=$PRESET_DEFAULT_REALNAME
			fi

			adduser --quiet --disabled-password --home /home/"$RealUserName" --gecos "$RealName" "$RealUserName"
			if [[ -n "$first_input" ]]; then
				(
					echo "$first_input"
					echo "$second_input"
				) | passwd "$RealUserName" > /dev/null 2>&1
			else
				passwd -d "$RealUserName" > /dev/null 2>&1
			fi
			for additionalgroup in sudo netdev audio video disk tty users games dialout plugdev input bluetooth systemd-journal ssh; do
				usermod -aG "${additionalgroup}" "${RealUserName}" 2> /dev/null
			done

			# fix for gksu in Xenial
			touch /home/"$RealUserName"/.Xauthority
			chown "$RealUserName":"$RealUserName" /home/"$RealUserName"/.Xauthority
			RealName="$(awk -F":" "/^${RealUserName}:/ {print \$5}" < /etc/passwd | cut -d',' -f1)"
			[ -z "$RealName" ] && RealName="$RealUserName"
			echo -e "\nDear \e[0;92m${RealName}\x1B[0m, your account \e[0;92m${RealUserName}\x1B[0m has been created and is sudo enabled."
			echo -e "Please use this account for your daily work from now on.\n"
			rm -f /root/.not_logged_in_yet
			chmod +x /etc/update-motd.d/*
			# set up profile sync daemon on desktop systems
			if command -v psd > /dev/null 2>&1; then
				echo -e "${RealUserName} ALL=(ALL) NOPASSWD: /usr/bin/psd-overlay-helper" >> /etc/sudoers
				touch /home/"${RealUserName}"/.activate_psd
				chown "$RealUserName":"$RealUserName" /home/"${RealUserName}"/.activate_psd
			fi
			break
		elif [[ -n $password ]]; then
			echo -e "Rejected - \e[0;31mpasswords do not match.\x1B[0m Try again [${REPEATS}]."
			REPEATS=$((REPEATS - 1))
		fi
		[[ "$REPEATS" -eq 0 ]] && logout
	done

}

if [[ -f /root/.not_logged_in_yet && -n $(tty) ]]; then
	do_firstrun_automated_network_configuration

	# disable autologin
	rm -f /etc/systemd/system/getty@.service.d/override.conf
	rm -f /etc/systemd/system/serial-getty@.service.d/override.conf
	systemctl daemon-reload

	declare desktop_dm="none"
	declare -i desktop_is_sddm=0 desktop_is_lightdm=0 desktop_is_gdm3=0
	if [[ -f /usr/bin/sddm ]]; then
		desktop_dm="sddm"
		desktop_is_sddm=1
	fi
	if [[ -f /usr/sbin/lightdm ]]; then
		desktop_dm="lightdm"
		desktop_is_lightdm=1
	fi
	if [[ -f /usr/sbin/gdm3 ]]; then
		desktop_dm="gdm3"
		desktop_is_gdm3=1
	fi

	echo -e "\nWaiting for system to finish booting ..."
	systemctl is-system-running --wait > /dev/null

	# enable hiDPI support
	if [[ "$(cut -d, -f1 < /sys/class/graphics/fb0/virtual_size 2> /dev/null)" -gt 1920 ]]; then
		# lightdm
		[[ -f /etc/lightdm/slick-greeter.conf ]] && echo "enable-hidpi = on" >> /etc/lightdm/slick-greeter.conf
		# xfce
		[[ -f /etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml ]] && sed -i 's|<property name="WindowScalingFactor" type="int" value=".*|<property name="WindowScalingFactor" type="int" value="2">|g' /etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml

		# framebuffer console larger font
		setfont /usr/share/consolefonts/Uni3-TerminusBold32x16.psf.gz
	fi

	clear

	echo -e "Welcome to \e[1m\e[97m${VENDOR}\x1B[0m! \n"
	echo -e "Documentation: \e[1m\e[92m${VENDORDOCS}\x1B[0m | Community support: \e[1m\e[92m${VENDORSUPPORT}\x1B[0m\n"
	GET_IP=$(bash /etc/update-motd.d/30-armbian-sysinfo | grep IP | sed "s/.*IP://" | sed 's/^[ \t]*//')
	[[ -n "$GET_IP" ]] && echo -e "IP address: $GET_IP\n"

	trap '' 2
	REPEATS=3
	while [ -f "/root/.not_logged_in_yet" ]; do
		. /root/.not_logged_in_yet
		if [ -z $PRESET_ROOT_PASSWORD ];then
			read_password "Create root"
		else
			if [ "$(who am i | awk '{print $2}')" != "tty1" ];then
				exit
			fi
			password=$PRESET_ROOT_PASSWORD
		fi

		# only allow one login. Once you enter root password, kill others.
		loginfrom=$(who am i | awk '{print $2}')
		who -la | grep root | grep -v "$loginfrom" | awk '{print $7}' | xargs --no-run-if-empty kill -9

		first_input="$password"
		echo ""
		if [ -z $PRESET_ROOT_PASSWORD ];then
			read_password "Repeat root"
		else
			password=$PRESET_ROOT_PASSWORD
		fi
		second_input="$password"
		echo ""
		if [[ "$first_input" == "$second_input" ]]; then
			# minimal might not have this
			if command -v cracklib-check > /dev/null 2>&1; then
				result="$(cracklib-check <<< "$password")"
				okay="$(awk -F': ' '{ print $2}' <<< "$result")"
				if [[ "$okay" != "OK" ]]; then
					echo -e "\n\e[0;31mWarning:\x1B[0m Weak password, $okay \b!"
				fi
			fi
			(
				echo "$first_input"
				echo "$second_input"
			) | passwd root > /dev/null 2>&1
			break
		elif [[ -n $password ]]; then
			echo -e "Rejected - \e[0;31mpasswords do not match.\x1B[0m Try again [${REPEATS}]."
			REPEATS=$((REPEATS - 1))
		fi
		[[ "$REPEATS" -eq 0 ]] && exit
	done
	trap - INT TERM EXIT

	# display support status
	if [ "$IMAGE_TYPE" != "nightly" ]; then
		if [[ "$BRANCH" == "edge" ]]; then
			echo -e "\nSupport status: \e[0;31mcommunity support\x1B[0m (edge kernel branch)"
		elif [[ "$DISTRIBUTION_STATUS" != "supported" ]]; then
			echo -e "\nSupport status: \e[0;31mcommunity support\x1B[0m (unsupported userspace)"
		elif [[ "$BOARD_TYPE" != "conf" ]]; then
			echo -e "\nSupport status: \e[0;31mcommunity support\x1B[0m (looking for a dedicated maintainer)"
		fi
	else

		echo -e "\e[0;31m\nWARNING!\x1B[0m\n\nYou are using an \e[0;31mautomated build\x1B[0m meant only for developers to provide"
		echo -e "constructive feedback to improve build system, OS settings or UX.\n"

		echo -e "If this does not apply to you, \e[0;31mSTOP NOW!\x1B[0m  Especially don't use this "
		echo -e "image for production since things might not work as expected or at "
		echo -e "all. They may  break anytime with next update."

	fi

	# ask user to select shell
	trap '' 2
	set_shell
	trap - INT TERM EXIT

	trap check_abort INT

	while [ -f "/root/.not_logged_in_yet" ]; do
		echo -e "\nCreating a new user account. Press <Ctrl-C> to abort"
		[[ "${desktop_dm}" != "none" ]] && echo -e "\n\e[0;31mDesktop environment will not be enabled if you abort the new user creation\x1B[0m"
		add_user
	done
	trap - INT TERM EXIT

	# ask user to select automated locales or not
	trap '' 2
	set_timezone_and_locales
	trap - INT TERM EXIT

	if [[ ${USER_SHELL} == zsh ]]; then
		printf "\nYou selected \e[0;91mZSH\x1B[0m as your default shell. If you want to use it right away, please logout and login! \n\n"
	fi

	# re-enable passing locale environment via ssh
	sed -e '/^#AcceptEnv LANG/ s/^#//' -i /etc/ssh/sshd_config
	# restart sshd daemon
	systemctl reload ssh.service

	# rpardini: hacks per-dm, very much legacy stuff that works by a miracle
	if [[ "${desktop_dm}" == "lightdm" ]] && [ -n "$RealName" ]; then

		mkdir -p /etc/lightdm/lightdm.conf.d
		cat <<- EOF > /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf
			[Seat:*]
			autologin-user=$RealUserName
			autologin-user-timeout=0
			user-session=xfce
		EOF

		# select gnome session (has to be first or it breaks budgie/cinnamon desktop autologin and user-session)
		# @TODO: remove this, gnome should use gdm3, not lightdm
		[[ -x $(command -v gnome-session) ]] && sed -i "s/user-session.*/user-session=ubuntu/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v gnome-session) ]] && sed -i "s/user-session.*/user-session=ubuntu/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		# select awesome session
		[[ -x $(command -v awesome) ]] && sed -i "s/user-session.*/user-session=awesome/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v awesome) ]] && sed -i "s/user-session.*/user-session=awesome/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		# select budgie session
		[[ -x $(command -v budgie-desktop) ]] && sed -i "s/user-session.*/user-session=budgie-desktop/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v budgie-desktop) ]] && sed -i "s/user-session.*/user-session=budgie-desktop/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		# select cinnamon session
		[[ -x $(command -v cinnamon) ]] && sed -i "s/user-session.*/user-session=cinnamon/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v cinnamon) ]] && sed -i "s/user-session.*/user-session=cinnamon/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		# select deepin session
		[[ -x $(command -v deepin-wm) ]] && sed -i "s/user-session.*/user-session=deepin/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v deepin-wm) ]] && sed -i "s/user-session.*/user-session=deepin/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		# select ice-wm session
		[[ -x $(command -v icewm-session) ]] && sed -i "s/user-session.*/user-session=icewm-session/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v icewm-session) ]] && sed -i "s/user-session.*/user-session=icewm-session/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		# select i3 session
		[[ -x $(command -v i3) ]] && sed -i "s/user-session.*/user-session=i3/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v i3) ]] && sed -i "s/user-session.*/user-session=i3/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		# select lxde session
		[[ -x $(command -v startlxde) ]] && sed -i "s/user-session.*/user-session=LXDE/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v startlxde) ]] && sed -i "s/user-session.*/user-session=LXDE/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		# select lxqt session
		[[ -x $(command -v startlxqt) ]] && sed -i "s/user-session.*/user-session=lxqt/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v startlxqt) ]] && sed -i "s/user-session.*/user-session=lxqt/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		# select mate session
		[[ -x $(command -v mate-wm) ]] && sed -i "s/user-session.*/user-session=mate/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v mate-wm) ]] && sed -i "s/user-session.*/user-session=mate/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		# select sway wayland session
		[[ -x $(command -v sway) ]] && sed -i "s/user-session.*/user-session=sway/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v sway) ]] && sed -i "s/user-session.*/user-session=sway/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		# select xmonad session
		[[ -x $(command -v xmonad) ]] && sed -i "s/user-session.*/user-session=xmonad/" /etc/lightdm/lightdm.conf.d/11-armbian.conf
		[[ -x $(command -v xmonad) ]] && sed -i "s/user-session.*/user-session=xmonad/" /etc/lightdm/lightdm.conf.d/22-armbian-autologin.conf

		ln -sf /lib/systemd/system/lightdm.service /etc/systemd/system/display-manager.service

		if [[ -f /var/run/resize2fs-reboot ]]; then
			# Let the user reboot now otherwise start desktop environment
			printf "\n\n\e[0;91mWarning: a reboot is needed to finish resizing the filesystem \x1B[0m \n"
			printf "\e[0;91mPlease reboot the system now \x1B[0m \n\n"
		else
			echo -e "\n\e[1m\e[39mNow starting desktop environment...\x1B[0m\n"
			sleep 1
			service lightdm start 2> /dev/null
			if [ -f /root/.desktop_autologin ]; then
				rm /root/.desktop_autologin
			else
				systemctl -q enable armbian-disable-autologin.timer
				systemctl start armbian-disable-autologin.timer
			fi
			# logout if logged at console
			who -la | grep root | grep -q tty1 && exit 1
		fi

	elif [[ "${desktop_dm}" == "gdm3" ]] && [ -n "$RealName" ]; then
		# 1st run goes without login
		mkdir -p /etc/gdm3
		cat <<- EOF > /etc/gdm3/custom.conf
			[daemon]
			AutomaticLoginEnable = true
			AutomaticLogin = $RealUserName
		EOF

		ln -sf /lib/systemd/system/gdm3.service /etc/systemd/system/display-manager.service

		if [[ -f /var/run/resize2fs-reboot ]]; then
			# Let the user reboot now otherwise start desktop environment
			printf "\n\n\e[0;91mWarning: a reboot is needed to finish resizing the filesystem \x1B[0m \n"
			printf "\e[0;91mPlease reboot the system now \x1B[0m \n\n"
		else
			echo -e "\n\e[1m\e[39mNow starting desktop environment...\x1B[0m\n"
			sleep 1
			service gdm3 start 2> /dev/null
			if [ -f /root/.desktop_autologin ]; then
				rm /root/.desktop_autologin
			else
				(
					sleep 20
					sed -i "s/AutomaticLoginEnable.*/AutomaticLoginEnable = false/" /etc/gdm3/custom.conf
				) &
			fi
			# logout if logged at console
			who -la | grep root | grep -q tty1 && exit 1
		fi
	elif [[ "${desktop_dm}" == "sddm" ]] && [ -n "$RealName" ]; then

		# create default sddm config
		mkdir -p /etc/sddm.conf.d
		cat <<- EOF > /etc/sddm.conf.d/armbian.conf
			[Theme]
			Current=breeze
			[General]
			InputMethod=none
		EOF

		# 1st run goes without login
		cat <<- EOF > /etc/sddm.conf.d/autologin.conf
			[Autologin]
			User=$RealUserName
		EOF
		echo -e "\n\e[1m\e[39mNow starting desktop environment via ${desktop_dm}...\x1B[0m\n"
		systemctl enable --now sddm 2> /dev/null

		if [ -f /root/.desktop_autologin ]; then
				rm /root/.desktop_autologin
		else
			systemctl -q enable armbian-disable-autologin.timer
		fi
		# logout if logged at console
		who -la | grep root | grep -q tty1 && exit 1

	else
		# no display manager detected
		# Display reboot recommendation if necessary
		if [[ -f /var/run/resize2fs-reboot ]]; then
			printf "\n\n\e[0;91mWarning: a reboot is needed to finish resizing the filesystem \x1B[0m \n"
			printf "\e[0;91mPlease reboot the system now \x1B[0m \n\n"
		fi
	fi
fi
