diff --git a/ublinux/functions b/ublinux/functions index a2cee49..38d3e3d 100755 --- a/ublinux/functions +++ b/ublinux/functions @@ -812,7 +812,10 @@ user_remove_group(){ ##################################################################################### # Получить запись вида конфигурации USERADD из системного пользователя -# $1 # Варианты пользователей, можно указывать несколько через пробел, кроме nobody +# Если системный пользователь имеет настройки аналогичные настройкам создаваемого пользователя через .sysusers, то не выводим +# $1 # Опции не обязательные +# --not-only-changes # Отключить проверку изменений .sysusers, выводить любого пользователя системы +# $2 # Варианты пользователей, можно указывать несколько через пробел, кроме nobody # <пуcто> # Эквивалентно '@users @systems' # @users # Все пользователи кроме системных, MIN_UID и MAX_UID взять из /etc/login.defs # @systems # Только системные, SYS_MIN_UID и SYS_MAX_UID взять из /etc/login.defs @@ -826,11 +829,6 @@ get_conf_useradd_from_system(){ local FILE_LOGINDEFS="${ROOTFS}/etc/login.defs" local DATA_FILE_PASSWD=$(< ${FILE_PASSWD}) local DATA_FILE_SHADOW=$(< ${FILE_SHADOW}) - # Загрузить файлы которые совпадают в каталогах /usr/lib/sysusers.d/ и /usr/share/ublinux-sysusers/. И загрузить которые уникальные в /usr/lib/sysusers.d/ - local 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|') \ - ) local DEFAULT_HOME="/home" local DEFAULT_SHELL="/bin/bash" show_user(){ @@ -857,7 +855,12 @@ get_conf_useradd_from_system(){ SELECT_EXTRAGROUPS=$(comm --nocheck-order -13 <(printf "%s\n" ${USERGROUPS//,/ } ${DEFAULTGROUP//,/ } | sort -u) <(printf "%s\n" $(${CHROOT} id -nrG ${SELECT_USER} | sed -E 's/([^ ]*) (.*)/\2/') | sort -u) | xargs | tr " " ",") #' [[ -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 + if [[ -z ${NOT_ONLY_CHANGES} && ${SELECT_PASSWORD} == @("!*"|"!") ]]; then + # Загрузить файлы которые совпадают в каталогах /usr/lib/sysusers.d/ и /usr/share/ublinux-sysusers/. И загрузить которые уникальные в /usr/lib/sysusers.d/ + local 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|') \ + ) 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" @@ -890,6 +893,7 @@ get_conf_useradd_from_system(){ # [[ $(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 # } + [[ ${1} == "--not-only-changes" ]] && local NOT_ONLY_CHANGES=yes && shift local PARAM_ALL="$@" [[ -n ${PARAM_ALL} ]] || PARAM_ALL="@users @systems" while IFS= read -r SELECT_PARAM; do @@ -926,7 +930,10 @@ get_conf_useradd_from_system(){ } # Получить запись вида конфигурации USERSHADOW из системного пользователя: USERSHADOW[superadmin]='2024-03-06:0:99999:7::' -# $1 # Варианты пользователей, можно указывать несколько через пробел, кроме nobody +# Если системный пользователь имеет настройки аналогичные настройкам создаваемого пользователя через .sysusers, то не выводим +# $1 # Опции не обязательные +# --not-only-changes # Отключить проверку изменений .sysusers, выводить любого пользователя системы +# $2 # Варианты пользователей, можно указывать несколько через пробел, кроме nobody # <пуcто> # Эквивалентно '@users @systems' # @users # Все пользователи кроме системных, MIN_UID и MAX_UID взять из /etc/login.defs # @systems # Только системные, SYS_MIN_UID и SYS_MAX_UID взять из /etc/login.defs @@ -934,13 +941,10 @@ get_conf_useradd_from_system(){ # - # Все пользователи диапазона # # Имя пользователя get_conf_usershadow_from_system(){ - FILE_PASSWD="${ROOTFS}/etc/passwd" - FILE_SHADOW="${ROOTFS}/etc/shadow" - FILE_LOGINDEFS="${ROOTFS}/etc/login.defs" - DATA_FILE_SHADOW=$(< ${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) + local FILE_PASSWD="${ROOTFS}/etc/passwd" + local FILE_SHADOW="${ROOTFS}/etc/shadow" + local FILE_LOGINDEFS="${ROOTFS}/etc/login.defs" + local DATA_FILE_SHADOW=$(< ${FILE_SHADOW}) show_user(){ local SELECT_USER="$1" [[ ${DATA_FILE_SHADOW} =~ ($'\n'|^)+${SELECT_USER}:([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*)($'\n'|$)+ ]] \ @@ -954,7 +958,10 @@ get_conf_usershadow_from_system(){ && 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 + 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') #" + # Дата когда был установлен пакет и впервые добавлены пользователи + 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 @@ -963,6 +970,7 @@ get_conf_usershadow_from_system(){ fi echo "USERSHADOW[${SELECT_USER}]='${SELECT_LASTCHANGED}:${SELECT_MINDAY}:${SELECT_MAXDAY}:${SELECT_WARN}:${SELECT_INACTIVE}:${SELECT_EXPIRE}'" } + [[ ${1} == "--not-only-changes" ]] && local NOT_ONLY_CHANGES=yes && shift local PARAM_ALL="$@" [[ -n ${PARAM_ALL} ]] || PARAM_ALL="@users @systems" while IFS= read -r SELECT_PARAM; do @@ -999,7 +1007,10 @@ get_conf_usershadow_from_system(){ } # Получить запись вида конфигурации GROUPADD из систеных групп -# $1 # Варианты групп, можно указывать несколько через пробел, кроме nobody +# Если системная группа имеет настройки аналогичные настройкам создаваемой группы через .sysusers, то не выводим +# $1 # Опции не обязательные +# --not-only-changes # Отключить проверку изменений .sysusers, выводить любую группу системы +# $2 # Варианты групп, можно указывать несколько через пробел, кроме nobody # <пусто> # Эквивалентно '@groups @systems' # @groups # Все кроме системных, MIN_GID и MAX_GID взять из /etc/login.defs # @systems # Только системные, SYS_MIN_GID и SYS_MAX_GID взять из /etc/login.defs @@ -1007,16 +1018,11 @@ get_conf_usershadow_from_system(){ # - # Все пользователи диапазона # # Имя группы get_conf_groupadd_from_system(){ - FILE_GROUP="${ROOTFS}/etc/group" - FILE_GSHADOW="${ROOTFS}/etc/gshadow" - FILE_LOGINDEFS="${ROOTFS}/etc/login.defs" - DATA_FILE_GROUP=$(< ${FILE_GROUP}) - DATA_FILE_GSHADOW=$(< ${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|') \ - ) + local FILE_GROUP="${ROOTFS}/etc/group" + local FILE_GSHADOW="${ROOTFS}/etc/gshadow" + local FILE_LOGINDEFS="${ROOTFS}/etc/login.defs" + local DATA_FILE_GROUP=$(< ${FILE_GROUP}) + local DATA_FILE_GSHADOW=$(< ${FILE_GSHADOW}) show_group(){ local SELECT_GROUP="$1" local SELECT_PLAINPASSWORD SELECT_GID SELECT_MEMBERS @@ -1031,13 +1037,19 @@ get_conf_groupadd_from_system(){ && 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}) #" + if [[ -z ${NOT_ONLY_CHANGES} && ${SELECT_PASSWORD} == "!*" && ${SELECT_MEMBERS} == ${SELECT_GMEMBERS} && -z ${SELECT_ADMINISTRATORS} ]]; then + # Загрузить файлы которые совпадают в каталогах /usr/lib/sysusers.d/ и /usr/share/ublinux-sysusers/. И загрузить которые уникальные в /usr/lib/sysusers.d/ + local 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|') \ + ) + 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 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