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.d/10-system

153 lines
8.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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
[[ -d /usr/lib/ublinux ]] && { unset ROOTFS; unset CMD_CHROOT; } || { ROOTFS="/sysroot"; 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}"
SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/system; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/hardware; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/clock; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
exec_linklivedata(){
#PATHLIVEDATA=$(find /memory/layer-base/*/* -maxdepth 0 -type f -iname "ublinux-data*.sgn" -exec dirname {} \;)
PATHLIVEDATA=$(find /memory/data/from/*/* -maxdepth 0 -type d -iname "ublinux-data" -exec dirname {} \;)
[[ -d ${PATHLIVEDATA} ]] && [[ ! -e ${ROOTFS}/mnt/livedata ]] && ln -sf ${PATHLIVEDATA} ${ROOTFS}/mnt/livedata
}
exec_ntfsmount(){
ps | grep ntfsmount | awk '{ print $1 }' >> ${ROOTFS}/var/run/sendsigs.omit
}
exec_timezone(){
#Setting up local time zone
[[ -f ${ROOTFS}/usr/share/zoneinfo/${ZONE} ]] && ln -sf "/usr/share/zoneinfo/${ZONE}" ${ROOTFS}/etc/localtime
}
exec_machineid(){
#Setting machine-id
[[ -z ${MACHINEID} && ! -f ${ROOTFS}/etc/machine-id ]] && MACHINEID=hardware
if [[ ${MACHINEID,,} == @(random|rnd) ]]; then
MACHINEID=$(dd if=/dev/urandom count=1 bs=512 2>/dev/null | cat - /sys/class/net/*/address 2>/dev/null | md5sum | cut -d' ' -f1)
elif [[ ${MACHINEID,,} == @(hardware|hw) ]]; then
MACHINEID=$(lspci -nmm 2>/dev/null | grep ^00 | cat - /sys/class/net/*/address 2>/dev/null | md5sum | cut -d' ' -f1)
fi
[[ -z "${MACHINEID}" ]] || echo "${MACHINEID}" > ${ROOTFS}/etc/machine-id
}
exec_udevrules(){
#Setting UDEV
FILE_UDEV_99="/usr/lib/ublinux/udev/99-hide-partition-ubconfig.rules"
FILE_UDEV_70="/usr/lib/ublinux/udev/70-setup-prn-ubconfig.rules"
mkdir -p ${ROOTFS}/etc/udev/rules.d
ln -sf ${FILE_UDEV_99} ${ROOTFS}/etc/udev/rules.d/
if [[ ${PRINTERADD} = "auto" ]] ;then
ln -sf ${FILE_UDEV_70} ${ROOTFS}/etc/udev/rules.d/
else
rm -f "${ROOTFS}/etc/udev/rules.d/${FILE_UDEV_70##*/}"
fi
}
exec_statemode(){
## Setting state mode
STATE_MODE=$(cmdline_value ub.mode)
STATE_HOME=$(cmdline_value ub.home)
## Полное сохранение ub.mode=changes
if [[ ${STATE_MODE} =~ ^"changes"$ ]]; then
sed -e '$a\SYSTEMBOOT_STATEMODE=changes' -e '/SYSTEMBOOT_STATEMODE=.*/d' -i ${SYSCONF}/config
#sed "s/SYSTEMBOOT_STATEMODE=.*/SYSTEMBOOT_STATEMODE=changes/" -i ${SYSCONF}/config
## Сохранение в модуль ub.mode=toxzm ub.mode=machines
elif [[ ${STATE_MODE} =~ ^("toxzm"|"machines")$ ]]; then
sed -e '$a\SYSTEMBOOT_STATEMODE=module' -e '/SYSTEMBOOT_STATEMODE=.*/d' -i ${SYSCONF}/config
#echo "SYSTEMBOOT_STATEMODE=module" >> ${SYSCONF}/config
## Полная песочница RAM ub.mode= ; ub.home=
elif [[ ${STATE_MODE} == "" && ${STATE_HOME} == "" ]]; then
sed -e '$a\SYSTEMBOOT_STATEMODE=sandbox' -e '/SYSTEMBOOT_STATEMODE=.*/d' -i ${SYSCONF}/config
#echo "SYSTEMBOOT_STATEMODE=sandbox" >> ${SYSCONF}/config
## Песочница с сохранением профиля пользователя ub.mode= ; ub.home=/ublinux-data/homes
elif [[ ${STATE_MODE} == "" && ${STATE_HOME} =~ ^"/" ]]; then
sed -e '$a\SYSTEMBOOT_STATEMODE=sandbox_ram_home' -e '/SYSTEMBOOT_STATEMODE=.*/d' -i ${SYSCONF}/config
#echo "SYSTEMBOOT_STATEMODE=sandbox_ram_home" >> ${SYSCONF}/config
## Полная песочница HDD ub.mode=clear ; ub.home=
elif [[ ${STATE_MODE} == "clear" && ${STATE_HOME} == "" ]]; then
sed -e '$a\SYSTEMBOOT_STATEMODE=sandbox_hdd' -e '/SYSTEMBOOT_STATEMODE=.*/d' -i ${SYSCONF}/config
#echo "SYSTEMBOOT_STATEMODE=sandbox_hdd" >> ${SYSCONF}/config
## Полная песочница HDD с сохранением профиля пользователя ub.mode=clear ; ub.home=
elif [[ ${STATE_MODE} == "clear" && ${STATE_HOME} =~ ^"/" ]]; then
sed -e '$a\SYSTEMBOOT_STATEMODE=sandbox_hdd_home' -e '/SYSTEMBOOT_STATEMODE=.*/d' -i ${SYSCONF}/config
#echo "SYSTEMBOOT_STATEMODE=sandbox_hdd_home" >> ${SYSCONF}/config
fi
}
exec_enviroment(){
## Установить переменные окружения глобальные и пользовательские
## ENVIROMENT[system:<var>]=<value>
## ENVIROMENT[profile:<var>]=<value>
## ENVIROMENT[<user>:<var>]=<value>
## system:<--># Установить глобальные переменные окружения systemd в /run/environment.d/99-ubconfig.conf
## profile:<-># Установить переменные окружения только для оболочек входа совместимые Bourne shell в /etc/profile.d/99-ubconfig.conf
## <user>:<--># Имя пользователя для которого будет установлена переменная окружения systemd в домашнем каталоге пользователя ~/.config/environment.d/99-ubconfig.conf
## <var><----># Имя переменной
## <value><--># Значение переменной <var>
FILE_SYSTEMD_ENV="/etc/environment.d/ubconfig-etc-10-system.conf"
FILE_PROFILE_SH_ENV="/etc/profile.d/ubconfig-10-system.sh"
FILE_PROFILE_CSH_ENV="/etc/profile.d/ubconfig-10-system.csh"
FILE_SYSTEMD_USER_ENV=".config/environment.d/ubconfig-user-10-system.conf"
[[ -f ${ROOTFS}/${FILE_SYSTEM_ENV} ]] && rm -f ${ROOTFS}/${FILE_SYSTEM_ENV} 2>/dev/null
[[ -f ${ROOTFS}/${FILE_PROFILE_SH_ENV} ]] && rm -f ${ROOTFS}/${FILE_PROFILE_SH_ENV} 2>/dev/null
[[ -f ${ROOTFS}/${FILE_PROFILE_CSH_ENV} ]] && rm -f ${ROOTFS}/${FILE_PROFILE_CSH_ENV} 2>/dev/null
rm -f ${ROOTFS}/home/*/${FILE_SYSTEMD_USER_ENV} 2>/dev/null
if [[ -n ${ENVIROMENT[@]} ]]; then
for SELECT in "${!ENVIROMENT[@]}"; do
IFS=: read -r TYPE VARIABLE OTHER <<< ${SELECT}
VALUE=${ENVIROMENT[${SELECT}]}
if [[ ${TYPE} == "system" ]]; then
[[ -f ${ROOTFS}/${FILE_SYSTEMD_ENV} ]] || { [[ -d ${ROOTFS}/${FILE_SYSTEMD_ENV%/*} ]] || install -dm0755 ${ROOTFS}/${FILE_SYSTEMD_ENV%/*}; }
echo "${VARIABLE}=\"${VALUE}\"" >> ${ROOTFS}/${FILE_SYSTEMD_ENV}
elif [[ ${TYPE} == "profile" ]]; then
[[ -f ${ROOTFS}/${FILE_PROFILE_SH_ENV} ]] || { [[ -d ${ROOTFS}/${FILE_PROFILE_SH_ENV%/*} ]] || install -dm0755 ${ROOTFS}/${FILE_PROFILE_SH_ENV%/*}; }
[[ -f ${ROOTFS}/${FILE_PROFILE_CSH_ENV} ]] || { [[ -d ${ROOTFS}/${FILE_PROFILE_CSH_ENV%/*} ]] || install -dm0755 ${ROOTFS}/${FILE_PROFILE_CSH_ENV%/*}; }
echo "export ${VARIABLE}=\"${VALUE}\"" >> ${ROOTFS}/${FILE_PROFILE_SH_ENV}
echo "setenv ${VARIABLE} \"${VALUE}\"" >> ${ROOTFS}/${FILE_PROFILE_CSH_ENV}
else
if [[ -d ${ROOTFS}/home/${TYPE} ]]; then
if [[ ! -f ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV} ]]; then
local -a GET_STATS_USER=($(stat -c '%u %g' ${ROOTFS}/home/${TYPE} 2>/dev/null))
[[ ! -d ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV%/*} ]] && [[ -n ${GET_STATS_USER[@]} ]] && install -dm700 -o ${GET_STATS_USER[0]} -g ${GET_STATS_USER[1]} ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV%/*}
touch ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV}
chmod 600 ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV}
chown ${GET_STATS_USER[0]}:${GET_STATS_USER[1]} ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV}
fi
echo "${VARIABLE}=\"${VALUE}\"" >> ${ROOTFS}/home/${TYPE}/${FILE_SYSTEMD_USER_ENV}
fi
fi
done
fi
}
################
##### MAIN #####
################
# Если файл подключен как ресурс с функциями, то выйти
return 0 2>/dev/null && return 0
if [[ -z $@ ]]; then
while read -r FUNCTION; do
$"${FUNCTION##* }"
done < <(declare -F | grep "declare -f exec_")
else
FUNCTION=
while [[ $# -gt 0 ]]; do
[[ -z ${1} ]] || { declare -f ${1} &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'"; }
shift
done
eval ${FUNCTION#*; }
fi