From bf388bf1248943efd206faece5fcb7bdbab5459b Mon Sep 17 00:00:00 2001 From: asmeron Date: Tue, 12 Aug 2025 22:59:40 +0600 Subject: [PATCH] Fix 25-accounts-sync --- ublinux/rc.halt.pre/25-accounts-sync | 170 +++++++++++++++++---------- 1 file changed, 108 insertions(+), 62 deletions(-) diff --git a/ublinux/rc.halt.pre/25-accounts-sync b/ublinux/rc.halt.pre/25-accounts-sync index cb32dcc..0e29e71 100755 --- a/ublinux/rc.halt.pre/25-accounts-sync +++ b/ublinux/rc.halt.pre/25-accounts-sync @@ -95,10 +95,6 @@ exec_01_useradd_sync(){ local GET_USERADD=$(get_conf_useradd_from_system "${PARAM}") if [[ ${GET_USERADD} != "" ]]; then eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERADD} - # Если в системной конфигурации заданы USERADD_SYNC= USERADD_SYNC[${PARAM}]= то установить в глобальной конфигурации - [[ -n ${USERADD_SYNC} ]] && ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] USERADD_SYNC="${USERADD_SYNC}" - [[ -n ${PARAM} && "$(declare -p USERADD_SYNC 2>/dev/null)" == "declare -A"* && -n ${USERADD_SYNC[${PARAM}]} ]] \ - && ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] USERADD_SYNC["${PARAM}"]="${USERADD_SYNC[${PARAM}]}" local GET_USERSHADOW=$(get_conf_usershadow_from_system ${PARAM}) # TODO: Если задан диапазон пользователей, пример 0-999, то GET_USERSHADOW будет содержать всех пользователей в этом диапазоте # А нужно выбрать только пользователей которые содержатся в GET_USERADD @@ -106,44 +102,71 @@ exec_01_useradd_sync(){ eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERSHADOW} fi fi - } + set_ubconfig_global_allsync(){ + # Если в системной конфигурации заданы USERADD_SYNC= то установить в глобальной конфигурации + [[ -n ${USERADD_SYNC} ]] && ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] USERADD_SYNC="${USERADD_SYNC}" + } + set_ubconfig_global_selectsync(){ + local PARAM="$1" + # Если в системной конфигурации заданы USERADD_SYNC[${PARAM}]= то установить в глобальной конфигурации + [[ -n ${PARAM} && "$(declare -p USERADD_SYNC 2>/dev/null)" == "declare -A"* && -n ${USERADD_SYNC[${PARAM}]} ]] \ + && ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] USERADD_SYNC["${PARAM}"]="${USERADD_SYNC[${PARAM}]}" + } + [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift [[ -n ${COMMAND} ]] || COMMAND="set=" local PARAM="$@" if [[ -n ${PARAM} ]]; then - local USERADD_SYNC= - declare -A USERADD_SYNC=() + # Параметр вида USERADD_SYNC= + if [[ ${PARAM} =~ ^[^'[']+'=' ]]; then + USERADD_SYNC= + else + # Параметр вида USERADD_SYNC[*]= + local USERADD_SYNC= + declare -A USERADD_SYNC=() + fi [[ ${PARAM} =~ ^[[:alnum:]_]+("="|"[".*"]=") ]] && eval "${PARAM%%=*}=\${PARAM#*=}" fi - while IFS= read -u3 SELECT_USERADD_SYNC; do - if [[ ${SELECT_USERADD_SYNC} == 'shutdown@all' ]]; then - remove_ubconfig "@all" - set_ubconfig "@all" - elif [[ ${SELECT_USERADD_SYNC} == 'shutdown@users' ]]; then - remove_ubconfig "@users" - set_ubconfig "@users" - elif [[ ${SELECT_USERADD_SYNC} == 'shutdown@systems' ]]; then - remove_ubconfig "@systems" - set_ubconfig "@systems" - elif [[ ${SELECT_USERADD_SYNC} == 'shutdown' ]]; then - remove_ubconfig "@users" - remove_ubconfig "@systems" - set_ubconfig - elif [[ ${SELECT_USERADD_SYNC} =~ ^'shutdown@'(([[:digit:]]+)'-'*([[:digit:]]*))$ ]]; then - local LIST_USERS="${BASH_REMATCH[1]}" - remove_ubconfig "${LIST_USERS}" - set_ubconfig "${LIST_USERS}" - fi - done 3<<< "${USERADD_SYNC//@(,|;)/$'\n'}" - if [[ "$(declare -p USERADD_SYNC 2>/dev/null)" == "declare -A"* ]]; then - [[ -n ${!USERADD_SYNC[@]} ]] && while IFS= read -u3 SELECT_USER; do - # В массиве 0 запись игнорируем, т.к. это параметр не ассоциативного массива - if [[ ${SELECT_USER} != 0 && ${USERADD_SYNC[${SELECT_USER}]} =~ 'shutdown' ]]; then - remove_ubconfig "${SELECT_USER}" - set_ubconfig "${SELECT_USER}" + if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]]; then + # Обработка всех пользователей параметр USERADD_SYNC=... + while IFS= read -u3 SELECT_USERADD_SYNC; do + if [[ ${SELECT_USERADD_SYNC} == 'shutdown@all' ]]; then + remove_ubconfig "@all" + set_ubconfig "@all" + elif [[ ${SELECT_USERADD_SYNC} == 'shutdown@users' ]]; then + remove_ubconfig "@users" + set_ubconfig "@users" + elif [[ ${SELECT_USERADD_SYNC} == 'shutdown@systems' ]]; then + remove_ubconfig "@systems" + set_ubconfig "@systems" + elif [[ ${SELECT_USERADD_SYNC} == 'shutdown' ]]; then + remove_ubconfig "@users" + remove_ubconfig "@systems" + set_ubconfig + elif [[ ${SELECT_USERADD_SYNC} =~ ^'shutdown@'(([[:digit:]]+)'-'*([[:digit:]]*))$ ]]; then + local LIST_USERS="${BASH_REMATCH[1]}" + remove_ubconfig "${LIST_USERS}" + set_ubconfig "${LIST_USERS}" fi - done 3< <(printf "%s\n" "${!USERADD_SYNC[@]}") + set_ubconfig_global_allsync + done 3<<< "${USERADD_SYNC//@(,|;)/$'\n'}" + # Обработка выбранних пользователей параметр USERADD_SYNC[...]=... + if [[ "$(declare -p USERADD_SYNC 2>/dev/null)" == "declare -A"* ]]; then + [[ -n ${!USERADD_SYNC[@]} ]] && while IFS= read -u3 SELECT_USER; do + # В массиве 0 запись игнорируем, т.к. это параметр не ассоциативного массива + if [[ ${SELECT_USER} != 0 && ${USERADD_SYNC[${SELECT_USER}]} =~ 'shutdown' ]]; then + # Если все пользователи уже были синхронизироаны, то пропустить + if [[ ! ${USERADD_SYNC} =~ (^|,)('shutdown@all'|'shutdown')(,|$) ]]; then + remove_ubconfig "${SELECT_USER}" + set_ubconfig "${SELECT_USER}" + fi + set_ubconfig_global_selectsync "${SELECT_USER}" + fi + done 3< <(printf "%s\n" "${!USERADD_SYNC[@]}") + fi + elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then + true fi } @@ -168,44 +191,67 @@ exec_02_groupadd_sync(){ if [[ ${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} - # Если в системной конфигурации заданы GROUPADD_SYNC= GROUPADD_SYNC[${PARAM}]= то установить в глобальной конфигурации - [[ -n ${GROUPADD_SYNC} ]] && ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] GROUPADD_SYNC="${GROUPADD_SYNC}" - [[ -n ${PARAM} && "$(declare -p GROUPADD_SYNC 2>/dev/null)" == "declare -A"* && -n ${GROUPADD_SYNC[${PARAM}]} ]] \ - && ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] GROUPADD_SYNC["${PARAM}"]="${GROUPADD_SYNC[${PARAM}]}" fi } + set_ubconfig_global_allsync(){ + # Если в системной конфигурации заданы GROUPADD_SYNC= то установить в глобальной конфигурации + [[ -n ${GROUPADD_SYNC} ]] && ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] GROUPADD_SYNC="${GROUPADD_SYNC}" + } + set_ubconfig_global_selectsync(){ + local PARAM="$1" + # Если в системной конфигурации заданы GROUPADD_SYNC[${PARAM}]= то установить в глобальной конфигурации + [[ -n ${PARAM} && "$(declare -p GROUPADD_SYNC 2>/dev/null)" == "declare -A"* && -n ${GROUPADD_SYNC[${PARAM}]} ]] \ + && ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] GROUPADD_SYNC["${PARAM}"]="${GROUPADD_SYNC[${PARAM}]}" + } [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift [[ -n ${COMMAND} ]] || COMMAND="set=" local PARAM="$@" if [[ -n ${PARAM} ]]; then - local GROUPADD_SYNC= - declare -A GROUPADD_SYNC=() + # Параметр вида GROUPADD_SYNC= + if [[ ${PARAM} =~ ^[^'[']+'=' ]]; then + GROUPADD_SYNC= + else + # Параметр вида GROUPADD_SYNC[*]= + local GROUPADD_SYNC= + declare -A GROUPADD_SYNC=() + fi [[ ${PARAM} =~ ^[[:alnum:]_]+("="|"[".*"]=") ]] && 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 + if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]]; then + # Обработка всех групп, параметр GROUPADD_SYNC=... + # Если синхронизируем группы по шаблону, то удалим все группы из глобальной конфигурации + if [[ ${USERADD_SYNC} =~ 'shutdown' ]]; then + ${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] GROUPADD[*] 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 запись игнорируем, т.к. это параметр не ассоциативного массива - if [[ ${SELECT_GROUP} != 0 && ${GROUPADD_SYNC[${SELECT_GROUP}]} =~ 'shutdown' ]]; then - set_ubconfig "${SELECT_GROUP}" + 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< <(printf "%s\n" "${!GROUPADD_SYNC[@]}") + set_ubconfig_global_allsync + done 3<<< "${GROUPADD_SYNC//@(,|;)/$'\n'}" + # Обработка выбранних групп параметр GROUPADD_SYNC[...]=... + if [[ "$(declare -p GROUPADD_SYNC 2>/dev/null)" == "declare -A"* ]]; then + while IFS= read -u3 SELECT_GROUP; do + # В массиве 0 запись игнорируем, т.к. это параметр не ассоциативного массива + if [[ ${SELECT_GROUP} != 0 && ${GROUPADD_SYNC[${SELECT_GROUP}]} =~ 'shutdown' ]]; then + # Если все пользователи уже были синхронизироаны, то пропустить + if [[ ! ${GROUPADD_SYNC} =~ (^|,)('shutdown@all'|'shutdown')(,|$) ]]; then + set_ubconfig "${SELECT_GROUP}" + fi + set_ubconfig_global_selectsync "${SELECT_GROUP}" + fi + done 3< <(printf "%s\n" "${!GROUPADD_SYNC[@]}") + fi + elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then + true fi }