#!/usr/bin/env bash # # 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 unset ROOTFS CMD_CHROOT; [[ -d /usr/lib/ublinux ]] || { [[ -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="${SYSCONF}/config" [[ -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} zcat ${INIGZFILE} | grep -E '^DEFAULTPASSWD|^DEFAULTROOTPASSWD|^NEEDEDUSERS|^USERADD|^GROUPADD' > ${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]} # Если указан файл без пути, то добавить путь по умолчанию ${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=${LINE%%=*} [[ ${LINE} != ${NAME_VAR} ]] || continue [[ -f ${FILE_CONFIG} && $(cat -n ${FILE_CONFIG}) =~ ($'\n'|^)+[[:blank:]]*([[:digit:]]+)[[:blank:]]*"${NAME_VAR}="[^$'\n']*($'\n'|$)+ ]] && sed "${BASH_REMATCH[2]}d" -i "${FILE_CONFIG}" echo "${LINE}" >> "${FILE_CONFIG}" fi done < <(zcat ${INIGZFILE} | grep -Ev '^DEFAULTPASSWD|^DEFAULTROOTPASSWD|^NEEDEDUSERS|^USERADD|^GROUPADD|^\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; echo "${FILE_ROOT_USERS}")