#!/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 exec_copy_to_initd(){ # Функция создания симлинка в /etc/init.d на сервисы из /etc/rc.d/init.d PATH_INITD="${ROOTFS}/etc/init.d" PATH_RCD_INITD="${ROOTFS}/etc/rc.d/init.d" while read -u3 SELECT_FILE_SERVICE; do [[ -e ${PATH_INITD}/${SELECT_FILE_SERVICE} ]] || ln -s ${PATH_RCD_INITD}/${SELECT_FILE_SERVICE} ${PATH_INITD} done 3< <(ls -1 ${PATH_RCD_INITD} 2>/dev/null | grep -vE "README|functions") } exec_services_enabledisable(){ # Функция включения/отключения сервисов в предзагрузке SERVICES_ENABLE= # $1 Команды set или remove с режимом, варианты: set=|set+=|set++=|set-=|set--=|remove # $2 Параметр со значением, пример: SERVICES_ENABLE=pcscd.service,nmb,smb # null Если отсутствует $@, то применяем из системной конфигурации SERVICESSTART SERVICESNOSTART SERVICESMASK SERVICESUNMASK ISSYSTEMD=$(readlink -fq ${ROOTFS}/usr/bin/init | grep "lib/systemd/systemd$") [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && shift local PARAM="$@" if [[ -n ${PARAM} ]]; then unset SERVICESSTART SERVICESNOSTART SERVICESMASK SERVICESUNMASK unset SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK SERVICES_UNMASK eval "${PARAM%%=*}=\${PARAM#*=}" else SERVICESSTART_KERNEL=$(cmdline_value servicesstart) SERVICES_ENABLE_KERNEL=$(cmdline_value services_enable) [[ -z ${SERVICESSTART_KERNEL} ]] || SERVICESSTART=${SERVICESSTART_KERNEL} [[ -z ${SERVICES_ENABLE_KERNEL} ]] || SERVICES_ENABLE=${SERVICES_ENABLE_KERNEL} SERVICESNOSTART_KERNEL=$(cmdline_value servicesnostart) SERVICES_DISABLE_KERNEL=$(cmdline_value services_disable) [[ -z ${SERVICESNOSTART_KERNEL} ]] || SERVICESNOSTART=${SERVICESNOSTART_KERNEL} [[ -z ${SERVICES_DISABLE_KERNEL} ]] || SERVICES_DISABLE=${SERVICES_DISABLE_KERNEL} fi if [[ -n "${SERVICESSTART}${SERVICESNOSTART}${SERVICESMASK}${SERVICESUNMASK}${SERVICES_ENABLE}${SERVICES_DISABLE}${SERVICES_MASK}${SERVICES_UNMASK}" ]]; then if [[ -n ${ROOTFS} ]]; then mkdir -p proc mount -o rbind /proc proc fi while IFS= read -ru3 SELECT_SERVICE; do [[ -n ${SELECT_SERVICE} ]] || continue if [[ -n ${ISSYSTEMD} ]]; then ${CMD_CHROOT} /usr/bin/systemctl --quiet unmask ${SELECT_SERVICE} fi done 3< <(tr ',; ' '\n' <<< "${SERVICESUNMASK},${SERVICESSTART},${SERVICES_UNMASK},${SERVICES_ENABLE}" | tr -s '\n') while IFS= read -ru3 SELECT_SERVICE; do [[ -n ${SELECT_SERVICE} ]] || continue if [[ -n ${ISSYSTEMD} ]]; then ${CMD_CHROOT} /usr/bin/systemctl --quiet enable ${SELECT_SERVICE} fi done 3< <(tr ',; ' '\n' <<< "${SERVICESSTART},${SERVICES_ENABLE}" | tr -s '\n') while IFS= read -ru3 SELECT_SERVICE; do [[ -n ${SELECT_SERVICE} ]] || continue if [[ -n ${ISSYSTEMD} ]]; then ${CMD_CHROOT} /usr/bin/systemctl --quiet disable ${SELECT_SERVICE} fi done 3< <(tr ',; ' '\n' <<< "${SERVICESNOSTART},${SERVICES_DISABLE}" | tr -s '\n') while IFS= read -ru3 SELECT_SERVICE; do [[ -n ${SELECT_SERVICE} ]] || continue if [[ -n ${ISSYSTEMD} ]]; then ${CMD_CHROOT} /usr/bin/systemctl --quiet disable ${SELECT_SERVICE} ${CMD_CHROOT} /usr/bin/systemctl --quiet mask ${SELECT_SERVICE} fi done 3< <(tr ',; ' '\n' <<< "${SERVICESMASK},${SERVICES_MASK}" | tr -s '\n') [[ -n ${ROOTFS} ]] && umount proc fi } exec_services_startstop_live(){ # Функция запуска/остановка сервисов в загруженной системе SERVICES_ENABLE= # $1 Команды set или remove с режимом, варианты: set=|set+=|set++=|set-=|set--=|remove # $2 Параметр со значением. Пример: SERVICES_ENABLE=pcscd.service,nmb,smb # null Если отсутствует $@, то применяем из системной конфигурации SERVICESSTART SERVICESNOSTART SERVICESMASK SERVICESUNMASK SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK SERVICES_UNMASK # Если выполнение в initrd, то выход [[ -z ${ROOTFS} ]] || return 0 ISSYSTEMD=$(readlink -fq ${ROOTFS}/usr/bin/init | grep "lib/systemd/systemd$") [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift [[ -n ${COMMAND} ]] || COMMAND="set=" local PARAM="$@" if [[ -n ${PARAM} ]]; then unset SERVICESSTART SERVICESNOSTART SERVICESMASK SERVICESUNMASK unset SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK SERVICES_UNMASK [[ ${PARAM%%=*} =~ [!\$%\&()*+,./:\;\<\=\>?\@\^\{|\}~-] ]] || eval "${PARAM%%=*}=\${PARAM#*=}" fi while IFS= read -ru3 SELECT_SERVICE; do [[ -n ${SELECT_SERVICE} ]] || continue if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]]; then if [[ -n ${ISSYSTEMD} ]]; then systemctl --quiet start ${SELECT_SERVICE} fi elif [[ ${COMMAND} == @("set-="|"set--=") ]]; then if [[ -n ${ISSYSTEMD} ]]; then systemctl --quiet stop ${SELECT_SERVICE} fi fi done 3< <(tr ',; ' '\n' <<< "${SERVICESSTART},${SERVICES_ENABLE}" | tr -s '\n') while IFS= read -ru3 SELECT_SERVICE; do [[ -n ${SELECT_SERVICE} ]] || continue if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]]; then if [[ -n ${ISSYSTEMD} ]]; then systemctl --quiet stop ${SELECT_SERVICE} fi fi done 3< <(tr ',; ' '\n' <<< "${SERVICESNOSTART},${SERVICESMASK},${SERVICES_DISABLE},${SERVICES_MASK}" | tr -s '\n') } #Выключил, т.к. не перезапишет параметры по умолчанию # т.к. проблематично проигнорировать все SERVICE[*] из /usr/lib/default, если заданы SERVICE[*] в глобальном конфиге #exec_services_enabledisable_new(){ ## Функция включения/отключения сервисов в предзагрузке SERVICE[*]= ## $1 Команды set или remove с режимом, варианты: set=|set+=|set++=|set-=|set--=|remove ## $2 Параметр со значением, пример: SERVICE[smb]=enable ## null Если отсутствует $@, то применяем из системной конфигурации SERVICE[]=start|enable|on|stop|disable|off|mask|unmask # ISSYSTEMD=$(readlink -fq ${ROOTFS}/usr/bin/init | grep "lib/systemd/systemd$") # [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && shift # local PARAM="$@" # if [[ -n ${PARAM} ]]; then # unset SERVICE # declare -A SERVICE # eval "${PARAM%%=*}=\${PARAM#*=}" # else # SERVICES_ENABLE_KERNEL=$(cmdline_value services_enable) # [[ -z ${SERVICES_ENABLE_KERNEL} ]] || while read -u3 SELECT_SERVICE; do # [[ -n ${SELECT_SERVICE} ]] || continue # SERVICE[${SELECT_SERVICE}]=enable # done 3< <(tr ',; ' '\n' <<< "${SERVICES_ENABLE_KERNEL}" | tr -s '\n') # # SERVICES_DISABLE_KERNEL=$(cmdline_value services_disable) # [[ -z ${SERVICES_DISABLE_KERNEL} ]] || while read -u3 SELECT_SERVICE; do # [[ -n ${SELECT_SERVICE} ]] || continue # SERVICE[${SELECT_SERVICE}]=disable # done 3< <(tr ',; ' '\n' <<< "${SERVICES_DISABLE_KERNEL}" | tr -s '\n') # fi # if [[ -n "${SERVICE[@]}" ]]; then # if [[ -n ${ROOTFS} ]]; then # mkdir -p proc # mount -o rbind /proc proc # fi # while read -u3 SELECT_SERVICE; do # [[ -n ${SELECT_SERVICE} ]] || continue # if [[ ${SERVICE[${SELECT_SERVICE}]} == @(start|enable|on) ]]; then # if [[ -n ${ISSYSTEMD} ]]; then # echo ${CMD_CHROOT} /usr/bin/systemctl --quiet unmask ${SELECT_SERVICE} # echo ${CMD_CHROOT} /usr/bin/systemctl --quiet enable ${SELECT_SERVICE} # fi # elif [[ ${SERVICE[${SELECT_SERVICE}]} == @(stop|disable|off) ]]; then # if [[ -n ${ISSYSTEMD} ]]; then # echo ${CMD_CHROOT} /usr/bin/systemctl --quiet disable ${SELECT_SERVICE} # fi # elif [[ ${SERVICE[${SELECT_SERVICE}]} == @(mask) ]]; then # if [[ -n ${ISSYSTEMD} ]]; then # echo ${CMD_CHROOT} /usr/bin/systemctl --quiet disable ${SELECT_SERVICE} # echo ${CMD_CHROOT} /usr/bin/systemctl --quiet mask ${SELECT_SERVICE} # fi # elif [[ ${SERVICE[${SELECT_SERVICE}]} == @(unmask) ]]; then # if [[ -n ${ISSYSTEMD} ]]; then # echo ${CMD_CHROOT} /usr/bin/systemctl --quiet unmask ${SELECT_SERVICE} # fi # fi # done 3< <(printf "%s\n" "${!SERVICE[@]}") # [[ -n ${ROOTFS} ]] && umount proc # fi #} #Выключил, т.к. не перезапишет параметры по умолчанию # т.к. проблематично проигнорировать все SERVICE[*] из /usr/lib/default, если заданы SERVICE[*] в глобальном конфиге #exec_services_startstop_live_new(){ ## Функция запуска/остановка сервисов в загруженной системе SERVICE[*]= ## $1 Команды set или remove с режимом, варианты: set=|set+=|set++=|set-=|set--=|remove ## $2 Параметр со значением, пример: SERVICE[smb]=enable ## null Если отсутствует $@, то применяем из системной конфигурации SERVICE[*]=start|enable|on|stop|disable|off|mask|unmask ## Если выполнение в initrd, то выход # [[ -z ${ROOTFS} ]] || return 0 # ISSYSTEMD=$(readlink -fq ${ROOTFS}/usr/bin/init | grep "lib/systemd/systemd$") # [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && shift # local PARAM="$@" # if [[ -n ${PARAM} ]]; then # local SERVICE= # declare -A SERVICE # [[ ${PARAM%%=*} =~ [!\$%\&()*+,/\;\<\=\>?\^\{|\}~-] ]] || eval "${PARAM%%=*}=\${PARAM#*=}" # fi # while read -u3 SELECT_SERVICE; do # if [[ ${SERVICE[${SELECT_SERVICE}]} == @(start|enable|on) ]]; then # if [[ -n ${ISSYSTEMD} ]]; then # echo ${CMD_CHROOT} /usr/bin/systemctl --quiet start ${SELECT_SERVICE} # fi # elif [[ ${SERVICE[${SELECT_SERVICE}]} == @(stop|disable|off) ]]; then # if [[ -n ${ISSYSTEMD} ]]; then # echo ${CMD_CHROOT} /usr/bin/systemctl --quiet stop ${SELECT_SERVICE} # fi # fi # done 3< <(printf "%s\n" "${!SERVICE[@]}") #} ################ ##### 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