You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ublinux-init/ublinux/rc.halt.pre/25-accounts-sync

125 lines
6.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/bin/env bash
ENABLED=yes
[[ ${ENABLED} == "yes" ]] || exit 0
DEBUGMODE=no
unset ROOTFS; [[ -d /usr/lib/ublinux ]] || 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}/users; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
# Синхронизировать пользователе системы в глобальную конфигурацию USERADD и USERSHADOW
## Синхронизация пользователей системы /etc/passwd с глобальной конфигурацией
## USERADD_SYNC[user_name]='boot,shutdown'
## user_name # Имя пользователя, необязательное поле. Если не указано, то применяется для всех пользователей
## boot # При загрузке системы принудительно применить глобальную конфигурацию на пользователя
## shutdown # При завершении работы системы синхронизировать указанных пользователей в системе с глобальной конфигурацией
exec_useradd_sync(){
FILE_PASSWD="${ROOTFS}/etc/passwd"
FILE_SHADOW="${ROOTFS}/etc/shadow"
sync_user(){
local SELECT_USER="$1"
local SELECT_OPTIONAL=
local SELECT_EXTRAGROUPS=
[[ $(grep ^"${SELECT_USER}:" ${FILE_PASSWD}) =~ ^(.*):(.*):(.*):(.*):(.*):(.*):(.*)$ ]] \
&& SELECT_PLAINPASSWORD=${BASH_REMATCH[2]} \
&& SELECT_UID=${BASH_REMATCH[3]} \
&& SELECT_GROUP=${BASH_REMATCH[4]} \
&& SELECT_GECOS=${BASH_REMATCH[5]} \
&& SELECT_HOMEDIR=${BASH_REMATCH[6]} \
&& SELECT_SHELL=${BASH_REMATCH[7]}
[[ $(grep ^"${SELECT_USER}:" ${FILE_SHADOW}) =~ ^(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*):(.*)$ ]] \
&& 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')
while IFS= read -r EXTRAGROUP; do [[ "${USERGROUPS},nobody" =~ ${EXTRAGROUP} ]] || SELECT_EXTRAGROUPS+=",${EXTRAGROUP}"; done < <(tr ' ' '\n' <<< $(id -nrG ${SELECT_USER}))
SELECT_EXTRAGROUPS=${SELECT_EXTRAGROUPS:1}
[[ -n ${SELECT_HOMEDIR} && ${SELECT_HOMEDIR} != "/home/${SELECT_USER}" ]] && SELECT_OPTIONAL+=" --home-dir ${SELECT_HOMEDIR}"
[[ -n ${SELECT_SHELL} && ${SELECT_SHELL} != "/bin/bash" ]] && SELECT_OPTIONAL+=" --shell ${SELECT_SHELL}"
${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] USERADD[${SELECT_USER}]="${SELECT_GECOS}:${SELECT_UID}:${SELECT_GROUP}:${SELECT_EXTRAGROUPS}:${SELECT_OPTIONAL}:${SELECT_PASSWORD}"
${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] USERSHADOW[${SELECT_USER}]="${SELECT_LASTCHANGED}:${SELECT_MINDAY}:${SELECT_MAXDAY}:${SELECT_WARN}:${SELECT_INACTIVE}:${SELECT_EXPIRE}"
}
if [[ ${USERADD_SYNC} =~ 'shutdown' ]]; then
# Все пользователи
UID_MIN=$([[ $(cat "${ROOTFS}/etc/login.defs") =~ [^#[^:space:]]*UID_MIN[[:space:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
while IFS= read -r SELECT_USER; do
sync_user "${SELECT_USER}"
done < <(awk -F':' -v USER_MIN=${UID_MIN} '$3 >= USER_MIN && $1 != "nobody" { print $1}' ${FILE_PASSWD})
elif [[ ${#USERADD_SYNC[@]} != 0 ]]; then
while IFS= read -u3 SELECT_USER; do
[[ ${USERADD_SYNC[${SELECT_USER}]} =~ 'shutdown' ]] && sync_user ${SELECT_USER}
done 3< <(printf "%s\n" "${!USERADD_SYNC[@]}")
fi
}
# Синхронизировать группы системы в глобальную конфигурацию GROUPADD
## Синхронизация группы системы /etc/groups и их параметры /etc/gshadow с глобальной конфигурацией
## GROUPADD_SYNC[group_name]='boot,shutdown'
## group_name # Имя группы, необязательное поле. Если не указано, то применяется для всех групп
## boot # При загрузке системы принудительно применить глобальную конфигурацию на группу
## shutdown # При завершении работы системы синхронизировать указанные группы в системе с глобальной конфигурацией
exec_groupadd_sync(){
FILE_GROUP="${ROOTFS}/etc/group"
FILE_GSHADOW="${ROOTFS}/etc/gshadow"
sync_group(){
local SELECT_GROUP="$1"
local SELECT_OPTIONAL=
[[ $(grep ^"${SELECT_GROUP}:" ${FILE_GROUP}) =~ ^(.*):(.*):(.*):(.*)$ ]] \
&& SELECT_GPASSWORD=${BASH_REMATCH[2]} \
&& SELECT_GID=${BASH_REMATCH[3]} \
&& SELECT_GUSERS=${BASH_REMATCH[4]}
[[ $(grep ^"${SELECT_GROUP}:" ${FILE_GSHADOW}) =~ ^(.*):(.*):(.*):(.*)$ ]] \
&& SELECT_PASSWORD=${BASH_REMATCH[2]} \
&& SELECT_ADMINISTRATORS=${BASH_REMATCH[3]} \
&& SELECT_SUSERS=${BASH_REMATCH[4]} \
${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] GROUPADD[${SELECT_GROUP}]="${SELECT_GUSERS}:${SELECT_GID}::${SELECT_ADMINISTRATORS}:${SELECT_PASSWORD}"
}
if [[ ${GROUPADD_SYNC} =~ 'shutdown' ]]; then
# Все группы
GID_MIN=$([[ $(cat "${ROOTFS}/etc/login.defs") =~ [^#[^:space:]]*GID_MIN[[:space:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
while IFS= read -r SELECT_GROUP; do
sync_group "${SELECT_GROUP}"
done < <(awk -F':' -v GROUP_MIN=${GID_MIN} '$3 >= GROUP_MIN && $1 != "nobody" { print $1}' ${FILE_GROUP})
elif [[ ${#GROUPADD_SYNC[@]} != 0 ]]; then
while IFS= read -u3 SELECT_GROUP; do
[[ ${GROUPADD_SYNC[${SELECT_GROUP}]} =~ 'shutdown' ]] && sync_group ${SELECT_GROUP}
done 3< <(printf "%s\n" "${!GROUPADD_SYNC[@]}")
fi
}
################
##### 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
while [[ $# -gt 0 ]]; do
declare -f ${1} &>/dev/null && FUNCTION+="; ${1}" && shift || { FUNCTION+=" \"${1}\"" && shift; }
done
eval ${FUNCTION#*; }
fi