#!/usr/bin/env bash
#
# Initial script for Live operating system
# This script are launching before starting init from linux-live 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

unset ROOTFS; [[ -d /usr/lib/ublinux ]] || ROOTFS=.
SOURCE=${ROOTFS}/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
SOURCE=${ROOTFS}/usr/lib/ublinux/os-config; [[ -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 /tmp -maxdepth 1 -iname "*.ini.gz")
    [[ -f ${INIGZFILE} ]] || echo "Config file '*.ini.gz' not found!"

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

## Парсим файл ublinux.ini.gz и создаём конфигурацию системы в ${SYSCONF}
    FILE_CONFIG="${SYSCONF}/config"
    touch ${FILE_CONFIG}
    zcat ${INIGZFILE} | grep -E '^DEFAULTPASSWD|^DEFAULTROOTPASSWD|^NEEDEDUSERS|^USERADD' > /tmp/.ublinux_accounts_credential
    while read LINE; do
	if [[ ${LINE} =~ ^\[.*\] ]]; then
    	    FILE_CONFIG=$(tr '[]' '|' <<< "${LINE}" | cut -d'|' -f2)
    	    FILE_CONFIG_MOD=$(tr '[]' '|' <<< "${LINE}" | cut -d'|' -f3 | tr -d ' ')
    	    PATH_FILE_CONFIG=${FILE_CONFIG%/*}
	    # Если указан файл без пути, то добавить путь по умолчанию  ${SYSCONF}
    	    [[ ${PATH_FILE_CONFIG} =~ "/" ]] && FILE_CONFIG="${ROOTFS}${FILE_CONFIG}" || FILE_CONFIG="${SYSCONF}/${FILE_CONFIG}"
    	    if [[ -n ${FILE_CONFIG_MOD} ]]; then
        	mkdir -p "${PATH_FILE_CONFIG}"
        	[[ -e ${FILE_CONFIG} ]] || touch "${FILE_CONFIG}"
        	chmod "${FILE_CONFIG_MOD}" "${FILE_CONFIG}"
    	    fi
	elif [[ ${LINE} =~ ^\- ]]; then
    	    LINE_NEW=$(sed 's/^-//' <<< "${LINE}")
    	    ESC_LINE_NEW=$(sed 's/[^a-zA-Z0-9,._@%-]/\\&/g' <<< "${LINE_NEW}")
    	    sed -E "/^${ESC_LINE_NEW}$/d" -i "${FILE_CONFIG}"
	elif [[ ${LINE} =~ ^\| ]]; then
	     sed 's/^|//' <<< "${LINE}" >> "${FILE_CONFIG}"
	elif [[ ${LINE} =~ ^\+ ]]; then
    	    LINE_NEW=$(sed 's/^+//' <<< "${LINE}")
    	    ESC_LINE_NEW=$(sed 's/[^a-zA-Z0-9,._@%-]/\\&/g' <<< "${LINE_NEW}")
    	    grep -Eq "${ESC_LINE_NEW}" "${FILE_CONFIG}" || echo "${LINE_NEW}" >> "${FILE_CONFIG}"
	else
    	    NAME_VAR=$(cut -d= -f1 <<< "${LINE}")
    	    [[ -z ${NAME_VAR} ]] && continue
    	    ESC_NAME_VAR=$(sed 's/[^a-zA-Z0-9,._@%-]/\\&/g' <<< "${NAME_VAR}")
    	    [[ -f ${FILE_CONFIG} ]] \
    		&& grep -Eq "^\s*${ESC_NAME_VAR}=" "${FILE_CONFIG}" 2>/dev/null \
    		&& sed -E "/^\s*${ESC_NAME_VAR}=/d" -i "${FILE_CONFIG}"
    	    echo "${LINE}" >> "${FILE_CONFIG}"
	fi
    done < <(zcat ${INIGZFILE} | grep -Ev '^DEFAULTPASSWD|^DEFAULTROOTPASSWD|^NEEDEDUSERS|^USERADD|^\s*#|^\s*$')

## Декларируем ассоциативный массив, если присутствуют соответствующие переменные
    while read FILE_CONFIG; do
	grep -q "^declare -A" "${FILE_CONFIG}" 2>/dev/null && sed "/^declare -A/d" -i "${FILE_CONFIG}"
	DECLARE_A=$(grep -E "^[A-z0-9_]*\[.*\]=.*" "${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)
