#!/usr/bin/env bash
#
# Author: Dmitry Razumov <asmeron@ublinux.com>
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
#
# Initial script for 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}/system; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/hardware; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/clock; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null

exec_linklivedata(){
    #PATHLIVEDATA=$(find /memory/layer-base/*/* -maxdepth 0 -type f -iname "ublinux-data*.sgn" -exec dirname {} \;)
    PATHLIVEDATA=$(find /memory/data/from/*/* -maxdepth 0 -type d -iname "ublinux-data" -exec dirname {} \;)
    [[ -d ${PATHLIVEDATA} ]] && [[ ! -e ${ROOTFS}/mnt/livedata ]] && ln -sf ${PATHLIVEDATA} ${ROOTFS}/mnt/livedata
}
exec_ntfsmount(){
    ps | grep ntfsmount | awk '{ print $1 }' >> ${ROOTFS}/var/run/sendsigs.omit
}
exec_timezone(){
    #Setting up local time zone
    [[ -f ${ROOTFS}/usr/share/zoneinfo/${ZONE} ]] && ln -sf "/usr/share/zoneinfo/${ZONE}" ${ROOTFS}/etc/localtime
}
exec_machineid(){
    #Setting machine-id
    [[ -z ${MACHINEID} && ! -f ${ROOTFS}/etc/machine-id ]] && MACHINEID=hardware
    if [[ ${MACHINEID,,} == @(random|rnd) ]]; then
	MACHINEID=$(dd if=/dev/urandom count=1 bs=512 2>/dev/null | cat - /sys/class/net/*/address 2>/dev/null | md5sum | cut -d' ' -f1)
    elif [[ ${MACHINEID,,} == @(hardware|hw) ]]; then
	MACHINEID=$(lspci -nmm 2>/dev/null | grep ^00 | cat - /sys/class/net/*/address 2>/dev/null | md5sum | cut -d' ' -f1)
    fi
    [[ -z "${MACHINEID}" ]] || echo "${MACHINEID}" > ${ROOTFS}/etc/machine-id
}
exec_udevrules(){
    #Setting UDEV
    FILE_UDEV_99="/usr/lib/ublinux/udev/99-hide-partition-ubconfig.rules"
    FILE_UDEV_70="/usr/lib/ublinux/udev/70-setup-prn-ubconfig.rules"
    mkdir -p ${ROOTFS}/etc/udev/rules.d
    ln -sf ${FILE_UDEV_99} ${ROOTFS}/etc/udev/rules.d/
    if [[ ${PRINTERADD} = "auto" ]] ;then
	ln -sf ${FILE_UDEV_70} ${ROOTFS}/etc/udev/rules.d/
    else
	rm -f "${ROOTFS}/etc/udev/rules.d/${FILE_UDEV_70##*/}"
    fi
}
exec_environment(){
## Установить переменные окружения глобальные и пользовательские
## ENVIRONMENT[system:<var>]=<value>
## ENVIRONMENT[profile:<var>]=<value>
## ENVIRONMENT[<user>:<var>]=<value>
##   system:<--># Установить глобальные переменные окружения systemd в /run/environment.d/99-ubconfig.conf
##   profile:<-># Установить переменные окружения только для оболочек входа совместимые Bourne shell в /etc/profile.d/99-ubconfig.conf
##   <user>:<--># Имя пользователя для которого будет установлена переменная окружения systemd в домашнем каталоге пользователя ~/.config/environment.d/99-ubconfig.conf
##   <var><----># Имя переменной
##   <value><--># Значение переменной <var>
    FILE_SYSTEMD_ENV="/etc/environment.d/ubconfig-etc-10-system.conf"
    FILE_PROFILE_SH_ENV="/etc/profile.d/ubconfig-10-system.sh"
    FILE_PROFILE_CSH_ENV="/etc/profile.d/ubconfig-10-system.csh"
    FILE_SYSTEMD_USER_ENV=".config/environment.d/ubconfig-user-10-system.conf"
    [[ -f ${ROOTFS}/${FILE_SYSTEM_ENV} ]] && rm -f ${ROOTFS}/${FILE_SYSTEM_ENV} 2>/dev/null
    [[ -f ${ROOTFS}/${FILE_PROFILE_SH_ENV} ]] && rm -f ${ROOTFS}/${FILE_PROFILE_SH_ENV} 2>/dev/null
    [[ -f ${ROOTFS}/${FILE_PROFILE_CSH_ENV} ]] && rm -f ${ROOTFS}/${FILE_PROFILE_CSH_ENV} 2>/dev/null
    rm -f ${ROOTFS}/home/*/${FILE_SYSTEMD_USER_ENV} 2>/dev/null
    if [[ -n ${ENVIRONMENT[@]} ]]; then
	for SELECT in "${!ENVIRONMENT[@]}"; do
	    IFS=: read -r TYPE VARIABLE OTHER <<< ${SELECT}
	    VALUE=${ENVIRONMENT[${SELECT}]}
	    if [[ ${TYPE} == "system" ]]; then
		[[ -f ${ROOTFS}/${FILE_SYSTEMD_ENV} ]] || { [[ -d ${ROOTFS}/${FILE_SYSTEMD_ENV%/*} ]] || install -dm0755 ${ROOTFS}/${FILE_SYSTEMD_ENV%/*}; }
		echo "${VARIABLE}=\"${VALUE}\"" >> ${ROOTFS}/${FILE_SYSTEMD_ENV}
	    elif [[ ${TYPE} == "profile" ]]; then
		[[ -f ${ROOTFS}/${FILE_PROFILE_SH_ENV} ]] || { [[ -d ${ROOTFS}/${FILE_PROFILE_SH_ENV%/*} ]] || install -dm0755 ${ROOTFS}/${FILE_PROFILE_SH_ENV%/*}; }
		[[ -f ${ROOTFS}/${FILE_PROFILE_CSH_ENV} ]] || { [[ -d ${ROOTFS}/${FILE_PROFILE_CSH_ENV%/*} ]] || install -dm0755 ${ROOTFS}/${FILE_PROFILE_CSH_ENV%/*}; }
		echo "export ${VARIABLE}=\"${VALUE}\"" >> ${ROOTFS}/${FILE_PROFILE_SH_ENV}
		echo "setenv ${VARIABLE} \"${VALUE}\"" >> ${ROOTFS}/${FILE_PROFILE_CSH_ENV}
	    else
		if [[ -d ${ROOTFS}/home/${TYPE} ]]; then
		    if [[ ! -f ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV} ]]; then
			local -a GET_STATS_USER=($(stat -c '%u %g' ${ROOTFS}/home/${TYPE} 2>/dev/null))
			[[ ! -d ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV%/*} ]] && [[ -n ${GET_STATS_USER[@]} ]] && install -dm700 -o ${GET_STATS_USER[0]} -g ${GET_STATS_USER[1]} ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV%/*}
			touch ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV}
			chmod 600 ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV}
			chown ${GET_STATS_USER[0]}:${GET_STATS_USER[1]} ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV}
		    fi
		    echo "${VARIABLE}=\"${VALUE}\"" >> ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV}
		fi
	    fi
	done
    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
