#!/usr/bin/env bash
#
# Author: Dmitry Razumov <asmeron@ublinux.com>
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
#
# Initial script for Linux UBLinux
# This script are launching before starting init from initrd script
# Current dir allways must be set to root (/)
# All system path must be relative, except initrd dirs

ENABLED=yes
[[ ${ENABLED} == "yes" ]] || exit 0
DEBUGMODE=no

PATH=.:/:/usr/bin:/usr/local/bin:/usr/local/sbin

[[ -d /usr/lib/ublinux ]] && { ROOTFS= ; CMD_CHROOT= ; } || { [[ -d /sysroot ]] && ROOTFS="/sysroot" || ROOTFS="."; CMD_CHROOT="chroot ${ROOTFS}"; }
SOURCE=${ROOTFS}/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
SOURCE=${ROOTFS}/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
debug_mode "$0" "$@"

SYSCONF="${ROOTFS}${SYSCONF}"
SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/desktop; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null

## Сервер XDMCP Lightdm
## LIGHTDM_XDMCP=yes|no|enable|disable
##   yes|enable         # Включить XDMCP с параметрами по умолчанию
##   no|disable         # Выключить XDMCP
## LIGHTDM_XDMCP[<parametr>]=<value>
##   <parametr>         # Название параметра, примеры в /etc/lightdm/lightdm.conf
##     port             # Порт подключения UDP/IP. По умолчанию: 177
##     address          # Адрес хоста соединения XDMCP. По умолчанию: все адреса
##     key              # Ключ аутентификации, используемый для XDM-AUTHENTICATION-1, или пустой, чтобы не использовать аутентификацию (хранится в файлеkeys.conf)
##     hostname         # Имя хоста для отправки отчета клиентам XDMCP. По умолчанию: системное имя хоста
##   <value>            # Значение параметра
#LIGHTDM_XDMCP=enable
exec_lightdm_xdmcp(){
    [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift
    [[ -n ${COMMAND} ]] || COMMAND="set="
    local PARAM="$@"
    if [[ -n ${PARAM} ]]; then
	local LIGHTDM_XDMCP=
	declare -A LIGHTDM_XDMCP=()
	[[ ${PARAM} =~ ^[[:alnum:]_]+("="|"[".*"]=") ]] && eval "${PARAM%%=*}=\${PARAM#*=}"
    fi
    FILE_LIGHTDM_CONF="${ROOTFS}/etc/lightdm/lightdm.conf"
    FILE_LIGHTDM_XDMCP_CONF="${ROOTFS}/etc/lightdm/lightdm.conf.d/99-xdmcp-ubconfig.conf"
    if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#LIGHTDM_XDMCP[@]} -ne 0 ]]; then
	if [[ ${LIGHTDM_XDMCP} == @("enable"|"yes") ]]; then
	    [[ -d ${ROOTFS}/etc/lightdm/${FILE_LIGHTDM_XDMCP_CONF%/*} ]] || mkdir -p ${FILE_LIGHTDM_XDMCP_CONF%/*}
	    cat <<-EOF | sed 's/^\s*\t*//' > "${FILE_LIGHTDM_XDMCP_CONF}"
	    [XDMCPServer]
	    enabled=true
EOF
	    for LIGHTDM_PARAM in "${!LIGHTDM_XDMCP[@]}"; do
		[[ ${LIGHTDM_PARAM} == 0 ]] && continue
		echo "${LIGHTDM_PARAM}=${LIGHTDM_XDMCP[${LIGHTDM_PARAM}]}" >> "${FILE_LIGHTDM_XDMCP_CONF}"
	    done
	else
	    rm -f "${FILE_LIGHTDM_XDMCP_CONF}"
	fi
    elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then
	rm -f "${FILE_LIGHTDM_XDMCP_CONF}"
    fi
}

## Настройка гритера для менеджера диспелея Lightdm
## По умолчанию если не выбрано, то любой доступный, обычно 'lightdm-gtk-greeter'
## LIGHTDM_GREETER[<parametr>]=<value>
##   <parametr>                 # Название параметра, примеры в /etc/lightdm/lightdm.conf
##     greeter-session          # Название установленного гритера в каталоге /usr/share/xgreeters/*.desktop
##       =lightdm-gtk-greeter   # LightDM GTK+ гритер
##       =io.elementary.greeter # Pantheon гритер
##     greeter-hide-users       # Скрыть список пользователей, значения (true|false)
##     greeter-allow-guest      # В списке пользователей показывать Гостя, значения (true|false)
##     greeter-show-manual-login # Разрешить вводить произвольного пользователя, значения (true|false)
##     greeter-show-remote-login # Разрешить выбрать удалённого пользователя, значения (true|false)
##   <value>                    # Значение параметра
#LIGHTDM_GREETER[greeter-session]=io.elementary.greeter
exec_lightdm_greeter(){
    [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift
    [[ -n ${COMMAND} ]] || COMMAND="set="
    local PARAM="$@"
    if [[ -n ${PARAM} ]]; then
	local LIGHTDM_GREETER=
	declare -A LIGHTDM_GREETER=()
        [[ ${PARAM} =~ ^[[:alnum:]_]+("="|"[".*"]=") ]] && eval "${PARAM%%=*}=\${PARAM#*=}"
    fi
    FILE_LIGHTDM_CONF="${ROOTFS}/etc/lightdm/lightdm.conf"
    FILE_LIGHTDM_GREETER_CONF="${ROOTFS}/etc/lightdm/lightdm.conf.d/99-lightdm-greeter-ubconfig.conf"
    if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#LIGHTDM_GREETER[@]} -ne 0 ]]; then
	[[ -d ${ROOTFS}/etc/lightdm/${FILE_LIGHTDM_GREETER_CONF%/*} ]] || mkdir -p ${FILE_LIGHTDM_GREETER_CONF%/*}
	cat <<-EOF | sed 's/^\s*\t*//' > "${FILE_LIGHTDM_GREETER_CONF}"
	[Seat:*]
EOF
	for LIGHTDM_PARAM in "${!LIGHTDM_GREETER[@]}"; do
	    [[ ${LIGHTDM_PARAM} == 0 ]] && continue
	    [[ -z ${PARAM} && ${LIGHTDM_PARAM} == "greeter-session" ]] && { [[ -f ${ROOTFS}/usr/share/xgreeters/${LIGHTDM_GREETER[${LIGHTDM_PARAM}]}.desktop ]] || continue; }
	    if [[ ${LIGHTDM_PARAM} == "greeter-session" ]]; then
		if [[ -n ${PARAM} ]]; then
		# Если с входящим параметром, т.е. вполнение через ubconfig, то перевыполнить подготовку фона
		    ${ROOTFS}/usr/lib/ublinux/rc.post.d/12-dm-background
		else
		# Если без входящего параметра, т.е. вполнение при загрузке, то проверить наличие гритера в системе
		    [[ -f ${ROOTFS}/usr/share/xgreeters/${LIGHTDM_GREETER[${LIGHTDM_PARAM}]}.desktop ]] || continue
		fi
	    fi
	    
	    echo "${LIGHTDM_PARAM}=${LIGHTDM_GREETER[${LIGHTDM_PARAM}]}" >> "${FILE_LIGHTDM_GREETER_CONF}"
	done
    elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then
	rm -f "${FILE_LIGHTDM_GREETER_CONF}"
    fi
}


################
##### MAIN #####
################
    # Если файл подключен как ресурс с функциями, то выйти
    return 0 2>/dev/null && return 0
    if [[ -z $@ ]]; then
        while read -r FUNCTION; do
            $"${FUNCTION##* }"
        done < <(declare -F | grep "declare -f exec_")
    else
	FUNCTION=
	while [[ $# -gt 0 ]]; do
	    [[ -z ${1} ]] || { declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1//\'/}'"; }
	    shift
	done
	eval ${FUNCTION#*; }
    fi
