From a82f742f490bfccf9aabacfed32557657a81f1e7 Mon Sep 17 00:00:00 2001 From: asmeron Date: Thu, 6 Mar 2025 17:01:33 +0600 Subject: [PATCH] Fix USERADD_SYNC GROUPADD_SYNC --- ublinux/functions | 57 +++++++---- ublinux/rc.halt.pre/25-accounts-sync | 93 +++++++++++------ ublinux/rc.local.d/91-cts | 16 ++- .../rc.preinit.d/80-server-containers-storage | 99 ++++++++++++++++++- .../rc.preinit.d/81-server-libvirt-storage | 67 ------------- ublinux/templates/ublinux-data.ini | 44 +++++---- 6 files changed, 235 insertions(+), 141 deletions(-) delete mode 100755 ublinux/rc.preinit.d/81-server-libvirt-storage diff --git a/ublinux/functions b/ublinux/functions index 2b14b85..ba9a2ae 100755 --- a/ublinux/functions +++ b/ublinux/functions @@ -824,6 +824,7 @@ user_remove_group(){ # @systems # Только системные, SYS_MIN_UID и SYS_MAX_UID взять из /etc/login.defs # @all # Все с UID от 0 до 65535 # - # Все пользователи диапазона +# # UID пользователя # # Имя пользователя get_conf_useradd_from_system(){ local SOURCE=${SYSCONF}/users; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null @@ -942,6 +943,7 @@ get_conf_useradd_from_system(){ # @systems # Только системные, SYS_MIN_UID и SYS_MAX_UID взять из /etc/login.defs # @all # Все с UID от 0 до 65535 # - # Все пользователи диапазона +# # UID пользователя # # Имя пользователя get_conf_usershadow_from_system(){ local FILE_PASSWD="${ROOTFS}/etc/passwd" @@ -963,9 +965,9 @@ get_conf_usershadow_from_system(){ [[ -n ${SELECT_EXPIRE} ]] && SELECT_LASTCHANGED=$(date -d @$((${SELECT_EXPIRE}*24*60*60)) +'%Y-%m-%d') if [[ -z ${NOT_ONLY_CHANGES} && -z ${SELECT_MINDAY} && -z ${SELECT_MAXDAY} && -z ${SELECT_WARN} && -z ${SELECT_INACTIVE} && -z ${SELECT_EXPIRE} ]]; then local DATE_STARTUP_SYSTEM=$(date -d "$(cut -f1 -d. /proc/uptime) seconds ago" +'%Y-%m-%d') #" + [[ ${SELECT_LASTCHANGED} == ${DATE_STARTUP_SYSTEM} ]] && return 0 # Дата когда был установлен пакет и впервые добавлены пользователи local DATE_SYSUSERS=$(stat --printf=%y ${ROOTFS}/usr/share/ublinux-sysusers/README | cut -d' ' -f1) - [[ ${SELECT_LASTCHANGED} == ${DATE_STARTUP_SYSTEM} ]] && return 0 # Сравнить дату впервые созданных пользователей с датой установки пакета ublinux-sysusers [[ ${SELECT_LASTCHANGED} == ${DATE_SYSUSERS} ]] && return 0 # # Найти файл 'sysusers' где встречается пользователь и сравнить дату создания файла с датой создания пользователя @@ -1019,6 +1021,7 @@ get_conf_usershadow_from_system(){ # @systems # Только системные, SYS_MIN_GID и SYS_MAX_GID взять из /etc/login.defs # @all # Все c GID от 0 до 65535 # - # Все пользователи диапазона +# # GID группы # # Имя группы get_conf_groupadd_from_system(){ local FILE_GROUP="${ROOTFS}/etc/group" @@ -1046,44 +1049,63 @@ get_conf_groupadd_from_system(){ $(comm --nocheck-order -12 <(cd /usr/lib/sysusers.d/ && ls -v1 *.conf | sed "s/\.conf//g") <(cd /usr/share/ublinux-sysusers/ && ls -v1 *.sysusers | sed "s/\.sysusers//g") | sed 's|^|/usr/share/ublinux-sysusers/|;s|$|.sysusers|') \ $(comm --nocheck-order -23 <(cd /usr/lib/sysusers.d/ && ls -v1 *.conf | sed "s/\.conf//g") <(cd /usr/share/ublinux-sysusers/ && ls -v1 *.sysusers | sed "s/\.sysusers//g") | sed 's|^|/usr/lib/sysusers.d/|;s|$|.conf|') \ ) - local DATA_SYSUSERS_MEMBERS=$(sed -Enr "s/^m (.*) ${SELECT_GROUP}/\1/p" <<< ${DATA_SYSUSERS}) #" - [[ -n ${DATA_SYSUSERS_MEMBERS} ]] && DATA_SYSUSERS_MEMBERS=$(printf "%s\n" ${DATA_SYSUSERS_MEMBERS} | sort -u | xargs | tr " " ",") || unset DATA_SYSUSERS_MEMBERS - [[ ${SELECT_MEMBERS} == ${DATA_SYSUSERS_MEMBERS} ]] && return 0 + # Выбираем пользователей которые входят в выбранную группу из systemd sysusers + local DATA_SYSUSERS_MEMBERS=$(sed -Enr "s/^m[[:blank:]]+(.*)[[:blank:]]+${SELECT_GROUP}/\1/p" <<< ${DATA_SYSUSERS}) #" + local RETURN_DATA_SYSUSERS_MEMBERS + if [[ -n ${DATA_SYSUSERS_MEMBERS} ]]; then + DATA_SYSUSERS_MEMBERS=$(printf "%s\n" ${DATA_SYSUSERS_MEMBERS} | sort -u | xargs | tr " " ",") + SELECT_MEMBERS=$(tr "," $'\n' <<< ${SELECT_MEMBERS} | sort -u | xargs | tr " " ",") + fi + [[ ${SELECT_MEMBERS} == ${DATA_SYSUSERS_MEMBERS} ]] && RETURN_DATA_SYSUSERS_MEMBERS=yes || RETURN_DATA_SYSUSERS_MEMBERS=no + # Выбираем GID группы из systemd sysusers. По явному наличию 'g x2godesktopsharing 500' + local DATA_SYSUSERS_GID=$(sed -Enr "s/^g[[:blank:]]+${SELECT_GROUP}[[:blank:]]+([[:digit:]]+).*/\1/p" <<< ${DATA_SYSUSERS}) #" + # Выбираем GID группы из systemd sysusers. Если нет явного, то GID по UID пользователя + [[ -n ${DATA_SYSUSERS_GID} ]] || DATA_SYSUSERS_GID=$(sed -Enr "s/^u[[:blank:]]+${SELECT_GROUP}[[:blank:]]+([[:digit:]]+).*/\1/p" <<< ${DATA_SYSUSERS}) #" + local RETURN_DATA_SYSUSERS_GID + if [[ -n ${DATA_SYSUSERS_GID} ]]; then + [[ ${SELECT_GID} == ${DATA_SYSUSERS_GID} ]] && RETURN_DATA_SYSUSERS_GID=yes || RETURN_DATA_SYSUSERS_GID=no + fi + # Если в systemd sysusers MEMBERS и GID совпадают с системными, то выход + [[ ${RETURN_DATA_SYSUSERS_MEMBERS} == "yes" && ${RETURN_DATA_SYSUSERS_GID} == "yes" ]] && return 0 + # Если в systemd sysusers MEMBERS совпадает с системным, а GID не указан (динамический), то выход + # Если не показывать такие группы, то пожно ложно не вывести, если вдруг намеренно пользоваель указал GID у динамической группы + # Из за вохможной ошибки, отключаю + #[[ ${RETURN_DATA_SYSUSERS_MEMBERS} == "yes" && -z ${RETURN_DATA_SYSUSERS_GID} ]] && return 0 fi echo "GROUPADD[${SELECT_GROUP}]='${SELECT_MEMBERS}:${SELECT_GID}:${SELECT_OPTIONAL}:${SELECT_ADMINISTRATORS}:${SELECT_PASSWORD}'" } [[ ${1} == "--not-only-changes" ]] && local NOT_ONLY_CHANGES=yes && shift local PARAM_ALL="$@" [[ -n ${PARAM_ALL} ]] || PARAM_ALL="@groups @systems" - while IFS= read -r SELECT_PARAM; do - if [[ ${SELECT_PARAM} == "@groups" ]]; then + while IFS= read -r SELECT_PARAM_ALL; do + if [[ ${SELECT_PARAM_ALL} == "@groups" ]]; then # Все группы кроме системных GID_MIN=$([[ $(< "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*GID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}") GID_MAX=$([[ $(< "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*GID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}") while IFS= read -r SELECT_GROUP; do show_group "${SELECT_GROUP}" done < <(awk -F':' -v GROUP_MIN=${GID_MIN:=1000} -v GROUP_MAX=${GID_MAX:=60000} '$3 >= GROUP_MIN && $3 <= GROUP_MAX && $1 != "nobody" { print $1}' ${FILE_GROUP}) - elif [[ ${SELECT_PARAM} == "@systems" ]]; then + elif [[ ${SELECT_PARAM_ALL} == "@systems" ]]; then # Группы системные GID_MIN=$([[ $(< "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_GID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}") GID_MAX=$([[ $(< "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_GID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}") while IFS= read -r SELECT_GROUP; do show_group "${SELECT_GROUP}" done < <(awk -F':' -v GROUP_MIN=${GID_MIN:=500} -v GROUP_MAX=${GID_MAX:=999} '$3 >= GROUP_MIN && $3 <= GROUP_MAX && $1 != "nobody" { print $1}' ${FILE_GROUP}) - elif [[ ${SELECT_PARAM} == "@all" ]]; then + elif [[ ${SELECT_PARAM_ALL} == "@all" ]]; then # Все группы while IFS= read -ru4 SELECT_GROUP; do show_group "${SELECT_GROUP}" done 4< <(awk -F':' '$1 != "nobody" { print $1}' ${FILE_GROUP}) - elif [[ ${SELECT_PARAM} =~ ^([[:digit:]]+)'-'*([[:digit:]]*)$ ]]; then + elif [[ ${SELECT_PARAM_ALL} =~ ^([[:digit:]]+)'-'*([[:digit:]]*)$ ]]; then GID_MIN=${BASH_REMATCH[1]} GID_MAX=${BASH_REMATCH[2]} [[ -n ${GID_MAX} ]] || GID_MAX=${GID_MIN} while IFS= read -r SELECT_GROUP; do show_group "${SELECT_GROUP}" done < <(awk -F':' -v GROUP_MIN=${GID_MIN:=1000} -v GROUP_MAX=${GID_MAX:=60000} '$3 >= GROUP_MIN && $3 <= GROUP_MAX && $1 != "nobody" { print $1}' ${FILE_GROUP}) - elif grep -q ^"${SELECT_PARAM}:" ${FILE_GROUP} &>/dev/null; then - show_group "${SELECT_PARAM}" + elif grep -q ^"${SELECT_PARAM_ALL}:" ${FILE_GROUP} &>/dev/null; then + show_group "${SELECT_PARAM_ALL}" fi done <<< "${PARAM_ALL// /$'\n'}" } @@ -1475,10 +1497,10 @@ ubconfig_exec_system(){ USERADD\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_06_useradd "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; USERSHADOW\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_07_usershadow "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; GROUPADD\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_04_groupadd "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; - USERADD_SYNC) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/25-accounts-sync exec_useradd_sync ;; - USERADD_SYNC\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/25-accounts-sync exec_useradd_sync ;; - GROUPADD_SYNC) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/25-accounts-sync exec_groupadd_sync ;; - GROUPADD_SYNC\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/25-accounts-sync exec_groupadd_sync ;; + USERADD_SYNC) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/25-accounts-sync exec_useradd_sync "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; + USERADD_SYNC\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/25-accounts-sync exec_useradd_sync "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; + GROUPADD_SYNC) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/25-accounts-sync exec_groupadd_sync "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; + GROUPADD_SYNC\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.halt.pre/25-accounts-sync exec_groupadd_sync "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; *) NO_FIND_EXCUTE=1 ;; esac ;; @@ -1537,8 +1559,9 @@ ubconfig_exec_system(){ ;; "[${SYSCONF}/server]"|"[server]") case "${NAME_VAR}" in - STORAGE_CONTAINERS_PATH) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/80-server-containers-storage ;; - STORAGE_LIBVIRT_PATH) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/81-server-libvirt-storage ;; + STORAGE_CONTAINERS_PATH) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/80-server-storage exec_storage_containers_path ;; + STORAGE_DOCKER_PATH) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/80-server-storage exec_storage_docker_path ;; + STORAGE_LIBVIRT_PATH) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/80-server-storage exec_storage_libvirt_pat ;; UBPILE_DB) ${ROOTFS}/usr/lib/ublinux/rc.local.d/98-ubpile exec_01_ubpile_db "${COMMAND_MODE_VAR}" ;; # Специально без параметров UBPILE_DB\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.local.d/98-ubpile exec_01_ubpile_db "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; UBPILE) ${ROOTFS}/usr/lib/ublinux/rc.local.d/98-ubpile exec_02_ubpile "${COMMAND_MODE_VAR}" ;; # Специально без параметров, что-бы читались дефолтные параметры при =admin и =worker diff --git a/ublinux/rc.halt.pre/25-accounts-sync b/ublinux/rc.halt.pre/25-accounts-sync index f04d4d5..3751da8 100755 --- a/ublinux/rc.halt.pre/25-accounts-sync +++ b/ublinux/rc.halt.pre/25-accounts-sync @@ -3,6 +3,8 @@ # Author: Dmitry Razumov # Copyright (c) 2021-2025 UBLinux # +# Extended pattern matching: https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching +shopt -s extglob ENABLED=yes [[ ${ENABLED} == "yes" ]] || exit 0 @@ -37,29 +39,48 @@ exec_useradd_sync(){ set_ubconfig(){ local PARAM=$1 local GET_USERADD=$(get_conf_useradd_from_system ${PARAM}) + if [[ -n ${GET_USERADD} ]]; then + eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] ${GET_USERADD} + eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERADD} + fi local GET_USERSHADOW=$(get_conf_usershadow_from_system ${PARAM}) - ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] ${GET_USERADD} - ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] ${GET_USERSHADOW} - [[ -n ${GET_USERADD} ]] && eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERADD} - [[ -n ${GET_USERSHADOW} ]] && eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERSHADOW} + if [[ -n ${GET_USERSHADOW} ]]; then + eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] ${GET_USERSHADOW} + eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERSHADOW} + fi } - if [[ ${USERADD_SYNC} =~ 'shutdown@all' ]]; then - set_ubconfig "@all" - elif [[ ${USERADD_SYNC} =~ 'shutdown@users' ]]; then - set_ubconfig "@users" - elif [[ ${USERADD_SYNC} =~ 'shutdown@systems' ]]; then - set_ubconfig "@systems" - elif [[ ${USERADD_SYNC} =~ ^'shutdown@'(([[:digit:]]+)'-'*([[:digit:]]*))$ ]]; then - set_ubconfig "${BASH_REMATCH[1]}" - elif [[ ${USERADD_SYNC} =~ 'shutdown' ]]; then - set_ubconfig + [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift + [[ -n ${COMMAND} ]] || COMMAND="set=" + local PARAM="$@" + if [[ -n ${PARAM} ]]; then + unset USERADD_SYNC + declare -A USERADD_SYNC + [[ ${PARAM%%=*} =~ [!\$%\&()*+,./:\;\<\=\>?\@\^\{|\}~-] ]] || eval "${PARAM%%=*}=\${PARAM#*=}" fi + # Если синхронизируем пользователей по шаблону, то удалим всех пользователей из глобальной конфигурации + if [[ ${USERADD_SYNC} =~ 'shutdown' ]]; then + ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] USERADD[*] + ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] USERSHADOW[*] + fi + while IFS= read -u3 SELECT_USERADD_SYNC; do + if [[ ${SELECT_USERADD_SYNC} == 'shutdown@all' ]]; then + set_ubconfig "@all" + elif [[ ${SELECT_USERADD_SYNC} == 'shutdown@users' ]]; then + set_ubconfig "@users" + elif [[ ${SELECT_USERADD_SYNC} == 'shutdown@systems' ]]; then + set_ubconfig "@systems" + elif [[ ${SELECT_USERADD_SYNC} =~ ^'shutdown@'(([[:digit:]]+)'-'*([[:digit:]]*))$ ]]; then + set_ubconfig "${BASH_REMATCH[1]}" + elif [[ ${SELECT_USERADD_SYNC} == 'shutdown' ]]; then + set_ubconfig + fi + done 3<<< "${USERADD_SYNC//@(,|;)/$'\n'}" if [[ "$(declare -p USERADD_SYNC 2>/dev/null)" == "declare -A"* ]]; then while IFS= read -u3 SELECT_USER; do # В массиве 0 запись игнорируем, т.к. это параметр не ассоциативного массива if [[ ${SELECT_USER} != 0 && ${USERADD_SYNC[${SELECT_USER}]} =~ 'shutdown' ]]; then set_ubconfig "${SELECT_USER}" - fi + fi done 3< <(printf "%s\n" "${!USERADD_SYNC[@]}") fi } @@ -68,7 +89,7 @@ exec_useradd_sync(){ ## GROUPADD_SYNC='shutdown,shutdown@all,shutdown@users,shutdown@systems,shutdown@-,shutdown@' ## shutdown # Аналогичен shutdown@users + shutdown@systems ## shutdown@all # При завершении работы системы синхронизировать все группы в системе с глобальной конфигурацией -## shutdown@users # При завершении работы системы синхронизировать группы 1000<=GID<=6000 в системе с глобальной конфигурацией +## shutdown@groups # При завершении работы системы синхронизировать группы 1000<=GID<=6000 в системе с глобальной конфигурацией ## shutdown@systems # При завершении работы системы синхронизировать системные группы 500<=GID<=999 в системе с глобальной конфигурацией ## shutdown@- # При завершении работы системы синхронизировать диапазон GID групп в системе с глобальной конфигурацией ## shutdown@ # При завершении работы системы синхронизировать GID группы в системе с глобальной конфигурацией @@ -82,20 +103,36 @@ exec_groupadd_sync(){ set_ubconfig(){ local PARAM=$1 local GET_GROUPADD=$(get_conf_groupadd_from_system ${PARAM}) - ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] GROUPADD[*] - [[ -n ${GET_GROUPADD} ]] && eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_GROUPADD} + if [[ -n ${GET_GROUPADD} ]]; then + eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] ${GET_GROUPADD} + eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_GROUPADD} + fi } - if [[ ${GROUPADD_SYNC} =~ 'shutdown@all' ]]; then - set_ubconfig "@all" - elif [[ ${GROUPADD_SYNC} =~ 'shutdown@users' ]]; then - set_ubconfig "@users" - elif [[ ${GROUPADD_SYNC} =~ 'shutdown@systems' ]]; then - set_ubconfig "@systems" - elif [[ ${GROUPADD_SYNC} =~ ^'shutdown@'(([[:digit:]]+)'-'*([[:digit:]]*))$ ]]; then - set_ubconfig "${BASH_REMATCH[1]}" - elif [[ ${GROUPADD_SYNC} =~ 'shutdown' ]]; then - set_ubconfig + [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift + [[ -n ${COMMAND} ]] || COMMAND="set=" + local PARAM="$@" + if [[ -n ${PARAM} ]]; then + unset GROUPADD_SYNC + declare -A GROUPADD_SYNC + [[ ${PARAM%%=*} =~ [!\$%\&()*+,./:\;\<\=\>?\@\^\{|\}~-] ]] || eval "${PARAM%%=*}=\${PARAM#*=}" + fi + # Если синхронизируем группы по шаблону, то удалим все группы из глобальной конфигурации + if [[ ${USERADD_SYNC} =~ 'shutdown' ]]; then + ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] GROUPADD[*] fi + while IFS= read -u3 SELECT_GROUPADD_SYNC; do + if [[ ${SELECT_GROUPADD_SYNC} == 'shutdown@all' ]]; then + set_ubconfig "@all" + elif [[ ${SELECT_GROUPADD_SYNC} == 'shutdown@groups' ]]; then + set_ubconfig "@groups" + elif [[ ${SELECT_GROUPADD_SYNC} == 'shutdown@systems' ]]; then + set_ubconfig "@systems" + elif [[ ${SELECT_GROUPADD_SYNC} =~ ^'shutdown@'(([[:digit:]]+)'-'*([[:digit:]]*))$ ]]; then + set_ubconfig "${BASH_REMATCH[1]}" + elif [[ ${SELECT_GROUPADD_SYNC} == 'shutdown' ]]; then + set_ubconfig + fi + done 3<<< "${GROUPADD_SYNC//@(,|;)/$'\n'}" if [[ "$(declare -p GROUPADD_SYNC 2>/dev/null)" == "declare -A"* ]]; then while IFS= read -u3 SELECT_GROUP; do # В массиве 0 запись игнорируем, т.к. это параметр не ассоциативного массива diff --git a/ublinux/rc.local.d/91-cts b/ublinux/rc.local.d/91-cts index ad6c93b..5b469b8 100755 --- a/ublinux/rc.local.d/91-cts +++ b/ublinux/rc.local.d/91-cts @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # Software: Continent AP # @@ -6,13 +6,11 @@ ENABLED=yes [[ ${ENABLED} == "yes" ]] || exit 0 DEBUGMODE=no -#. /usr/lib/ublinux/functions debug_mode "$0" "$@" -if [ -d /etc/cts ] ;then - if ! systemctl is-active cts 2>/dev/null; then - ldconfig /usr/lib/cts && systemctl restart cts - fi -fi - -exit 0 + ISSYSTEMD=$(readlink -fq ${ROOTFS}/usr/bin/init | grep "lib/systemd/systemd$") + if [[ -d /etc/cts ]]; then + if [[ -n ${ISSYSTEMD} ]] && ! systemctl --quiet is-active cts.service; then + ldconfig /usr/lib/cts && systemctl --quiet restart cts.service + fi + fi diff --git a/ublinux/rc.preinit.d/80-server-containers-storage b/ublinux/rc.preinit.d/80-server-containers-storage index c6d5cf2..ac64615 100755 --- a/ublinux/rc.preinit.d/80-server-containers-storage +++ b/ublinux/rc.preinit.d/80-server-containers-storage @@ -27,14 +27,14 @@ SOURCE=${SYSCONF}/server; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null exec_storage_containers_path(){ STORAGE_CONTAINERS_NAME="storage.containers" STORAGE_CONTAINERS_PATH_DEFAULT="/memory/layer-base/1/${STORAGE_CONTAINERS_NAME}" - STORAGE_CONTAINERS_PATH_SYSTEM="/var/lib/containers/storage" + #STORAGE_CONTAINERS_PATH_SYSTEM="/var/lib/containers/storage" FILE_STORAGE_CONTAINERS_CONF="/etc/containers/storage.conf" if [[ -n ${STORAGE_CONTAINERS_PATH} ]]; then if [[ ${STORAGE_CONTAINERS_PATH,,} == @(y|yes|enable) ]]; then [[ -d ${STORAGE_CONTAINERS_PATH_DEFAULT} ]] || install -dm0755 ${STORAGE_CONTAINERS_PATH_DEFAULT} STORAGE_CONTAINERS_PATH=${STORAGE_CONTAINERS_PATH_DEFAULT} - elif [[ ${STORAGE_CONTAINERS_PATH} =~ ^/memory/|^/mnt/(livemedia|livedata)/ ]]; then + elif [[ ${STORAGE_CONTAINERS_PATH} =~ ^/memory/|^/mnt/(livemedia|livedata)/|^/media/|^/run/media/ ]]; then [[ -d ${STORAGE_CONTAINERS_PATH} ]] || install -dm0755 ${STORAGE_CONTAINERS_PATH} fi if ! grep -qi "^\s*graphroot = \"${STORAGE_CONTAINERS_PATH}\"" ${ROOTFS}/${FILE_STORAGE_CONTAINERS_CONF}; then @@ -49,8 +49,101 @@ exec_storage_containers_path(){ fi } +exec_storage_docker_path(){ + STORAGE_DOCKER_NAME="storage.docker" + STORAGE_DOCKER_PATH_DEFAULT="/memory/layer-base/1/${STORAGE_CONTAINERS_NAME}" + #STORAGE_DOCKER_PATH_SYSTEM="/var/lib/docker" + FILE_DOCKER_CONF="/etc/docker/daemon.json" + FILE_DOCKER_MODPROBE="/etc/modprobe.d/ubconfig-docker.conf" + + if [[ -n ${STORAGE_DOCKER_PATH} ]]; then + if [[ ${STORAGE_DOCKER_PATH,,} == @(y|yes|enable) ]]; then + [[ -d ${STORAGE_DOCKER_PATH_DEFAULT} ]] || install -dm0755 ${STORAGE_DOCKER_PATH_DEFAULT} + STORAGE_DOCKER_PATH=${STORAGE_DOCKER_PATH_DEFAULT} + elif [[ ${STORAGE_DOCKER_PATH} =~ ^/memory/|^/mnt/(livemedia|livedata)/|^/media/|^/run/media/ ]]; then + [[ -d ${STORAGE_DOCKER_PATH} ]] || install -dm0755 ${STORAGE_DOCKER_PATH} + fi + [[ -d ${FILE_DOCKER_CONF%/*} ]] || install -dm0755 ${FILE_DOCKER_CONF%/*} + if [[ -f ${FILE_DOCKER_CONF} ]]; then + # Переделать, содержимое в переменную и манипуляции в переменной, в конце зпись переменной в файл + if ! grep -qi "^\s+\"data-root\": \"${STORAGE_DOCKER_PATH}\"" ${ROOTFS}/${FILE_DOCKER_CONF}; then + if grep -qi "^\s+\"data-root\":" ${ROOTFS}/${FILE_DOCKER_CONF}; then + sed -r "s|^\s+(\"data-root\":)|\1 \"${STORAGE_DOCKER_PATH}\"|" -i ${ROOTFS}/${FILE_DOCKER_CONF} + elif grep -qi "^\s*#\s*\"data-root\":" ${ROOTFS}/${FILE_DOCKER_CONF}; then + sed "/^\s*#\s*\"data-root\":/a \"data-root\": \"${STORAGE_DOCKER_PATH}\"" -i ${ROOTFS}/${FILE_DOCKER_CONF} + else + sed "/^\s*{\s*/a \"data-root\": \"${STORAGE_DOCKER_PATH}\"," -i ${ROOTFS}/${FILE_DOCKER_CONF} + fi + fi + else + cat << EOF > ${FILE_DOCKER_CONF} +{ + "data-root": "${STORAGE_DOCKER_PATH}" +} +EOF + fi + cat << EOF > ${FILE_DOCKER_MODPROBE} +# For Docker overlay2 +options overlay +# Disable overlay redirect dir and metacopy +# options overlay metacopy=off redirect_dir=off +EOF + else + [[ -f ${FILE_DOCKER_MODPROBE} ]] && rm -f ${FILE_DOCKER_MODPROBE} &>/dev/null + fi +} + +exec_storage_libvirt_path(){ + STORAGE_LIBVIRT_POOL_NAME="storage.libvirt" + STORAGE_LIBVIRT_PATH_DEFAULT="/memory/layer-base/1/${STORAGE_LIBVIRT_POOL_NAME}" + if [[ -n ${STORAGE_LIBVIRT_PATH} ]]; then + if [[ ${STORAGE_LIBVIRT_PATH,,} == @(y|yes|enable) ]]; then + STORAGE_LIBVIRT_PATH=${STORAGE_LIBVIRT_PATH_DEFAULT} + [[ -d ${STORAGE_LIBVIRT_PATH} ]] || install -dm0755 ${STORAGE_LIBVIRT_PATH} + elif [[ ${STORAGE_LIBVIRT_PATH} =~ ^/memory/|^/mnt/(livemedia|livedata)/ ]]; then + [[ -d ${STORAGE_LIBVIRT_PATH} ]] || install -dm0755 ${STORAGE_LIBVIRT_PATH} + fi + cat < "${ROOTFS}/etc/libvirt/storage/${STORAGE_LIBVIRT_POOL_NAME}.xml" + + + + ${STORAGE_LIBVIRT_POOL_NAME} + 22e1f043-1fcb-4017-8afd-d44ebea9c8e4 + 0 + 0 + 0 + + + + ${STORAGE_LIBVIRT_PATH} + + +EOF + fi + [[ -d ${ROOTFS}/etc/libvirt/storage/autostart ]] || install -dm0755 ${ROOTFS}/etc/libvirt/storage/autostart + ln -sf /etc/libvirt/storage/${STORAGE_LIBVIRT_POOL_NAME}.xml ${ROOTFS}/etc/libvirt/storage/autostart/${STORAGE_LIBVIRT_POOL_NAME}.xml +} + ################ ##### MAIN ##### ################ - exec_storage_containers_path $@ + # Если файл подключен как ресурс с функциями, то выйти + 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 diff --git a/ublinux/rc.preinit.d/81-server-libvirt-storage b/ublinux/rc.preinit.d/81-server-libvirt-storage deleted file mode 100755 index f05707d..0000000 --- a/ublinux/rc.preinit.d/81-server-libvirt-storage +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash -# -# Author: Dmitry Razumov -# Copyright (c) 2021-2025 UBLinux -# -# Initial script for Linux 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 ]] && { ROOTFS= ; CMD_CHROOT= ; } || { [[ -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}" -SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null -SOURCE=${SYSCONF}/system; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null -SOURCE=${SYSCONF}/server; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null - -exec_storage_libvirt_path(){ - STORAGE_LIBVIRT_POOL_NAME="storage.libvirt" - STORAGE_LIBVIRT_PATH_DEFAULT="/memory/layer-base/1/${STORAGE_LIBVIRT_POOL_NAME}" - if [[ -n ${STORAGE_LIBVIRT_PATH} ]]; then - if [[ ${STORAGE_LIBVIRT_PATH,,} == @(y|yes|enable) ]]; then - STORAGE_LIBVIRT_PATH=${STORAGE_LIBVIRT_PATH_DEFAULT} - [[ -d ${STORAGE_LIBVIRT_PATH} ]] || install -dm0755 ${STORAGE_LIBVIRT_PATH} - elif [[ ${STORAGE_LIBVIRT_PATH} =~ ^/memory/|^/mnt/(livemedia|livedata)/ ]]; then - [[ -d ${STORAGE_LIBVIRT_PATH} ]] || install -dm0755 ${STORAGE_LIBVIRT_PATH} - fi - cat < "${ROOTFS}/etc/libvirt/storage/${STORAGE_LIBVIRT_POOL_NAME}.xml" - - - - ${STORAGE_LIBVIRT_POOL_NAME} - 22e1f043-1fcb-4017-8afd-d44ebea9c8e4 - 0 - 0 - 0 - - - - ${STORAGE_LIBVIRT_PATH} - - -EOF - fi - [[ -d ${ROOTFS}/etc/libvirt/storage/autostart ]] || install -dm0755 ${ROOTFS}/etc/libvirt/storage/autostart - ln -sf /etc/libvirt/storage/${STORAGE_LIBVIRT_POOL_NAME}.xml ${ROOTFS}/etc/libvirt/storage/autostart/${STORAGE_LIBVIRT_POOL_NAME}.xml -} - -################ -##### MAIN ##### -################ - - exec_storage_libvirt_path $@ diff --git a/ublinux/templates/ublinux-data.ini b/ublinux/templates/ublinux-data.ini index 41c9947..36ef84d 100644 --- a/ublinux/templates/ublinux-data.ini +++ b/ublinux/templates/ublinux-data.ini @@ -109,10 +109,23 @@ VERSION= ## : # Имя пользователя для которого будет установлена переменная окружения systemd в домашнем каталоге пользователя ~/.config/environment.d/ubconfig-user-10-system.conf ## # Имя переменной ## # Значение переменной +## +## Перенос временных файлов КДЕ4 в отдельную папку. Убирает притормаживание главного меню в КДЕ4 +## Создать каталог: mkdir -p /mnt/livedata/ublinux-data/tmp +## ENVIROMENT[profile:KDEVARTMP]="/mnt/livedata/ublinux-data/tmp" +## +## Если на видеокарте nvidia наблюдается эффект разрыва окон, то есть 2 варианта борьбы с этим +## Выберите один из вариантов, не включайте сразу 2 переменные сразу +## 1 вариант. Может снизить производительность в играх +## ENVIROMENT[profile:__GL_YIELD]="USLEEP" +## 2 вариант. Не на каждой видеокарте может сработать +## ENVIROMENT[profile:KWIN_TRIPLE_BUFFER]=1 +## #ENVIROMENT[system:VAR_SYS]="my value for system" #ENVIROMENT[profile:VAR_PROFILE]="my value for all users" #ENVIROMENT[superadmin:VAR_USER]="my value for select user" + ## Настройки профиля конфигурации PAM авторизации, authselect. Профили /usr/share/authselect/default ## AUTHPAM[]=|disable|no|off ## # Профиль @@ -767,16 +780,25 @@ VERSION= [/etc/ublinux/server] ## Настройка сервера ################################################################################ -## Задать путь хранилища контейнеров containers/podman/docker +## Задать путь хранилища контейнеров containers/podman +## Не включив параметр функционировать не будет containers/podman ## STORAGE_CONTAINERS_PATH=<путь>|y|yes|enable -## <путь> # Путь до каталога хранилища контейнеров -## y|yes|enable # Установит путь /memory/layer-base/1/storage.containers +## <путь> # Путь до каталога хранилища контейнеров +## y|yes|enable # Установит путь /memory/layer-base/1/storage.containers #STORAGE_CONTAINERS_PATH=yes +## Задать путь хранилища контейнеров docker +## Не включив параметр функционировать не будет docker +## DOCKER_STORAGE_CONTAINERS_PATH=<путь>|y|yes|enable +## <путь> # Путь до каталога хранилища контейнеров +## y|yes|enable # Установит путь /memory/layer-base/1/storage.docker +#STORAGE_DOCKER_PATH=yes + ## Создать хранилище образов для libvirt как движок контроллера виртуализации openvz,kvm,qemu,virtualbox,xen и другие +## Не включив параметр функционировать не будет libvirt ## STORAGE_LIBVIRT_PATH=<путь>|y|yes|enable -## <путь> # Путь до каталога хранилища пула образов -## y|yes|enable # Установит путь /memory/layer-base/1/storage.libvirt +## <путь> # Путь до каталога хранилища пула образов +## y|yes|enable # Установит путь /memory/layer-base/1/storage.libvirt #STORAGE_LIBVIRT_PATH=yes ## Использовать сервер как контроллер домена @@ -1923,18 +1945,6 @@ VERSION= # адрес основного DNS сервера, откуда брать запросы #ip=77.88.8.8; -[/etc/profile.d/ublinux.sh] -################################################################################ -# Перенос временных файлов КДЕ4 в отдельную папку. Убирает притормаживание главного меню в КДЕ4 -#export KDEVARTMP=/mnt/livedata/ublinux-data/tmp - -# Если на видеокарте nvidia наблюдается эффект разрыва окон, то есть 2 варианта борьбы с этим -# Выберите один из вариантов, не включайте сразу 2 переменные сразу -# 1 вариант. Может снизить производительность в играх -#export __GL_YIELD=USLEEP -# 2 вариант. Не на каждой видеокарте может сработать -#export KWIN_TRIPLE_BUFFER=1 - [/etc/laptop-mode/laptop-mode.conf] ################################################################################ # Отключение парковки жесткого диска на ноутбуках