You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ublinux-init/ublinux/rc.preinit/01-inifile

80 lines
4.2 KiB

#!/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}
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}"
if [[ ${FILE_CONFIG##*/} == "users" && ${NAME_VAR} =~ ^("DEFAULTPASSWD"|"DEFAULTROOTPASSWD"|"NEEDEDUSERS"|"USERADD["|"GROUPADD[") ]]; then
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
else
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}")