#!/usr/bin/env bash # # Author: Dmitry Razumov # Copyright (c) 2021-2025 UBLinux # # 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}")