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

71 lines
3.5 KiB

#!/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|^GROUPADD' > /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|^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)