#!/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}"

    INIGZFILE=$(find /memory -maxdepth 1 -iname "*.ini.gz")
    [[ -f ${INIGZFILE} ]] || INIGZFILE=$(find ${ROOTFS}/memory -maxdepth 1 -iname "*.ini.gz")
    [[ -f ${INIGZFILE} ]] || INIGZFILE=$(find /tmp -maxdepth 1 -iname "*.ini.gz")
    [[ -f ${INIGZFILE} ]] || { echo "Config file '*.ini.gz' not found!"; return 1; }

    [[ -d ${SYSCONF} ]] || mkdir -p "${SYSCONF}"
    rm -rf ${SYSCONF}/{..?*,.[!.]*,*} 2>/dev/null

## Парсим файл ublinux.ini.gz и создаём конфигурацию системы в ${SYSCONF}
    FILE_CONFIG_DEFAULT="${SYSCONF}/config"
    FILE_CONFIG="${FILE_CONFIG_DEFAULT}"
    [[ -f ${FILE_CONFIG} ]] || install -Dm0644 /dev/null ${FILE_CONFIG}
    FILE_ROOT_USERS="${SYSCONF}/.users_credential"
    [[ -f ${FILE_ROOT_USERS} ]] || install -Dm0600 /dev/null ${FILE_ROOT_USERS}
    while read LINE; do
	if [[ ${LINE} =~ ^'['([^[]*|[^]]*)']'[[:space:]]*([0-9]+|[augo]+[=+-]+[augorstwxX,=+-]*)?[[:space:]]*('['+(.*)']'+)?$ ]]; then
	    FILE_CONFIG=${BASH_REMATCH[1]}
	    FILE_CONFIG_MOD=${BASH_REMATCH[2]}
	    FILE_CONFIG_EXEC=${BASH_REMATCH[4]}
	    # Если указана * то заменить на config
	    [[ ${FILE_CONFIG##*/} == "*" ]] && FILE_CONFIG="${FILE_CONFIG_DEFAULT}"
	    # Если указан файл без пути, то добавить путь по умолчанию  ${SYSCONF}
	    [[ ${FILE_CONFIG} =~ ^"/" ]] && FILE_CONFIG="${ROOTFS}${FILE_CONFIG}" || FILE_CONFIG="${SYSCONF}/${FILE_CONFIG}"
	    if [[ -n ${FILE_CONFIG_MOD} ]]; then
 		[[ -d ${FILE_CONFIG%/*} ]] || install -d "${FILE_CONFIG%/*}"
		[[ -e ${FILE_CONFIG} ]] || touch "${FILE_CONFIG}"
		chmod "${FILE_CONFIG_MOD}" "${FILE_CONFIG}"
	    fi
	elif [[ ${LINE:0:1} == '-' ]]; then
	    [[ -e ${FILE_CONFIG} ]] && sed -E "/^${LINE:1}$/d" -i "${FILE_CONFIG}"
	elif [[ ${LINE:0:1} == '|' ]]; then
	     echo "${LINE:1}" >> "${FILE_CONFIG}"
	elif [[ ${LINE:0:1} == '+' ]]; then
	    [[ $(cat "${FILE_CONFIG}" 2>/dev/null) =~ ($'\n'|^)+"${LINE:1}"($'\n'|$)+ ]] || echo "${LINE:1}" >> "${FILE_CONFIG}"
	else
	    # Если в строке нет '=' то пропустить
	    # Если строка содержит '=' и имя переменной до [] не содержит пробел, то добавляем как переменная=значение: NAME_VAR=VALUE_VAR
	    NAME_VAR=${LINE%%=*}
	    [[ ${LINE} != ${NAME_VAR} ]] || continue
	    [[ ${NAME_VAR%%[*} =~ " " ]] && continue
	    # Удалим строку только с именем NAME_VAR=
	    #[[ -e ${FILE_CONFIG} && $(cat -n ${FILE_CONFIG}) =~ (^|$'\n')+[[:blank:]]*([[:digit:]]+)[[:blank:]]*"${NAME_VAR}="[^$'\n']*($'\n'|$)+ ]] && sed "${BASH_REMATCH[2]}d" -i "${FILE_CONFIG}"
	    # Обработка строк с паролями
	    if [[ ${FILE_CONFIG##*/} == "users" && ${NAME_VAR} =~ ^("DEFAULTPASSWD"|"DEFAULTROOTPASSWD"|"NEEDEDUSERS"|"USERADD["|"GROUPADD[") ]]; then
		[[ -e ${FILE_CONFIG} ]] && sed -E "/^[[:blank:]]*$(ere_quote_sed "${NAME_VAR}")=.*/d" -i "${FILE_CONFIG}"
		[[ -e ${FILE_ROOT_USERS} ]] && sed -E "/^[[:blank:]]*$(ere_quote_sed "${NAME_VAR}")=.*/d" -i "${FILE_ROOT_USERS}"
		echo "${LINE}" >> ${FILE_ROOT_USERS}
		if [[ ${NAME_VAR} == @("DEFAULTPASSWD"|"DEFAULTROOTPASSWD"|"NEEDEDUSERS") ]]; then
		    true
		elif [[ ${LINE} =~ ^("USERADD[".*"]="[\'\"]?)([^:]*:[^:]*:[^:]*:[^:]*:[^:]*:)[^\'\"]*([\'\"]?) ]]; then
		    echo "${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}" >> "${FILE_CONFIG}"
		elif [[ ${LINE} =~ ^("GROUPADD[".*"]="[\'\"]?)([^:]*:[^:]*:[^:]*:[^:]*:)[^\'\"]*([\'\"]?) ]]; then
		    echo "${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}" >> "${FILE_CONFIG}"
		else
		    echo "${LINE}" >> "${FILE_CONFIG}"
		fi
	    elif [[ ! ${FILE_CONFIG%/*} =~ ^"${SYSCONF}" ]]; then
	    # Если файл указанный не конфигурационный из /etc/ublinux/
		VALUE_VAR=${LINE#*=}
		[[ ${VALUE_VAR} =~ ^[\'\"]+.*[\'\"]+ ]] && VALUE_VAR=${VALUE_VAR:1:-1}
		if ! grep -Eq "^[[:blank:]]*$(ere_quote_grep "${NAME_VAR}=${VALUE_VAR}")[[:blank:]]*$" "${FILE_CONFIG}" 2>/dev/null; then
		    if grep -Eq "^[[:blank:]]*$(ere_quote_grep "${NAME_VAR}")=.*$" "${FILE_CONFIG}" 2>/dev/null; then
			sed -E "s/^([[:blank:]]*)($(ere_quote_sed "${NAME_VAR}"))=.*/\1\2=$(ere_quote_sed "${VALUE_VAR}")/g" -i "${FILE_CONFIG}"
		    else
			[[ -e ${FILE_CONFIG} ]] && sed -E "/^[[:blank:]]*$(ere_quote_sed "${NAME_VAR}")=.*/d" -i "${FILE_CONFIG}"
			echo "${LINE}" >> "${FILE_CONFIG}"
		    fi
		fi
	    else
		[[ -e ${FILE_CONFIG} ]] && sed -E "/^[[:blank:]]*$(ere_quote_sed "${NAME_VAR}")=.*/d" -i "${FILE_CONFIG}"
		echo "${LINE}" >> "${FILE_CONFIG}"
	    fi
	fi
    done < <(zcat ${INIGZFILE} | grep -Ev '^\s*#|^\s*$')

## Декларируем ассоциативный массив, если присутствуют соответствующие переменные
    while read FILE_CONFIG; do
        [[ -s ${FILE_CONFIG} ]] || continue
	grep -q "^declare -A" "${FILE_CONFIG}" 2>/dev/null && sed "/^declare -A/d" -i "${FILE_CONFIG}"
	DECLARE_A=$(grep -E "^[[:alnum:]_-]*\[.*\]=.*" "${FILE_CONFIG}" | sed -E "s/\[.*//" | sort -u | tr "\n" " ")
	[[ -z ${DECLARE_A} ]] || sed "1i declare -A ${DECLARE_A}" -i "${FILE_CONFIG}"
    done < <(find ${SYSCONF} -type f -print; echo "${FILE_ROOT_USERS}")
