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

## Синхронизация пользователей системы /etc/passwd и их параметры /etc/shadow с глобальной конфигурацией
## USERADD_SYNC='boot,shutdown,shutdown@all,shutdown@users,shutdown@systems,shutdown@<min>-<max>,shutdown@<uid>'
##   boot               # При загрузке системы принудительно применить глобальную конфигурацию на пользователя
##   shutdown           # Аналогичен shutdown@users + shutdown@systems
##   shutdown@all       # При завершении работы системы синхронизировать всех пользователей в системе с глобальной конфигурацией
##   shutdown@users     # При завершении работы системы синхронизировать пользователей 1000<=UID<=6000 в системе с глобальной конфигурацией
##   shutdown@systems   # При завершении работы системы синхронизировать системных пользователей 500<=UID<=999 в системе с глобальной конфигурацией
##   shutdown@<min>-<max> # При завершении работы системы синхронизировать диапазон UID пользователей в системе с глобальной конфигурацией
##   shutdown@<uid>     # При завершении работы системы синхронизировать UID пользователя в системе с глобальной конфигурацией
## USERADD_SYNC=boot,shutdown
##
## USERADD_SYNC[<user_name>]='boot,shutdown'
##   <user_name>        # Имя пользователя, необязательное поле. Если не указано, то применяется для всех пользователей
##   boot               # При загрузке системы принудительно применить глобальную конфигурацию на пользователя
##   shutdown           # При завершении работы системы синхронизировать указанного пользователя в системе с глобальной конфигурацией
## USERADD_SYNC[superadmin]=boot,shutdown
exec_useradd_sync(){
    set_ubconfig(){
	local PARAM=$1
	local GET_USERADD=$(get_conf_useradd_from_system ${PARAM})
	local GET_USERSHADOW=$(get_conf_usershadow_from_system ${PARAM})
	${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] ${GET_USERADD}
	${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] ${GET_USERSHADOW}
	[[ -n ${GET_USERADD} ]] && eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERADD}
	[[ -n ${GET_USERSHADOW} ]] && eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_USERSHADOW}
    }
    if [[ ${USERADD_SYNC} =~ 'shutdown@all' ]]; then
	set_ubconfig "@all"
    elif [[ ${USERADD_SYNC} =~ 'shutdown@users' ]]; then
	set_ubconfig "@users"
    elif [[ ${USERADD_SYNC} =~ 'shutdown@systems' ]]; then
	set_ubconfig "@systems"
    elif [[ ${USERADD_SYNC} =~ ^'shutdown@'(([[:digit:]]+)'-'*([[:digit:]]*))$ ]]; then
	set_ubconfig "${BASH_REMATCH[1]}"
    elif [[ ${USERADD_SYNC} =~ 'shutdown' ]]; then
	set_ubconfig
    fi
    if [[ "$(declare -p USERADD_SYNC 2>/dev/null)" == "declare -A"* ]]; then
	while IFS= read -u3 SELECT_USER; do
	    # В массиве 0 запись игнорируем, т.к. это параметр не ассоциативного массива
	    if [[ ${SELECT_USER} != 0 && ${USERADD_SYNC[${SELECT_USER}]} =~ 'shutdown' ]]; then
		set_ubconfig "${SELECT_USER}"
	    fi 
	done 3< <(printf "%s\n" "${!USERADD_SYNC[@]}")
    fi
}

## Синхронизация группы системы /etc/groups и их параметры /etc/gshadow с глобальной конфигурацией
## GROUPADD_SYNC='shutdown,shutdown@all,shutdown@users,shutdown@systems,shutdown@<min>-<max>,shutdown@<gid>'
##   shutdown           # Аналогичен shutdown@users + shutdown@systems
##   shutdown@all       # При завершении работы системы синхронизировать все группы в системе с глобальной конфигурацией
##   shutdown@users     # При завершении работы системы синхронизировать группы 1000<=GID<=6000 в системе с глобальной конфигурацией
##   shutdown@systems   # При завершении работы системы синхронизировать системные группы 500<=GID<=999 в системе с глобальной конфигурацией
##   shutdown@<min>-<max> # При завершении работы системы синхронизировать диапазон GID групп в системе с глобальной конфигурацией
##   shutdown@<gid>     # При завершении работы системы синхронизировать GID группы в системе с глобальной конфигурацией
## GROUPADD_SYNC=shutdown
##
## GROUPADD_SYNC[group_name]='shutdown'
##   group_name         # Имя группы, необязательное поле. Если не указано, то применяется для всех групп
##   shutdown           # При завершении работы системы синхронизировать указанную группу в системе с глобальной конфигурацией
## GROUPADD_SYNC[users]='shutdown'
exec_groupadd_sync(){
    set_ubconfig(){
	local PARAM=$1
	local GET_GROUPADD=$(get_conf_groupadd_from_system ${PARAM})
	${ROOTFS}/usr/bin/ubconfig --quiet --target global remove [users] GROUPADD[*]
	[[ -n ${GET_GROUPADD} ]] && eval ${ROOTFS}/usr/bin/ubconfig --quiet --target global set [users] ${GET_GROUPADD}
    }
    if [[ ${GROUPADD_SYNC} =~ 'shutdown@all' ]]; then
	set_ubconfig "@all"
    elif [[ ${GROUPADD_SYNC} =~ 'shutdown@users' ]]; then
	set_ubconfig "@users"
    elif [[ ${GROUPADD_SYNC} =~ 'shutdown@systems' ]]; then
	set_ubconfig "@systems"
    elif [[ ${GROUPADD_SYNC} =~ ^'shutdown@'(([[:digit:]]+)'-'*([[:digit:]]*))$ ]]; then
	set_ubconfig "${BASH_REMATCH[1]}"
    elif [[ ${GROUPADD_SYNC} =~ 'shutdown' ]]; then
	set_ubconfig
    fi
    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}"
	    fi
	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
	FUNCTION=
	while [[ $# -gt 0 ]]; do
	    [[ -z ${1} ]] || { declare -f ${1} &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'"; }
	    shift 
	done
	eval ${FUNCTION#*; }
    fi

