@ -190,6 +190,275 @@ globalconf_convert_pass_plain_to_hash(){
fi
fi
}
}
#####################################################################################
###
### Функции получения от системы текущих настроек вида параметров от конфигурации ###
###
#####################################################################################
# Получить запись вида конфигурации USERADD из системного пользователя
# $1 # Варианты пользователей, можно указывать несколько через пробел, кроме nobody
# <пу cто > # Эквивалентно '@users @systems'
# @users # В с е пользователи кроме системных, MIN_UID и MAX_UID взять из /etc/login.defs
# @systems # Только системные, SYS_MIN_UID и SYS_MAX_UID взять из /etc/login.defs
# @all # В с е с UID от 0 до 65535
# <digital>-<digital> # В с е пользователи диапазона
# <username> # Имя пользователя
get_conf_useradd_from_system(){
FILE_PASSWD="${ROOTFS}/etc/passwd"
FILE_SHADOW="${ROOTFS}/etc/shadow"
FILE_LOGINDEFS="${ROOTFS}/etc/login.defs"
DATA_FILE_PASSWD=$(cat ${FILE_PASSWD})
DATA_FILE_SHADOW=$(cat ${FILE_SHADOW})
# Загрузить файлы которые совпадают в каталогах /usr/lib/sysusers.d/ и /usr/share/ublinux-sysusers/. И загрузить которые уникальные в /usr/lib/sysusers.d/
DATA_SYSUSERS=$(cat \
$(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|') \
)
DEFAULT_HOME="/home"
DEFAULT_SHELL="/bin/bash"
show_user(){
local SELECT_USER="$1"
local SELECT_PLAINPASSWORD SELECT_UID SELECT_GROUP SELECT_GECOS SELECT_HOME SELECT_SHELL
local SELECT_OPTIONAL=
local SELECT_EXTRAGROUPS=
[[ ${DATA_FILE_PASSWD} =~ ($'\n'|^)+${SELECT_USER}:([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*)($'\n'|$)+ ]] \
&& SELECT_PLAINPASSWORD=${BASH_REMATCH[2]} \
&& SELECT_UID=${BASH_REMATCH[3]} \
&& SELECT_GROUP=${BASH_REMATCH[4]} \
&& SELECT_GECOS=${BASH_REMATCH[5]} \
&& SELECT_HOME=${BASH_REMATCH[6]} \
&& SELECT_SHELL=${BASH_REMATCH[7]}
[[ ${DATA_FILE_SHADOW} =~ ($'\n'|^)+${SELECT_USER}:([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*)($'\n'|$)+ ]] \
&& SELECT_PASSWORD=${BASH_REMATCH[2]}
[[ ${SELECT_PASSWORD} == "!*" && ${SELECT_PLAINPASSWORD} != "x" ]] && SELECT_PASSWORD="${SELECT_PLAINPASSWORD}"
#SELECT_EXTRAGROUPS=$(${CHROOT} id -nrG ${SELECT_USER} | tr " " ",")
SELECT_EXTRAGROUPS=$(printf "%s\n" $(${CHROOT} id -nrG ${SELECT_USER}) | sort -u | xargs | tr " " ",")
SELECT_EXTRAGROUPS=${SELECT_EXTRAGROUPS//,nobody/}; SELECT_EXTRAGROUPS=${SELECT_EXTRAGROUPS//nobody/}
[[ -n ${SELECT_HOME} && ${SELECT_HOME} != "${DEFAULT_HOME}/${SELECT_USER}" ]] && SELECT_OPTIONAL+=" --home-dir ${SELECT_HOME}"
[[ -n ${SELECT_SHELL} && ${SELECT_SHELL} != ${DEFAULT_SHELL} ]] && SELECT_OPTIONAL+=" --shell ${SELECT_SHELL}"
if [[ ${SELECT_PASSWORD} == "!*" ]]; then
local DATA_SYSUSERS_GROUP DATA_SYSUSERS_GECOS DATA_SYSUSERS_HOME DATA_SYSUSERS_SHELL
# В ыр иа нт1: u vault 319 "Vault daemon" /var/lib/vault
# В ыр иа нт2: u varnishlog 318:varnish "Varnish Cache Proxy"
[[ ${DATA_SYSUSERS} =~ ($'\n'|^)+'u'[[:blank:]]+${SELECT_USER}[[:blank:]]+(${SELECT_UID}|${SELECT_UID}:([^$'\n' ]*))[[:blank:]]*(\"([^$'\n']*)\"|\-)[[:blank:]]*([^$'\n' ]*)[[:blank:]]*([^$'\n' ]*)($'\n'|$)+ ]] \
&& DATA_SYSUSERS_GROUP=${BASH_REMATCH[3]} \
&& DATA_SYSUSERS_GECOS=${BASH_REMATCH[5]} \
&& DATA_SYSUSERS_HOME=${BASH_REMATCH[6]} \
&& DATA_SYSUSERS_SHELL=${BASH_REMATCH[7]}
[[ ${DATA_SYSUSERS_GECOS} == "-" ]] && unset DATA_SYSUSERS_GECOS
[[ ${DATA_SYSUSERS_HOME} == @(""|"-") ]] && DATA_SYSUSERS_HOME="/"
[[ ${DATA_SYSUSERS_SHELL} == @(""|"-") ]] && DATA_SYSUSERS_SHELL="/usr/bin/nologin"
# Поиск группы, если группа найдена, то номер как в системе, если не найдена, то номер должен быть по UID пользователя
[[ ${DATA_SYSUSERS_GROUP} != "" ]] && FIND_GROUP=${DATA_SYSUSERS_GROUP} || FIND_GROUP=${SELECT_USER}
[[ ${DATA_SYSUSERS} =~ ($'\n'|^)+'g'[[:blank:]]+${FIND_GROUP}[[:blank:]]+${SELECT_GROUP}[[:blank:]]*([^$'\n' ]*)[[:blank:]]*([^$'\n' ]*)($'\n'|$)+ ]] \
&& DATA_SYSUSERS_GROUP=${SELECT_GROUP} || DATA_SYSUSERS_GROUP=${SELECT_UID}
#
DATA_SYSUSERS_EXTRAGROUPS=$(sed -Enr "s/^m ${SELECT_USER} (.*)/\1/p" <<< ${DATA_SYSUSERS}) #"
#[[ -n ${DATA_SYSUSERS_EXTRAGROUPS} ]] && DATA_SYSUSERS_EXTRAGROUPS="${SELECT_USER},${DATA_SYSUSERS_EXTRAGROUPS//$'\n'/,}" || DATA_SYSUSERS_EXTRAGROUPS="${SELECT_USER}"
[[ -n ${DATA_SYSUSERS_EXTRAGROUPS} ]] && DATA_SYSUSERS_EXTRAGROUPS=$(printf "%s\n" ${SELECT_USER} ${DATA_SYSUSERS_EXTRAGROUPS} | sort -u | xargs | tr " " ",") \
|| DATA_SYSUSERS_EXTRAGROUPS="${FIND_GROUP}"
#
[[ ${SELECT_GROUP} == ${DATA_SYSUSERS_GROUP} && ${SELECT_EXTRAGROUPS} == ${DATA_SYSUSERS_EXTRAGROUPS} && ${SELECT_GECOS} == ${DATA_SYSUSERS_GECOS} && ${SELECT_HOME} == ${DATA_SYSUSERS_HOME} && ${SELECT_SHELL} == ${DATA_SYSUSERS_SHELL} ]] \
&& return 0
fi
echo "USERADD[${SELECT_USER}]='${SELECT_GECOS}:${SELECT_UID}:${SELECT_GROUP}:${SELECT_EXTRAGROUPS}:${SELECT_OPTIONAL}:${SELECT_PASSWORD}'"
}
# is_systemd_user(){
# # Пользователь присутстует в systemd sysusers.d
# local SELECT_USER=$1
# [[ $(cat ${ROOTFS}/usr/share/ublinux-sysusers/*.sysusers) =~ ($'\n'|^)+'u'[[:blank:]]+"${SELECT_USER}" ]] && return 1 || return 0
# [[ -d ${ROOTFS}/run/sysusers.d && $(cat ${ROOTFS}/run/sysusers.d/*.conf) =~ ($'\n'|^)+'u'[[:blank:]]+"${SELECT_USER}" ]] && return 1 || return 0
# }
local PARAM_ALL="$@"
[[ -n ${PARAM_ALL} ]] || PARAM_ALL="@users @systems"
while IFS= read -r SELECT_PARAM; do
if [[ ${SELECT_PARAM} == "@users" ]]; then
# В с е пользователи кроме системных
UID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*UID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
UID_MAX=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*UID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
while IFS= read -r SELECT_USER; do
show_user "${SELECT_USER}"
done < <(awk -F':' -v USER_MIN=${UID_MIN:=1000} -v USER_MAX=${UID_MAX:=65534} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
elif [[ ${SELECT_PARAM} == "@systems" ]]; then
# Пользователи системные
UID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_UID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
UID_MAX=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_UID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
while IFS= read -r SELECT_USER; do
show_user "${SELECT_USER}"
done < <(awk -F':' -v USER_MIN=${UID_MIN:=500} -v USER_MAX=${UID_MAX:=999} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
elif [[ ${SELECT_PARAM} == "@all" ]]; then
# В с е пользователи
while IFS= read -ru4 SELECT_USER; do
show_user "${SELECT_USER}"
done 4< <(awk -F':' '$1 != "nobody" { print $1}' ${FILE_PASSWD})
elif [[ ${SELECT_PARAM} =~ ^([[:digit:]]+)'-'*([[:digit:]]*)$ ]]; then
UID_MIN=${BASH_REMATCH[1]}
UID_MAX=${BASH_REMATCH[2]}
[[ -n ${UID_MAX} ]] || UID_MAX=${UID_MIN}
while IFS= read -r SELECT_USER; do
show_user "${SELECT_USER}"
done < <(awk -F':' -v USER_MIN=${UID_MIN:=1000} -v USER_MAX=${UID_MAX:=65534} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
elif grep -q ^"${SELECT_PARAM}:" ${FILE_PASSWD} &>/dev/null; then
show_user "${SELECT_PARAM}"
fi
done <<< "${PARAM_ALL// /$'\n'}"
}
# Получить запись вида конфигурации USERSHADOW из системного пользователя: USERSHADOW[superadmin]='2024-03-06:0:99999:7::'
# $1 # Варианты пользователей, можно указывать несколько через пробел, кроме nobody
# <пу cто > # Эквивалентно '@users @systems'
# @users # В с е пользователи кроме системных, MIN_UID и MAX_UID взять из /etc/login.defs
# @systems # Только системные, SYS_MIN_UID и SYS_MAX_UID взять из /etc/login.defs
# @all # В с е с UID от 0 до 65535
# <digital>-<digital> # В с е пользователи диапазона
# <username> # Имя пользователя
get_conf_usershadow_from_system(){
FILE_PASSWD="${ROOTFS}/etc/passwd"
FILE_SHADOW="${ROOTFS}/etc/shadow"
FILE_LOGINDEFS="${ROOTFS}/etc/login.defs"
DATA_FILE_SHADOW=$(cat ${FILE_SHADOW})
DATE_STARTUP_SYSTEM=$(date -d "$(cut -f1 -d. /proc/uptime) seconds ago" +'%Y-%m-%d') #"
# Дата когда был установлен пакет и впервые добавлены пользователи
DATE_SYSUSERS=$(stat --printf=%y ${ROOTFS}/usr/share/ublinux-sysusers/README | cut -d' ' -f1)
show_user(){
local SELECT_USER="$1"
[[ ${DATA_FILE_SHADOW} =~ ($'\n'|^)+${SELECT_USER}:([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*)($'\n'|$)+ ]] \
&& SELECT_PASSWORD=${BASH_REMATCH[2]} \
&& SELECT_LASTCHANGED=${BASH_REMATCH[3]} \
&& SELECT_MINDAY=${BASH_REMATCH[4]} \
&& SELECT_MAXDAY=${BASH_REMATCH[5]} \
&& SELECT_WARN=${BASH_REMATCH[6]} \
&& SELECT_INACTIVE=${BASH_REMATCH[7]} \
&& SELECT_EXPIRE=${BASH_REMATCH[8]} \
&& SELECT_NOUSE=${BASH_REMATCH[9]}
[[ -n ${SELECT_LASTCHANGED} ]] && SELECT_LASTCHANGED=$(date -d @$((${SELECT_LASTCHANGED}*24*60*60)) +'%Y-%m-%d')
[[ -n ${SELECT_EXPIRE} ]] && SELECT_LASTCHANGED=$(date -d @$((${SELECT_EXPIRE}*24*60*60)) +'%Y-%m-%d')
if [[ -z ${SELECT_MINDAY} && -z ${SELECT_MAXDAY} && -z ${SELECT_WARN} && -z ${SELECT_INACTIVE} && -z ${SELECT_EXPIRE} ]]; then
[[ ${SELECT_LASTCHANGED} == ${DATE_STARTUP_SYSTEM} ]] && return 0
# Сравнить дату впервые созданных пользователей с датой установки пакета ublinux-sysusers
[[ ${SELECT_LASTCHANGED} == ${DATE_SYSUSERS} ]] && return 0
# # Найти файл 'sysusers' где встречается пользователь и сравнить дату создания файла с датой создания пользователя
# FILE_NAME_SYSTEMD=$(grep -E "^u[[:blank:]]+${SELECT_USER}" ${ROOTFS}/usr/share/ublinux-sysusers/*.sysusers ${ROOTFS}/usr/share/ublinux-sysusers/dynamic/*.sysusers 2>/dev/null | cut -d: -f1 | xargs stat --printf=%y | cut -d' ' -f1;)
fi
echo "USERSHADOW[${SELECT_USER}]='${SELECT_LASTCHANGED}:${SELECT_MINDAY}:${SELECT_MAXDAY}:${SELECT_WARN}:${SELECT_INACTIVE}:${SELECT_EXPIRE}'"
}
local PARAM_ALL="$@"
[[ -n ${PARAM_ALL} ]] || PARAM_ALL="@users @systems"
while IFS= read -r SELECT_PARAM; do
if [[ ${SELECT_PARAM} == "@users" ]]; then
# В с е пользователи кроме системных
UID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*UID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
UID_MAX=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*UID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
while IFS= read -r SELECT_USER; do
show_user "${SELECT_USER}"
done < <(awk -F':' -v USER_MIN=${UID_MIN:=1000} -v USER_MAX=${UID_MAX:=65534} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
elif [[ ${SELECT_PARAM} == "@systems" ]]; then
# Пользователи системные
UID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_UID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
UID_MAX=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_UID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
while IFS= read -r SELECT_USER; do
show_user "${SELECT_USER}"
done < <(awk -F':' -v USER_MIN=${UID_MIN:=500} -v USER_MAX=${UID_MAX:=999} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
elif [[ ${SELECT_PARAM} == "@all" ]]; then
# В с е пользователи
while IFS= read -ru4 SELECT_USER; do
show_user "${SELECT_USER}"
done 4< <(awk -F':' '$1 != "nobody" { print $1}' ${FILE_PASSWD})
elif [[ ${SELECT_PARAM} =~ ^([[:digit:]]+)'-'*([[:digit:]]*)$ ]]; then
UID_MIN=${BASH_REMATCH[1]}
UID_MAX=${BASH_REMATCH[2]}
[[ -n ${UID_MAX} ]] || UID_MAX=${UID_MIN}
while IFS= read -r SELECT_USER; do
show_user "${SELECT_USER}"
done < <(awk -F':' -v USER_MIN=${UID_MIN:=1000} -v USER_MAX=${UID_MAX:=65534} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
elif grep -q ^"${SELECT_PARAM}:" ${FILE_PASSWD} &>/dev/null; then
show_user "${SELECT_PARAM}"
fi
done <<< "${PARAM_ALL// /$'\n'}"
}
############################################################################################################
# Получить запись вида конфигурации GROUPADD из систеных групп
# $1 # Варианты групп, можно указывать несколько через пробел, кроме nobody
# <пусто> # Эквивалентно '@groups @systems'
# @groups # В с е кроме системных, MIN_GID и MAX_GID взять из /etc/login.defs
# @systems # Только системные, SYS_MIN_GID и SYS_MAX_GID взять из /etc/login.defs
# @all # В с е c GID от 0 до 65535
# <digital>-<digital> # В с е пользователи диапазона
# <groupname> # Имя группы
get_conf_groupadd_from_system(){
FILE_GROUP="${ROOTFS}/etc/group"
FILE_GSHADOW="${ROOTFS}/etc/gshadow"
FILE_LOGINDEFS="${ROOTFS}/etc/login.defs"
DATA_FILE_GROUP=$(cat ${FILE_GROUP})
DATA_FILE_GSHADOW=$(cat ${FILE_GSHADOW})
# Загрузить файлы которые совпадают в каталогах /usr/lib/sysusers.d/ и /usr/share/ublinux-sysusers/. И загрузить которые уникальные в /usr/lib/sysusers.d/
DATA_SYSUSERS=$(cat \
$(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|') \
)
show_group(){
local SELECT_GROUP="$1"
local SELECT_PLAINPASSWORD SELECT_GID SELECT_MEMBERS
[[ ${DATA_FILE_GROUP} =~ ($'\n'|^)+${SELECT_GROUP}:([^$'\n']*):([^$'\n']*):([^$'\n']*)($'\n'|$)+ ]] \
&& SELECT_PLAINPASSWORD=${BASH_REMATCH[2]} \
&& SELECT_GID=${BASH_REMATCH[3]} \
&& SELECT_MEMBERS=${BASH_REMATCH[4]}
local SELECT_PASSWORD SELECT_ADMINISTRATORS SELECT_GMEMBERS
[[ ${DATA_FILE_GSHADOW} =~ ($'\n'|^)+${SELECT_GROUP}:([^$'\n']*):([^$'\n']*):([^$'\n']*)($'\n'|$)+ ]] \
&& SELECT_PASSWORD=${BASH_REMATCH[2]} \
&& SELECT_ADMINISTRATORS=${BASH_REMATCH[3]} \
&& SELECT_GMEMBERS=${BASH_REMATCH[4]}
[[ ${SELECT_PASSWORD} == "!*" && ${SELECT_PLAINPASSWORD} != "x" ]] && SELECT_PASSWORD="${SELECT_PLAINPASSWORD}"
local SELECT_OPTIONAL
if [[ ${SELECT_PASSWORD} == "!*" && ${SELECT_MEMBERS} == ${SELECT_GMEMBERS} && -z ${SELECT_ADMINISTRATORS} ]]; then
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
fi
echo "GROUPADD[${SELECT_GROUP}]='${SELECT_MEMBERS}:${SELECT_GID}:${SELECT_OPTIONAL}:${SELECT_ADMINISTRATORS}:${SELECT_PASSWORD}'"
}
local PARAM_ALL="$@"
[[ -n ${PARAM_ALL} ]] || PARAM_ALL="@groups @systems"
while IFS= read -r SELECT_PARAM; do
if [[ ${SELECT_PARAM} == "@groups" ]]; then
# В с е группы кроме системных
GID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*GID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
GID_MAX=$([[ $(cat "${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:=65534} '$3 >= GROUP_MIN && $3 <= GROUP_MAX && $1 != "nobody" { print $1}' ${FILE_GROUP})
elif [[ ${SELECT_PARAM} == "@systems" ]]; then
# Группы системные
GID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_GID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
GID_MAX=$([[ $(cat "${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
# В с е группы
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
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:=65534} '$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}"
fi
done <<< "${PARAM_ALL// /$'\n'}"
}
#####################################################################################
#####################################################################################
detectDE(){
detectDE(){
[[ -z ${SESSION} && ${KDE_FULL_SESSION} == true ]] && SESSION=kde
[[ -z ${SESSION} && ${KDE_FULL_SESSION} == true ]] && SESSION=kde
[[ -z ${SESSION} && ${XDG_CURRENT_DESKTOP} == XFCE ]] && SESSION=xfce
[[ -z ${SESSION} && ${XDG_CURRENT_DESKTOP} == XFCE ]] && SESSION=xfce