#!/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

