#!/usr/bin/env bash
#
#   Script name: ubconfig
#   Description: Script for configure UBLinux (ublinux.ini)
#   GitLab: https://gitlab.ublinux.ru/
#   Author: Dmitry Razumov asmeron@ublinux.ru
#   Contributors: support@ublinux.ru
#
#   Copyright (c) 2021-2023 UBLinux Development Team <support@ublinux.ru>
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.

VERSION_SCRIPT=2.6

# Exit Immediately if a command fails
#set -o errexit

# Extended pattern matching: https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching
#shopt -s extglob

#################################
###   :::   C O L O R S   :::   #
#################################
set_color(){
#http://abload.de/img/bash-color-chartmxjbp.png
    export BBC=$'\e[1;34m'
    export RBC=$'\e[1;31m'
    export WBC=$'\e[1m'
    export EC=$'\e[0m'

    export txtblk='\033[0;30m' # Black - Regular
    export txtred='\033[0;31m' # Red			# prompt: error color
    export txtgrn='\033[0;32m' # Green			# prompt: success color
    export txtylw='\033[0;33m' # Yellow			# prompt: waring color
    export txtblu='\033[0;34m' # Blue			
    export txtpur='\033[0;35m' # Purple
    export txtcyn='\033[0;36m' # Cyan			# prompt: info color
    export txtwht='\033[0;37m' # White
    export bldblk='\033[1;30m' # Black - Bold
    export bldred='\033[1;31m' # Red			# prompt: bold error color
    export bldgrn='\033[1;32m' # Green			# prompt: bold success color
    export bldylw="\033[1;33m" # Yellow                 # prompt: bold warning color
    export bldblu='\033[1;34m' # Blue				
    export bldpur='\033[1;35m' # Purple
    export bldcyn="\033[1;36m" # Cyan                   # prompt: bold info color
    export bldwht="\033[1;37m" # White			# prompt: bold default color

    export undblk='\033[4;30m' # Black - Underline
    export undred='\033[4;31m' # Red

    export bakblk='\033[40m'   # Black - Background
    export bakred='\033[41m'   # Red
    export badgrn='\033[42m'   # Green

    export txtrst='\033[0m'    # Text Reset		# prompt: default color
}

#######################################
###   :::   F U N C T I O N S   :::   #
#######################################

check_root(){
    [[ ${DEBUG} == @(yes|y|1) ]] && return 0
    if [[ ${EUID:-$(id -u)} > 0 ]]; then
	case ${1} in
	    -w  | --warning)	  shift; prompt -w "Please run as root! ${@}" && return 1 ;;
	    -wq | --warning-quit) shift; prompt -wq "Please run as root!" ;;
    	    *) 			  prompt -wq "Please run as root!" ;;
        esac
    fi
}

# Check command availability
has_command(){ command -v $1 &> /dev/null; }

# echo like ... with flag type and display message colors
prompt(){
    if [[ -z ${QUIET} ]]; then 
	case ${1} in
	    -s  | --success)	  shift; echo -e "${txtgrn}${@}${txtrst}" ;;				# print success message
	    -sq | --success-quit) shift; echo -e "${txtgrn}${@}${txtrst}"; exit 1 ;;			# print success message
	    -e  | --error)   	  shift; echo -e "${txtred}ERROR:${@}${txtrst}" ;;			# print error message
	    -eq | --error-quit)   shift; echo -e "${txtred}ERROR:${@}${txtrst}"; exit 1 ;;		# print error message
	    -w  | --warning) 	  shift; echo -e "${txtylw}WARNING:${bldwht}${@}${txtrst}" ;;		# print warning message
	    -wq | --warning-quit) shift; echo -e "${txtylw}WARNING:${bldwht}${@}${txtrst}"; exit 1 ;;	# print warning message
	    -i  | --info)    	  shift; echo -e "${txtcyn}INFO:${txtcyn}${@}${txtrst}" ;;		# print info message
	    -iq | --info-quit)    shift; echo -e "${txtcyn}INFO:${txtcyn}${@}${txtrst}"; exit 1 ;;	# print info message
	    *)    		  echo -e "$@" ;;							# print all message
	esac
    else
	case ${1} in
	    -s  | --success)	  true ;;	# print success message
	    -sq | --success-quit) exit 1 ;;	# print success message
	    -e  | --error)   	  true ;;	# print error message
	    -eq | --error-quit)   exit 1 ;;	# print error message
	    -w  | --warning) 	  true ;;	# print warning message
	    -wq | --warning-quit) exit 1 ;;	# print warning message
	    -i  | --info)    	  true ;;	# print info message
	    -iq | --info-quit)    exit 1 ;;	# print info message
	    *)    		  true ;;	# print all message
	esac
    fi
}

usage_version(){
    printf "%s  %s\n" "${0##*/}" "version: ${VERSION_SCRIPT}"
}
usage(){
    cat <<EOF
Script for configure UBLinux
Author: Dmitry Razumov asmeron@ublinux.ru

Usage:  ${0##*/} [OPTIONS...] <COMMAND> <SECTION> <PARAM1>=<value> <PARAM2>=<value> <PARAMn>=<value>

Commands:
  get		Get configuration option
  set		Set configuration option
  remove	Remove option of a configuration
  update	Update configuration to new version

Meta Commands:
  help          Show this help

Options for get:
  -r, --raw	   Show only values, without name variables
  -s, --source=<SOURCE>
   		   Configuration as source
    *glo | global  Configuration file as source: ${FILE_UBLINUX_NAME}
     sys | system  Configuration file as source: ${SYSCONF}/*
     def | default Configuration file as source: /usr/lib/ublinux/default
     <file>        Configuration file as source, global ${FILE_UBLINUX_NAME} format: <file.ini>
  -d, --default    Before loading the source, additionally include the default 
		   settings file /usr/lib/ublinux/default
  -c, --compare    Compare configuration, system and global configuration files
  If the <SECTION> is specified:
    [] | [*]	   Select all sections
  If the <PARAM> is specified:
    /  | '*'       Select all variables in the section

Options for command <set>:
  -t, --target	   Configuration as target
    *		   Without the specified option, are used *global *system
    *glo | global  Only configuration file as target: ${FILE_UBLINUX_NAME}
    *sys | system  Only configuration file as target: ${SYSCONF}/*
     <file>        Configuration file as target, global ${FILE_UBLINUX_NAME} format: <file.ini>
  -n, --noexecute  Do not execute parameter commands for "system configuration"
  You can use the following operators to set parameter values:
     +=		   Add a value to the end of parameters
     ++=	   Add the value to the parameter list, separated by comma (,) and change dubles (;) (,) (sapace) to comma (,)
     -=		   Remove the first specified value from the parameter
     --=	   Remove all occurrences of the specified value from the parameter list and change dubles (;) (,) (sapace) to comma (,)
  If the <SECTION> is specified:
    [] | [*]	   Select the '${SYSCONF}/config' section
  If the <PARAMETER> is the first specified character:
    +		   An intelligent insertion parameter that indicates adding a line to the end of the file if it is not already in the file
    |		   An intelligent insertion parameter that indicates adding string to end of file in any case
    -		   An intelligent insertion parameter that indicates removing all string with expression (see sed). Symbols .* matches all strings in file

Options for command <remove>:
  -t, --target
    *		   Without the specified option, are used *global *system
    *glo | global  Only configuration file as target: ${FILE_UBLINUX_NAME}
    *sys | system  Only configuration file as target: ${SYSCONF}/*
     <file>        Configuration file as target, global ${FILE_UBLINUX_NAME} format: <file.ini>
  -n, --noexecute  Do not execute parameter commands for "system configuration"
  If the <SECTION> is specified:
    [] | [*]	   Select all sections
  If the <PARAM> is specified:
    /  | '*'       Delete all variables in the section
    // | '**'	   Delete all variables and comments in the section   

Options for command <update>:
  -t, --target
    *		   Without the specified option, are used *global *system
    *glo | global  Only configuration file as target: ${FILE_UBLINUX_NAME}
    *sys | system  Only configuration file as target: ${SYSCONF}/*
     <file>        Configuration file as target, global ${FILE_UBLINUX_NAME} format: <file.ini>

Options:
      --nocolor	   Disable color
  -q, --quiet	   Quiet mode
  -h, --help	   Show this help
  -h, --help=<SECTION>
	    	   Show help by section
  -V, --version	   Show package version

Known sections:
  [config]	${SYSCONF}/config
  [system]	${SYSCONF}/system
  [users]	${SYSCONF}/users
  [boot]	${SYSCONF}/boot
  [save] 	${SYSCONF}/save
  [network] 	${SYSCONF}/network
  [security] 	${SYSCONF}/security
  [kiosk]	${SYSCONF}/kiosk
  [desktop]	${SYSCONF}/desktop
  [video]	${SYSCONF}/video
  [theme]	${SYSCONF}/theme
  [steam]	${SYSCONF}/steam
  [clock]	${SYSCONF}/clock
  [locale]	${SYSCONF}/locale
  [keyboard]	${SYSCONF}/keyboard
  [ubm]		${SYSCONF}/ubm
  [nfs-server]	${SYSCONF}/nfs-server
  [nfs-common]	${SYSCONF}/nfs-common
  [proxy]	${SYSCONF}/proxy

Examples:
${0##*/} get [system] HOSTNAME
${0##*/} get [clock] ZONE HWCLOCK_SYNC
${0##*/} get [boot] GRUB_PASSWORD[*]
${0##*/} get / DOMAIN
${0##*/} --raw get / DOMAIN
${0##*/} get /
${0##*/} --source default get [] ZONE
${0##*/} --source global get /
${0##*/} --source system get /
${0##*/} --compare get [config]
${0##*/} --default --source system get [users] DEFAULTPASSWD
${0##*/} set [system] HOSTNAME=myhost
${0##*/} set [boot] GRUB_CMDLINE_LINUX+=" nomodeset"
${0##*/} set [boot] GRUB_CMDLINE_LINUX-="nomodeset"
${0##*/} set [network] DOMAIN=domain.ru NETWORK[all]="+ipv4.dns 192.168.1.1"
${0##*/} --target system set [clock] ZONE="Asia/Omsk" HWCLOCK_SYNC=localtime
${0##*/} set [/etc/myconfig] '+FILTER_STR'
${0##*/} set [/etc/myconfig] '|NOFILTER_STR'
${0##*/} set [/etc/myconfig] '-DEL_STR'
${0##*/} remove network DOMAIN
${0##*/} remove network DOMAIN[] NETWORK[]
${0##*/} remove network DOMAIN[*]
EOF
}
usage_config(){
    cat <<EOF
Configure UBLinux
Usage:  ${0##*/} {COMMAND} {SECTION} [OPTIONS...] ...

Options section: config
  HOSTNAME=<HOSTNAME>   Host name | Имя машины
EOF
}
usage_network(){
    cat <<EOF
Configure UBLinux
Usage:  ${0##*/} {COMMAND} {SECTION} [OPTIONS...] ...

Options section: network
  DOMAIN=<DOMAIN>	Domain configuration | Подключение к AD серверу

EOF
}
usage_kiosk(){
    cat <<EOF
Configure UBLinux
Usage:  ${0##*/} {COMMAND} {SECTION} [OPTIONS...] ...

Options section: kiosk
    cat <<EOF
EOF
}
help(){
    usage_version
    [[ -n $1 ]] || usage
    [[ $1 == "config" ]] && usage_config
    [[ $1 == "network" ]] && usage_network
    [[ $1 == "kiosk" ]] && usage_kiosk
    exit 0
}
arguments(){
# Pre-process options to:
# - expand -xyz into -x -y -z
# - expand --longopt=arg into --longopt arg
    local ARGV=()
    local END_OF_OPT=
    while [[ $# -gt 0 ]]; do
	arg="$1"; shift
	case "${END_OF_OPT}${arg}" in
	    get|GET|set|SET|remove|REMOVE|update|UPDATE) ARGV+=("${arg}"); END_OF_OPT=1 ;;
	    --)		ARGV+=("${arg}"); END_OF_OPT=1 ;;
	    --*=*)	ARGV+=("${arg%%=*}" "${arg#*=}") ;;
	    --*)	ARGV+=("${arg}") ;;
	    -*) 	for i in $(seq 2 ${#arg}); do ARGV+=("-${arg:i-1:1}"); done ;;
	    *)		ARGV+=("${arg}") ;;
	esac
    done
    # Apply pre-processed options
    set -- "${ARGV[@]}"
    # Parse options
    local END_OF_OPT=
    local POSITIONAL_ARGS=()
    [[ -z $@ ]] && usage && exit 0
    while [[ $# -gt 0 ]]; do
	case "${END_OF_OPT}${1}" in
	    get | GET)		   COMMAND="${1,,}"; END_OF_OPT=1 ;;
	    set | SET)		   COMMAND="${1,,}"; END_OF_OPT=1 ;;
	    remove | REMOVE)	   COMMAND="${1,,}"; END_OF_OPT=1 ;;
	    update | UPDATE)	   COMMAND="${1,,}"; END_OF_OPT=1 ;;
	    -r | --raw)    	   RAW=1 ;;	    
	    -c | --compare)    	   COMPARE=1 ;;
	    -s | --source) 	   shift; SOURCE="$1" ;;
	    -d | --default)	   LOAD_DEFAULT=1 ;;
	    -t | --target) 	   shift; TARGET="$1" ;;
	    -n | --noexecute) 	   SET_NOEXECUTE=1 ;;
	    -h | --help | help)	   shift; help $1;;
	    -q | --quiet)     	   QUIET="--quiet"; QUIET_SYSTEMCTL="--quiet"; QUIET_ARG="-q" ;;
	         --nocolor)    	   NOCOLOR="--nocolor" ;;
	         --debug)	   DEBUG=1 ;;
	    -V | --version)	   usage_version; exit 0 ;;
	    --stdin)        	   READ_STDIN=1 ;;
	    --)             	   END_OF_OPT=1 ;;
	    -*|--*)         	   prompt -w "Unrecognized argument, skiped: $1" >&2  ;;
	    *)              	   POSITIONAL_ARGS+=("$1") ;;
	esac
	shift
    done
    # Restore positional parameters
    set -- "${POSITIONAL_ARGS[@]}"
    REQUEST_ARGS=("${POSITIONAL_ARGS[@]}")
    [[ -n ${SOURCE} ]] && case "${SOURCE}" in
	glob | global)	SOURCE="global" ;;
	sys  | system)	SOURCE="system" ;;
	def  | default)	SOURCE="default" ;;
	*)		[[ -f ${SOURCE} ]] || prompt -eq " Unrecognized sources !" ;;
    esac
    [[ -n ${TARGET} ]] && case "${TARGET}" in
	glob | global)	TARGET="global" ;;
	sys  | system)	TARGET="system" ;;
	*)		[[ -f ${TARGET} ]] || prompt -eq " Unrecognized target !" ;;
    esac
    if [[ ${COMMAND} == 'get' ]]; then 
	[[ -z ${SOURCE} ]] && SOURCE="global"
	[[ ${SOURCE} == "global" || -n ${COMPARE} ]] && check_root -wq
    elif [[ ${COMMAND} == 'set' || ${COMMAND} == 'remove' ]]; then
	[[ -w ${TARGET} ]] || check_root -wq
    fi 
}

prepare_section(){
    unset NULL1 SECTION_NAME SECTION_MOD SECTION_EXEC NULL2 
    unset MODE
    SKIP_ARGS_SECTION=0
    while [[ $# -gt 0 ]]; do
	ARG_1="$1"
	if [[ ${ARG_1} =~ ^[[:space:]]*'['.*']'[[:space:]]*[0-9augorstwxX,=+-]*[[:space:]]*'['.*']'*$ ]]; then
	    ## Варианты:
	    ##	[/etc/ublinux/test-1]644 [chroot .]
	    ##	[/etc/ublinux/test-1] a+x [/usr/bin/bash]
	    ##	[/etc/ublinux/test-1]u+rwx,go+u-w[/usr/bin/bash]
	    ##	[/etc/ublinux/test-1] [chroot .]
	    ##	[/etc/ublinux/test-1] 644 []
#	    MODE="${MODE}1"
	    IFS='|' read -r NULL1 SECTION_NAME SECTION_MOD SECTION_EXEC NULL2 <<< $(tr '[]' '|' <<< "${ARG_1}")
	elif [[ ${ARG_1} =~ ^[[:space:]]*'['.*']'[[:space:]]*([0-9]+|[augo]+[=+-]+[augorstwxX,=+-]*)$ ]]; then
	    ## Варианты:
	    ##	[/etc/ublinux/test-1]a+x
	    ##	[/etc/ublinux/test-1] a+x
	    ##	[/etc/ublinux/test-1]u+rwx,go+u-w
#	    MODE="${MODE}2"
	    IFS='|' read -r NULL1 SECTION_NAME SECTION_MOD <<< $(tr '[]' '|' <<< "${ARG_1}")
	elif [[ ${ARG_1} =~ ^([0-9]+|[augo]+[=+-]+[augorstwxX,=+-]*)$ ]]; then
	    ## Варианты:
	    ##	644
	    ##	u+rwx,go+u-w
#	    MODE="${MODE}3"
	    [[ -z ${SECTION_MOD} ]] && SECTION_MOD=${ARG_1} || break
	elif [[ ${ARG_1} =~ ^[[:space:]]*([0-9]+|[augo]+[=+-]+[augorstwxX,=+-]*)[[:space:]]*'['.*']'?$ ]]; then
	    ## Варианты:
	    ##	a+x[/usr/bin/bash]
	    ##	u+rwx,go+u-w[chroot .]
#	    MODE="${MODE}4"
	    IFS='|' read -r SECTION_MOD SECTION_EXEC NULL1 <<< $(tr '[]' '|' <<< "${ARG_1}")
	elif [[ ${ARG_1} =~ ^[[:space:]]*'['.*']'$ ]]; then
	    ## Варианты:
	    ##	[/etc/ublinux/test-1]
	    ##	[test-1]
	    ##	[/usr/bin/bash]
	    ##	[chroot .]
#	    MODE="${MODE}5"
	    [[ -n ${SECTION_NAME} ]] && SECTION_EXEC=${ARG_1} || SECTION_NAME=${ARG_1}
	elif [[ -n ${SECTION_NAME} && -z ${SECTION_EXEC} && ${ARG_1} =~ ^'['[^]]+ ]]; then
	    ## Варианты:
	    ##	[chroot
#	    MODE="${MODE}6"
	    SECTION_EXEC=${ARG_1}
	elif [[ -n ${SECTION_NAME} && -n ${SECTION_EXEC} && ${ARG_1} =~ [^[]+']'$ ]]; then
	    ## Варианты:
	    ##	.]
#	    MODE="${MODE}7"
	    SECTION_EXEC="${SECTION_EXEC} ${ARG_1}"
	elif [[ -z ${SECTION_NAME} ]]; then
	    ## Варианты:
	    ##	/etc/ublinux/test-1
	    ##	test-1
#	    MODE="${MODE}8"
	    [[ ${ARG_1} =~ '='+ ]] && break || SECTION_NAME=${ARG_1}
	else
	    break
	fi
#TODO: Проверить, доработать и часть условий или все возможно объеденить в:
#	[[ ${ARG_1} =~ ^'['([^[]*|[^]]*)']'[[:space:]]*([0-9]+|[augo]+[=+-]+[augorstwxX,=+-]*)?[[:space:]]*('['+(.*)']'+)?$ ]]
#	SECTION_NAME=${BASH_REMATCH[1]}
#	SECTION_MOD=${BASH_REMATCH[2]}
#	SECTION_EXEC_NULL=${BASH_REMATCH[3]}
#	SECTION_EXEC=${BASH_REMATCH[4]}
#	echo "[${SECTION_NAME}]${SECTION_MOD}[${SECTION_EXEC}]"
	shift; ((SKIP_ARGS_SECTION++))
    done
    SECTION_NAME=${SECTION_NAME//[/}; SECTION_NAME=${SECTION_NAME//]/}
    [[ -n ${SECTION_NAME} && ${SECTION_NAME} != '/' && ${SECTION_NAME} != "${SYSCONF}" ]] || SECTION_NAME="*"
    [[ ${SECTION_NAME} =~ ^'/' ]] || SECTION_NAME="${SYSCONF}/${SECTION_NAME}"
    [[ -n ${SECTION_MOD} ]] && SECTION_MOD=${SECTION_MOD// /}
    [[ -n ${SECTION_EXEC} ]] && SECTION_EXEC=${SECTION_EXEC//[/} && SECTION_EXEC=${SECTION_EXEC//]/}

    if [[ -z ${SECTION_MOD} && -z ${SECTION_EXEC} ]]; then
	SECTION="[${SECTION_NAME}]"
    elif [[ -n ${SECTION_MOD} && -z ${SECTION_EXEC} ]]; then
	SECTION="[${SECTION_NAME}]${SECTION_MOD}"
    elif [[ -z ${SECTION_MOD} && -n ${SECTION_EXEC} ]]; then
	SECTION="[${SECTION_NAME}] [${SECTION_EXEC}]"
    else
	SECTION="[${SECTION_NAME}]${SECTION_MOD} [${SECTION_EXEC}]"
    fi
    
#echo -e " ${MODE}=${SKIP_ARGS_SECTION} NULL1='${NULL1}' \t SECTION_NAME='${SECTION_NAME}' \t SECTION_MOD='${SECTION_MOD}' \t SECTION_EXEC='${SECTION_EXEC}' \t NULL2='${NULL2}'"
#echo "SECTION=${SECTION}"
#echo "SKIP_ARGS_SECTION=${SKIP_ARGS_SECTION}"
}

get_value(){
    get_value_config(){
    # $1 Имя переменной из внешней функции, для заполнения данными
    # $2 Перечень опций для поиска
    # ${FILE_UBLINUX_DATA} как источник данных для анализа
	declare -n VALUE_CONFIG=$1
	shift
	get_value_format(){
	# Из полученных переменных сформировать вывод в зависимости от опции --raw
	    while IFS= read -r LINE; do
	        [[ -n ${RAW} ]] && VALUE_CONFIG+="$(sed "s/^['\"]*//;s/['\"]*$//" <<< ${LINE#*=})\n" || VALUE_CONFIG+="${LINE}\n"
	    done <<< "${1}"
	}
	local FIND_VALUE_CONFIG=${FILE_UBLINUX_DATA}
	# Если секция не указана или в секции указано / * и нет имени переменной в $@ , то выводим весь файл
	if [[ ${SECTION_NAME} == "${SYSCONF}/*" && $@ == "" ]]; then
	    FIND_VALUE_CONFIG=$(grep -Ev '^\s*declare|^\s*\[' <<< ${FIND_VALUE_CONFIG})
	    get_value_format "${FIND_VALUE_CONFIG}"
	# Секция указан, ищем запрошенные переменные и выводим
	else
	    # Вырезать искомую секцию из файла конфигурации
	    if [[ ${!VALUE_CONFIG} == "VALUE_GLOBAL" || ${!VALUE_CONFIG} == "VALUE_MANUAL" ]]; then
		if [[ ${SECTION_NAME} != "${SYSCONF}/*" ]]; then
		    # Экранировать все символы в имени секции
		    ESC_SECTION=$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "[${SECTION_NAME}]")
		    # Вырезаем секцию по меткам
		    FIND_VALUE_CONFIG=$(sed -En "/^\s*${ESC_SECTION}/,/^\s*\[/p" <<< "${FIND_VALUE_CONFIG}" | grep -v '^\s*\[')
		else
		# Не указана секция
		    # Скрыть имена блоков в выводе
		    FIND_VALUE_CONFIG=$(grep -v '^\s*\[' <<< "${FIND_VALUE_CONFIG}")
		fi
	    fi
	    # Если указана только секция и нет переменных для фильтра
	    if [[ -n ${SECTION_NAME} ]] && [[ $@ == "" || $@ == "/" || $@ == "*" ]]; then
		get_value_format "${FIND_VALUE_CONFIG}"
	    # Указана секция и присутствуют переменные для фильтра
	    else
		for REQUEST_ITEM in "$@"; do
		    if [[ ${REQUEST_ITEM%%=*} =~ '[]'$|'[*]'$ ]]; then
		    # Указан ассоциативный массив VAR[] VAR[*]
	    		REQUEST_ITEM=$(sed 's/[^a-zA-Z0-9 ]/\\&/g' <<< "${REQUEST_ITEM%%[*}[")
    	    		FIND_VALUE=$(grep -E "^${REQUEST_ITEM}" <<< ${FIND_VALUE_CONFIG})
		    else
		    # Простая переменная
	    		REQUEST_ITEM=$(sed 's/[^a-zA-Z0-9 ]/\\&/g' <<< "${REQUEST_ITEM%%=*}=")
    	    		FIND_VALUE=$(grep -E "^${REQUEST_ITEM}" <<< "${FIND_VALUE_CONFIG}" | tail -1)
    	    	    fi
    	    	    [[ ${FIND_VALUE} != "" ]] || FIND_VALUE="(null)"
		    get_value_format "${FIND_VALUE}"
		done
	    fi
	fi
    }
    get_value_compare(){
	while read -r REQUEST_ITEM; do
	    grep -Eq "^$|(null)" <<< ${REQUEST_ITEM} && continue
	    ESC_REQUEST_ITEM=$(sed 's/[^a-zA-Z0-9 ]/\\&/g' <<< ${REQUEST_ITEM})
	    FIND_VALUE=$(grep -E "^${ESC_REQUEST_ITEM}" <<< ${2//\\n/$'\n'})
	    [[ ${FIND_VALUE} == "" ]] && FIND_VALUE="${REQUEST_ITEM}" || continue
	    if [[ -n ${RAW} ]]; then 
		while read -r LINE; do
		    VALUE_COMPARE+="${3}${LINE#*=}\n"
		done <<< ${FIND_VALUE}
	    else
		while read -r LINE; do
		    VALUE_COMPARE+="${3}${LINE}\n"
		done <<< ${FIND_VALUE}
	    fi
	done <<< ${FILE_UBLINUX_DATA//\\n/$'\n'}
    }
    local VALUE_COMPARE=
    local VALUE_GLOBAL=
    local VALUE_SYSTEM=
    local VALUE_DEFAULT=
    local VALUE_MANUAL=
    if [[ -n ${COMPARE} ]]; then
	[[ -f ${FILE_UBLINUX_CONF} ]] || return 1
	FILE_UBLINUX_DATA=$(grep -hEv '^\s*#|^\s*$' ${FILE_UBLINUX_CONF})
        get_value_config "VALUE_GLOBAL" "$@"
    	if [[ ${SECTION_NAME} == "${SYSCONF}/*" ]]; then
    	    FILE_UBLINUX_DATA="$(grep -hEv '^\s*#|^\s*$' ${PATH_UBLINUX_CURRENT}/*)"
    	    get_value_config "VALUE_SYSTEM" "$@"
	elif [[ -f ${PATH_UBLINUX_CURRENT}/${SECTION_NAME##*/} ]]; then
    	    FILE_UBLINUX_DATA=$(grep -hEv '^\s*#|^\s*$' ${PATH_UBLINUX_CURRENT}/${SECTION_NAME##*/})
    	    get_value_config "VALUE_SYSTEM" "$@"
    	fi
        get_value_compare "${VALUE_GLOBAL}" "${VALUE_SYSTEM}" "Global:"
        get_value_compare "${VALUE_SYSTEM}" "${VALUE_GLOBAL}" "System:"
	echo -en "${VALUE_COMPARE}"
    elif [[ ${SOURCE} == global ]]; then 
	[[ -f ${FILE_UBLINUX_CONF} ]] || return 1
	FILE_UBLINUX_DATA=$(grep -hEv '^\s*#|^\s*$' ${FILE_UBLINUX_CONF})
	# Если укзано --default то подгругить параметры по умолчанию
	if [[ ${SECTION_NAME} != "${SYSCONF}/*" && -n ${LOAD_DEFAULT} ]]; then
	    ESC_SECTION=$(sed 's/[^a-zA-Z0-9,._+@%-]/\\&/g' <<< "[${SECTION_NAME}]")
	    FILE_UBLINUX_DATA=$(sed "/^\s*${ESC_SECTION}/r"<(echo "$(grep -Ev '^\s*#|^\s*$' ${FILE_UBLINUX_DEFAULT})") <<< ${FILE_UBLINUX_DATA}) #"
	fi
        get_value_config "VALUE_GLOBAL" "$@"
        echo -en "${VALUE_GLOBAL}"
    elif [[ ${SOURCE} == system ]]; then
	if [[ -f ${PATH_UBLINUX_CURRENT}/${SECTION_NAME##*/} ]]; then
	    [[ -n ${LOAD_DEFAULT} ]] && FILE_DEFAULT_DATA="$(grep -Ev '^\s*#|^\s*$' ${FILE_UBLINUX_DEFAULT})\n"
	    FILE_UBLINUX_DATA=${FILE_DEFAULT_DATA/%\\n/$'\n'}$(grep -hEv '^\s*#|^\s*$' ${PATH_UBLINUX_CURRENT}/${SECTION_NAME##*/})
	    get_value_config "VALUE_SYSTEM" "$@"
	elif [[ ${SECTION_NAME} == "${SYSCONF}/*" ]]; then
	    FILE_UBLINUX_DATA=$(grep -hEv '^\s*#|^\s*$' ${PATH_UBLINUX_CURRENT}/*)
	    get_value_config "VALUE_SYSTEM" "$@"
	fi
        echo -en "${VALUE_SYSTEM}"
    elif [[ ${SOURCE} == default ]]; then
	[[ -f ${FILE_UBLINUX_DEFAULT} ]] || return 1
	FILE_UBLINUX_DATA=$(grep -Ev '^\s*#|^\s*$' ${FILE_UBLINUX_DEFAULT})
	get_value_config "VALUE_DEFAULT" "$@"
	echo -en "${VALUE_DEFAULT}"
    else
	[[ -f ${SOURCE} ]] || return 1
	FILE_UBLINUX_DATA=$(grep -hEv '^\s*#|^\s*$' ${SOURCE})
	# Если укзано --default то подгругить параметры по умолчанию
	if [[ ${SECTION_NAME} != "${SYSCONF}/*" && -n ${LOAD_DEFAULT} ]]; then
	    ESC_SECTION=$(sed 's/[^a-zA-Z0-9,._+@%-]/\\&/g' <<< "[${SECTION_NAME}]")
	    FILE_UBLINUX_DATA=$(sed "/^\s*${ESC_SECTION}/r"<(echo "$(grep -Ev '^\s*#|^\s*$' ${FILE_UBLINUX_DEFAULT})") <<< ${FILE_UBLINUX_DATA}) #"
	fi
    	get_value_config "VALUE_MANUAL" "$@"
	echo -en "${VALUE_MANUAL}"
    fi
}
remove_value(){
    remove_value_all(){
	remove_value_global(){
		# Пронумеровать файл
		UBLINUX_CONFIG=$(grep -n "" ${FILE_UBLINUX_CONF})
		# Удаляем из файла комментарии и пустые строки
		#UBLINUX_CONFIG=$(grep -n "" ${FILE_UBLINUX_CONF} | sed -E "/^[0-9]*:(\s*|\s*\#+.*)$/d") #"
		# Поиск секции
		# Если не указана секция, то скрыть имена блоков в выводе
		if [[ ${SECTION_NAME} == "${SYSCONF}/*" ]] \
		    && FIND_VALUE_CONFIG=$(grep -v '^[0-9]*:\s*\[' <<< "${UBLINUX_CONFIG}") \
		    && [[ ${FIND_VALUE_CONFIG} != "" ]]; then
		    # Вырезаем секцию по меткам
		    true
		# Поиск секции по полному имени с каталогом [/etc/ublinux/name]. Вырезаем секцию по меткам
		elif ESC_SECTION=$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "[${SECTION_NAME}]") \
		    && FIND_VALUE_CONFIG=$(sed -En "/^[0-9]*:\s*${ESC_SECTION}/,/^[0-9]*:[\s#]*\[/p" <<< "${UBLINUX_CONFIG}" | sed -E '${/^[0-9]*:\s*#*\s*\[/d;}') \
		    && [[ ${FIND_VALUE_CONFIG} != "" ]]; then
		    # Найдена секция с полным именем [/etc/ublinux/name]
		    true
		# Поиск секции по сокращённому имени без каталога [name]. Вырезаем секцию по меткам
		elif ESC_SECTION=$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "[${SECTION_NAME##*/}]") \
		    && FIND_VALUE_CONFIG=$(sed -En "/^[0-9]*:\s*${ESC_SECTION}/,/^[0-9]*:[\s#]*\[/p" <<< "${UBLINUX_CONFIG}" | sed -E '${/^[0-9]*:\s*#*\s*\[/d;}') \
		    && [[ ${FIND_VALUE_CONFIG} != "" ]]; then
		    # Найдена секция с полным именем [name]
		    true
		else
		    # Секция не найдена
		    return 1
		fi

		# Если после имени указано [] или [*] то удалить все переменные ассациативного массива	
		if [[ ${NAME_VAR_LOCAL##*\[} =~ ^"]"$|^"*]"$ ]] \
		    && SECTION_DATA="$(grep -E "^[0-9]*:\s*${ESC_NAME_VAR_LOCAL%%[*}[" <<< ${FIND_VALUE_CONFIG} | cut -d: -f1)" \
		    && [[ ${SECTION_DATA} != "" ]]; then 
		    # Совпадение найдено, удаление по номеру строки. Символ новой строки $'\n' заменяем на d; для sed
		    sed -E "${SECTION_DATA//$'\n'/d;}d" -i "${FILE_UBLINUX_CONF}"
		# Поиск прямое совпадение переменной, номер строки в переменную SECTION_DATA. Если несколько совпадений, то каждый номер на новой строке
		elif SECTION_DATA="$(grep -E "^[0-9]*:\s*${ESC_NAME_VAR_LOCAL}=" <<< ${FIND_VALUE_CONFIG} | cut -d: -f1)" \
		    && [[ ${SECTION_DATA} != "" ]]; then
		    # Совпадение найдено, удаление по номеру строки. Символ новой строки $'\n' заменяем на d; для sed
		    sed -E "${SECTION_DATA//$'\n'/d;}d" -i "${FILE_UBLINUX_CONF}"
		# Если имя указано * то удалить все переменные
		elif [[ ${NAME_VAR_LOCAL} == @('*'|'/') ]] \
		    && SECTION_DATA="$(grep -Ev '^[0-9]*:(\s*|\s*\#+.*|\s*\[+.*)$' <<< ${FIND_VALUE_CONFIG} | cut -d: -f1)" \
		    && [[ ${SECTION_DATA} != "" ]]; then 
		    sed -E "${SECTION_DATA//$'\n'/d;}d" -i "${FILE_UBLINUX_CONF}"
		# Если имя указано ** то удалить все переменные и имя сектора
		elif [[ ${NAME_VAR_LOCAL} == @('**'|'//') ]] \
		    && SECTION_DATA="$(cut -d: -f1 <<< ${FIND_VALUE_CONFIG})" \
		    && [[ ${SECTION_DATA} != "" ]]; then 
		    sed -E "${SECTION_DATA//$'\n'/d;}d" -i "${FILE_UBLINUX_CONF}"
		else
		    # Совпадений не найдено
		    return 1
		fi
	}
	remove_value_system(){
	    # Если базовый каталог указанный в секции входит в состав системного каталога ${PATH_UBLINUX_CURRENT}, то продолжить, иначе это другой файл настроек и выйти
	    if [[ ${PATH_UBLINUX_CURRENT} =~ ${SECTION_NAME%/*}$ ]] \
		&& FILE_CONFIG=(${PATH_UBLINUX_CURRENT}/${SECTION_NAME##*/}) \
		&& [[ -f ${FILE_CONFIG} ]]; then
		# Если после имени указано [] или [*] то удалить все переменные ассациативного массива
	        if [[ ${NAME_VAR_LOCAL##*\[} =~ ^"]"$|^"*]"$ ]]; then
		    grep -Eq "^${ESC_NAME_VAR_LOCAL%%[*}[" "${FILE_CONFIG}" || return 1
		    sed -E "/^${ESC_NAME_VAR_LOCAL%%[*}[/d" -i "${FILE_CONFIG}"
		    grep -Eq "^${ESC_NAME_VAR_LOCAL%%[*}[" "${FILE_CONFIG}" && return 1
		# Поиск прямое совпадение переменной, номер строки в переменную SECTION_DATA. Если несколько совпадений, то каждый номер на новой строке
		elif [[ ${NAME_VAR_LOCAL} == @('*'|'/'|'**'|'//') ]]; then
		    find ${FILE_CONFIG} -maxdepth 0 -type f -delete
		    [[ -f ${FILE_CONFIG} ]] && return 1
		else
		    grep -Eq "^${ESC_NAME_VAR_LOCAL}=" "${FILE_CONFIG}" || return 1
		    sed -E "/^${ESC_NAME_VAR_LOCAL}=/d" -i "${FILE_CONFIG}"
		    grep -Eq "^${ESC_NAME_VAR_LOCAL}=" "${FILE_CONFIG}" && return 1
		fi
		if [[ ${SECTION_NAME##*/} != "*" ]]; then
		# Повторно продекларировать ассациативные массивы
		    sed "/^declare -A/d" -i "${FILE_CONFIG}"
		    DECLARE_A=$(grep -E "^[A-z0-9_]*\[.*\]=.*" "${FILE_CONFIG}" | sed -E "s/\[.*//" | sort -u | tr "\n" " ")
		    [[ -z ${DECLARE_A} ]] || sed "1i declare -A ${DECLARE_A}" -i "${FILE_CONFIG}"
		fi
	    else
		return 1
	    fi
	}
	local NAME_VAR_LOCAL=${NAME_VAR}
	ESC_NAME_VAR_LOCAL="$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "${NAME_VAR_LOCAL}")"
	if [[ -z ${TARGET} ]]; then
	    remove_value_global; STATUS_GLOBAL=$?
	    remove_value_system; STATUS_SYSTEM=$?
	elif [[ ${TARGET} == global ]]; then
	    remove_value_global; STATUS_GLOBAL=$?
	elif [[ ${TARGET} == system ]]; then
	    remove_value_system; STATUS_SYSTEM=$?
	elif [[ -f ${TARGET} ]]; then
	    FILE_UBLINUX_CONF=${TARGET}
	    remove_value_global; STATUS_GLOBAL=$?
	fi
	#[[ ${STATUS_GLOBAL} == 0 ]] && prompt -s "The '${NAME_VAR_LOCAL}' variable has been removed from the '${SECTION}' section of the '${FILE_UBLINUX_CONF}' global configuration"
	[[ ${STATUS_GLOBAL} == 0 ]] && prompt -s "Removed <== global <== ${NAME_VAR_LOCAL} <==  ${SECTION} <== ${FILE_UBLINUX_CONF}"
	#[[ ${STATUS_GLOBAL} == 1 ]] && { prompt -w " The '${NAME_VAR_LOCAL}' variable has not been removed from the '${SECTION}' section of the '${FILE_UBLINUX_CONF}' global configuration"; local STATUS=1; }
	[[ ${STATUS_GLOBAL} == 1 ]] && { prompt -w "Not removed --- global --- ${NAME_VAR_LOCAL} --- ${SECTION} --- ${FILE_UBLINUX_CONF}"; local STATUS=1; }
	#[[ ${STATUS_SYSTEM} == 0 ]] && prompt -s "The '${NAME_VAR_LOCAL}' variable has been removed from the '${SECTION}' section of the '${FILE_CONFIG}' system configuration"
	[[ ${STATUS_SYSTEM} == 0 ]] && prompt -s "Removed <== system <== ${NAME_VAR_LOCAL} <==  ${SECTION} <== ${FILE_CONFIG}"
	#[[ ${STATUS_SYSTEM} == 1 ]] && { prompt -w " The '${NAME_VAR_LOCAL}' variable has not been removed from the '${SECTION}' section of the '${FILE_CONFIG}' system configuration"; local STATUS=1; }
	[[ ${STATUS_SYSTEM} == 1 ]] && { prompt -w "Not removed --- system --- ${NAME_VAR_LOCAL} --- ${SECTION} --- ${FILE_CONFIG}"; local STATUS=1; }
	[[ ${STATUS} == 1 ]] && return 1 || return 0
    }
    local STATUS_SYSTEM STATUS_GLOBAL
    [[ -n "$@" ]] || prompt -eq " not found arguments !"
    for ARG in "$@"; do
	NAME_VAR=${ARG%%=*}; #VALUE_VAR=$(ubconfig --raw ${COMMAND_SRC} get [${SECTION_NAME}] ${NAME_VAR})
	remove_value_all; local STATUS=$?
	[[ ${STATUS_SYSTEM} == 0 && -z ${SET_NOEXECUTE} ]] && select_exec_system || true
    done
}
set_value(){
    set_value_all(){
	set_value_global(){
		# Пронумеровать файл. Удаляем из файла пустые строки
		UBLINUX_CONFIG=$(grep -n "" ${FILE_UBLINUX_CONF} | sed -E "/^[0-9]*:\s*$/d") #"
		#FIND_VALUE_CONFIG=$(grep -n "" ${FILE_UBLINUX_CONF} | sed -E "/^[0-9]*:(\s*|\s*\#+.*)$/d") #"		
		# Поиск секции по полному имени с каталогом [/etc/ublinux/name]. Вырезаем секцию по меткам
		if ESC_SECTION=$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "[${SECTION_NAME}]") \
		    && FIND_VALUE_CONFIG=$(sed -En "/^[0-9]*:\s*${ESC_SECTION}/,/^[0-9]*:[\s#]*\s*\[/p" <<< "${UBLINUX_CONFIG}") \
		    && [[ ${FIND_VALUE_CONFIG} != "" ]]; then
		    # Найдена секция с полным именем [/etc/ublinux/name]
		    true		    
#echo "-1:${FIND_VALUE_CONFIG}"
		# Поиск секции по сокращённому имени без каталога [name]. Вырезаем секцию по меткам
		elif ESC_SECTION=$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "[${SECTION_NAME##*/}]") \
		    && FIND_VALUE_CONFIG=$(sed -En "/^[0-9]*:\s*${ESC_SECTION}/,/^[0-9]*:[\s#]*\[/p" <<< "${UBLINUX_CONFIG}") \
		    && [[ ${FIND_VALUE_CONFIG} != "" ]]; then
		    # Найдена секция с именем [name]
		    true		    
#echo "-2:${FIND_VALUE_CONFIG}"
		# Поиск закомментированной секции по полному имени с каталогом #[/etc/ublinux/name]. Вырезаем секцию по меткам
		elif ESC_SECTION=$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "[${SECTION_NAME}]") \
		    && FIND_VALUE_CONFIG=$(sed -En "/^[0-9]*:\s*\#+\s*${ESC_SECTION}/,/^[0-9]*:[\s#]*\s*\[/p" <<< "${UBLINUX_CONFIG}") \
		    && [[ ${FIND_VALUE_CONFIG} != "" ]]; then
		    # Найдена секция с полным именем #[/etc/ublinux/name]
		    true		    
#echo "-3:${FIND_VALUE_CONFIG}"
		# Поиск закомментированной секции по сокращённому имени без каталога #[name]. Вырезаем секцию по меткам
		elif ESC_SECTION=$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "[${SECTION_NAME##*/}]") \
		    && FIND_VALUE_CONFIG=$(sed -En "/^[0-9]*:\s*\#+\s*${ESC_SECTION}/,/^[0-9]*:[\s#]*\s*\[/p" <<< "${UBLINUX_CONFIG}") \
		    && [[ ${FIND_VALUE_CONFIG} != "" ]]; then
		    # Найдена секция с именем #[name]
		    true		    
#echo "-4:${FIND_VALUE_CONFIG}"
		else
		    # Секция не найдена
		    unset FIND_VALUE_CONFIG
#echo "-5:${FIND_VALUE_CONFIG}"
		fi

		# Сравнить полное имя секции из параметров с фактическим в конфигурации
		if [[ ${FIND_VALUE_CONFIG} == "" ]]; then
		# Секция не найдена, вставляем новую секцию в конец файла
		    echo -e "\n${SECTION}" >> "${FILE_UBLINUX_CONF}"
		else
		    # Если сектор пустой и состоит только из заголовка сектор, то пропуск, иначе последнюю строку следующего сектора вырезаем
		    [[ $(wc -l <<< ${FIND_VALUE_CONFIG}) -eq 1 ]] || FIND_VALUE_CONFIG=$(sed -E '${/^[0-9]*:[\s#]*\[/d;}' <<< ${FIND_VALUE_CONFIG})
		    # Вырезаем первую строку с именем сектора
		    SECTION_FIND_VALUE_CONFIG=${FIND_VALUE_CONFIG%%$'\n'*}
		    SECTION_FIND_VALUE_CONFIG_NUM=${SECTION_FIND_VALUE_CONFIG%%:*}
		    SECTION_FIND_VALUE_CONFIG_DATA=${SECTION_FIND_VALUE_CONFIG#*:}
		    # Если секции не одинаковые, то замена
		    if [[ ${SECTION_FIND_VALUE_CONFIG_DATA} != ${SECTION} ]]; then
			ESC_SECTION_PASTE=$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "${SECTION}")
			sed -E "${SECTION_FIND_VALUE_CONFIG_NUM} s/.*/${ESC_SECTION_PASTE}/" -i "${FILE_UBLINUX_CONF}"
		    fi
		fi
		local SECTION_DATA=
		#FIND_VALUE_CONFIG_TAC=$(tac <<< ${FIND_VALUE_CONFIG})
		if [[ -n ${NAME_VAR_LOCAL} && -n ${VALUE_VAR_LOCAL} && ${FIND_VALUE_CONFIG} != "" ]] \
		    && SECTION_DATA="$(grep -E "^[0-9]*:\s*${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}\s*$" <<< ${FIND_VALUE_CONFIG})" \
		    && [[ -n ${SECTION_DATA} ]]; then 
		    # Переменная присутствует, пропускаем добавление
		    true
#echo "0:${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}"
		elif [[ -n ${NAME_VAR_LOCAL} && -n ${VALUE_VAR_LOCAL} && ${FIND_VALUE_CONFIG} != "" ]] \
		    && SECTION_DATA="$(grep -E "^[0-9]*:${ESC_NAME_VAR_LOCAL}=" <<< ${FIND_VALUE_CONFIG} | tail -1 | cut -d: -f1)" \
		    && [[ -n ${SECTION_DATA} ]]; then 
		    #&& ${FIND_VALUE_CONFIG_TAC} =~ $'\n'([0-9]*)':'[[:space:]]*"${ESC_NAME_VAR_LOCAL}"'='[^$'\n']* ]]; then
		# Поиск прямое совпадение переменной, номер строки в переменную --> ^var=
		    # Прямое совпадение найдено, замена по номеру строки
#echo "1:${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}"
		    sed -E "${SECTION_DATA}s/.*/${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}/" -i "${FILE_UBLINUX_CONF}"
		    #sed -E "${BASH_REMATCH[1]}s/.*/${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}/" -i "${FILE_UBLINUX_CONF}"
		elif [[ -n ${NAME_VAR_LOCAL} && -n ${VALUE_VAR_LOCAL} && ${FIND_VALUE_CONFIG} != "" ]] \
		    && SECTION_DATA="$(grep -E "^[0-9]*:\s*#*\s*${ESC_NAME_VAR_LOCAL}=" <<< ${FIND_VALUE_CONFIG} | tail -1 | cut -d: -f1)" \
		    && [[ -n ${SECTION_DATA} ]]; then
		    #&& ${FIND_VALUE_CONFIG_TAC} =~ $'\n'([0-9]*)':'[[:space:]]*'#'*[[:space:]]*"${ESC_NAME_VAR_LOCAL}"'='[^$'\n']* ]]; then 
		# Поиск по косвенному совпадению, после # коментария имя переменной --> ^*#*var=
		    # Косвенное сопадение найдено, вставка после номера строки
#echo "2:${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}"
		    sed -E "${SECTION_DATA}a ${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}" -i "${FILE_UBLINUX_CONF}"
		    #sed -E "${BASH_REMATCH[1]}a ${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}" -i "${FILE_UBLINUX_CONF}"
		elif [[ -n ${NAME_VAR_LOCAL} && -n ${VALUE_VAR_LOCAL} && ${FIND_VALUE_CONFIG} != "" ]] \
		    && SECTION_DATA="$(grep -E "^[0-9]*:\s*#*\s*${ESC_NAME_VAR_LOCAL%%\\[*}\[" <<< ${FIND_VALUE_CONFIG} | tail -1 | cut -d: -f1)" \
		    && [[ -n ${SECTION_DATA} ]]; then 
		    #&& ${FIND_VALUE_CONFIG_TAC} =~ $'\n'([0-9]*)':'[[:space:]]*'#'*[[:space:]]*"${ESC_NAME_VAR_LOCAL%%\\[*}"'['[^$'\n']* ]]; then 
		# Поиск по косвенному совпадению, после # коментария имя переменной обрезанное до первого символа после '[' -->  ^*#*var[var
		    # Косвенное сопадение найдено, вставка после номера строки
#echo "3:${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}"
		    sed -E "${SECTION_DATA}a ${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}" -i "${FILE_UBLINUX_CONF}"
		    #sed -E "${BASH_REMATCH[1]}a ${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}" -i "${FILE_UBLINUX_CONF}"
		elif [[ -n ${NAME_VAR_LOCAL} && -n ${VALUE_VAR_LOCAL} && ${FIND_VALUE_CONFIG} != "" ]] \
		    && SECTION_DATA="$(grep -E "^[0-9]*:\s*#*\s*${ESC_NAME_VAR_LOCAL%%\\[*}" <<< ${FIND_VALUE_CONFIG} | tail -1 | cut -d: -f1)" \
		    && [[ -n ${SECTION_DATA} ]]; then 
		    #&& ${FIND_VALUE_CONFIG_TAC} =~ $'\n'([0-9]*)':'[[:space:]]*'#'*[[:space:]]*"${ESC_NAME_VAR_LOCAL%%\\[*}"[^$'\n']* ]]; then 
		# Поиск по косвенному совпадению, после # коментария имя переменной обрезанное до '[' -->  ^*#*var[
		    # Косвенное сопадение найдено, вставка после номера строки
#echo "4:${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}"
		    sed -E "${SECTION_DATA}a ${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}" -i "${FILE_UBLINUX_CONF}"
		    #sed -E "${BASH_REMATCH[1]}a ${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}" -i "${FILE_UBLINUX_CONF}"
		elif [[ -n ${NAME_VAR_LOCAL} && -n ${VALUE_VAR_LOCAL} && ${FIND_VALUE_CONFIG} != "" ]]; then
		# Совпадений не найдено, секция найдена, простая вставка параметра в конец блока
		    # Вырезаем все строки которые начинаются с символа #
		    #SECTION_DATA="$(grep -Ev '^[0-9]*:#+' <<< ${FIND_VALUE_CONFIG})"
		    SECTION_DATA=${FIND_VALUE_CONFIG}
		    SECTION_DATA=${SECTION_DATA##*$'\n'}
		    SECTION_DATA_NUM=${SECTION_DATA%%:*}
		    # Совпадений не найдено, вставляем в конец блока новой строкой
#echo "5:${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}"
		    [[ -n ${SECTION_DATA_NUM} ]] && sed -E "${SECTION_DATA_NUM}a ${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}" -i "${FILE_UBLINUX_CONF}"
		elif [[ -z ${NAME_VAR_LOCAL} && -n ${VALUE_VAR_LOCAL} && ${FIND_VALUE_CONFIG} != "" ]] \
		    && grep -qE "^[0-9]*:\s*${ESC_VALUE_VAR_LOCAL}" <<< ${FIND_VALUE_CONFIG}; then
		# Совпадение найдено, секция найдена, параметра (|+-) найден, пропускаем добавление
		    true
#echo "6:${ESC_VALUE_VAR_LOCAL}"
		elif [[ -z ${NAME_VAR_LOCAL} && -n ${VALUE_VAR_LOCAL} && ${FIND_VALUE_CONFIG} != "" ]] \
		    && ! grep -qE "^[0-9]*:\s*${ESC_VALUE_VAR_LOCAL}" <<< ${FIND_VALUE_CONFIG}; then
		# Совпадений не найдено, секция найдена, вставка умного параметра (|+-) в конец блока
		    # Вырезаем все строки которые начинаются с символа #
		    #SECTION_DATA="$(grep -Ev '^[0-9]*:\s*#+' <<< ${FIND_VALUE_CONFIG})"
		    SECTION_DATA=${FIND_VALUE_CONFIG}
		    SECTION_DATA=${SECTION_DATA##*$'\n'}
		    SECTION_DATA_NUM=${SECTION_DATA%%:*}
		    # Совпадений не найдено, вставляем в конец блока новой строкой
#echo "7:${ESC_VALUE_VAR_LOCAL}"
		    [[ -n ${SECTION_DATA_NUM} ]] && sed -E "${SECTION_DATA_NUM}a ${ESC_VALUE_VAR_LOCAL}" -i "${FILE_UBLINUX_CONF}"
		elif [[ -n ${NAME_VAR_LOCAL} && -n ${VALUE_VAR_LOCAL} && ${FIND_VALUE_CONFIG} == "" ]]; then
		# Секция не найдена, простая вставка параметры в конец файла
		    #echo -e "\n${SECTION}\n${NAME_VAR_LOCAL}=${VALUE_VAR_LOCAL}" >> "${FILE_UBLINUX_CONF}"
#echo "8:${NAME_VAR_LOCAL}=${VALUE_VAR_LOCAL}"
		    echo -e "${NAME_VAR_LOCAL}=${VALUE_VAR_LOCAL}" >> "${FILE_UBLINUX_CONF}"
		elif [[ -z ${NAME_VAR_LOCAL} && -n ${VALUE_VAR_LOCAL} && ${FIND_VALUE_CONFIG} == "" ]]; then
		# Секция не найдена, вставка умного параметра (|+-) в конец файла
#echo "9:${VALUE_VAR_LOCAL}"
		    echo -e "${VALUE_VAR_LOCAL}" >> "${FILE_UBLINUX_CONF}"
		else
#echo "10:${NAME_VAR_LOCAL}=${VALUE_VAR_LOCAL}"
		    if [[ -n ${NAME_VAR_LOCAL} && -z ${VALUE_VAR_LOCAL} ]]; then
		    # Если значение переменной пустое, может оказаться пустым после использования -= или --=, то по имени удаляем
			remove_value "${NAME_VAR_LOCAL}"
			return 2
		    fi
		fi
		# Проверяем, имеется ли новая строка в файле конфигурации
		# Правильно отрабатывают: +@#$%^&*()_+-={}[]|:;'/.,<>?\"
		if [[ -n ${NAME_VAR_LOCAL} && -n ${VALUE_VAR_LOCAL} ]]; then
		    grep -qE "^${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}$" "${FILE_UBLINUX_CONF}" || return 1
		elif [[ -n ${VALUE_VAR_LOCAL} ]]; then
		    grep -qE "^${ESC_VALUE_VAR_LOCAL}$" "${FILE_UBLINUX_CONF}" || return 1
		fi
	}
	set_value_system(){
	    if [[ ${PATH_UBLINUX_CURRENT} =~ ${SECTION_NAME%/*}$ ]] && FILE_CONFIG="${PATH_UBLINUX_CURRENT}/${SECTION_NAME##*/}"; then
	    # Если базовый каталог указанный в секции входит в состав системного каталога ${PATH_UBLINUX_CURRENT}, то продолжить, иначе это другой файл настроек
		[[ -f ${FILE_CONFIG} ]] && sed -E "/^${ESC_NAME_VAR_LOCAL}=/d" -i "${FILE_CONFIG}" || touch "${FILE_CONFIG}"
		if [[ -n ${VALUE_VAR_LOCAL} ]]; then
		    echo "${NAME_VAR_LOCAL}=${VALUE_VAR_LOCAL}" >> "${FILE_CONFIG}"
		    grep -q "^${ESC_NAME_VAR_LOCAL}=${ESC_VALUE_VAR_LOCAL}$" "${FILE_CONFIG}" || return 1
		else
		# Если значение переменной пустое, может оказаться пустым после использования -= или --=, то ничего не делаем
		    return 3
		fi
		# Повторно продекларировать ассациативные массивы
		sed "/^declare -A/d" -i "${FILE_CONFIG}"
		DECLARE_A=$(grep -E "^[A-z0-9_]*\[.*\]=.*" "${FILE_CONFIG}" | sed -E "s/\[.*//" | sort -u | tr "\n" " ")
		[[ -z ${DECLARE_A} ]] || sed "1i declare -A ${DECLARE_A}" -i "${FILE_CONFIG}"
	    else
	    # Если файл не системной конфигурации [/etc/ublinux/name], то согласно правилам |+- добавить в файл переменные
		FILE_CONFIG="${SECTION_NAME}"
		[[ -f ${FILE_CONFIG} ]] || { mkdir -p ${FILE_CONFIG%/*} && touch ${FILE_CONFIG}; }
		[[ -f ${FILE_CONFIG} ]] || return 1
		# Вставка по условиям -|+
		if [[ ${NAME_VAR_LOCAL} == "" && ${VALUE_VAR_LOCAL} != "" \
		    && ${VALUE_VAR_LOCAL:0:1} == '-' ]]; then
        	    sed -E "/${VALUE_VAR_LOCAL:1}/d" -i "${FILE_CONFIG}"
		elif [[ ${NAME_VAR_LOCAL} == "" && ${VALUE_VAR_LOCAL} != "" \
		    && ${VALUE_VAR_LOCAL:0:1} == '|' ]]; then
		    echo "${VALUE_VAR_LOCAL:1}" >> "${FILE_CONFIG}"
		elif [[ ${NAME_VAR_LOCAL} == "" && ${VALUE_VAR_LOCAL} != "" \
		    && ${VALUE_VAR_LOCAL:0:1} == '+' ]]; then
        	    ESC_VALUE_VAR_LOCAL=$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "${VALUE_VAR_LOCAL:1}")
        	    grep -Eq "^${ESC_VALUE_VAR_LOCAL}$" "${FILE_CONFIG}" || echo "${VALUE_VAR_LOCAL:1}" >> "${FILE_CONFIG}"
		elif [[ ${NAME_VAR_LOCAL} == "" &&  ${VALUE_VAR_LOCAL} != "" ]]; then
        	    ESC_VALUE_VAR_LOCAL=$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "${VALUE_VAR_LOCAL}")
        	    grep -Eq "^${ESC_VALUE_VAR_LOCAL}$" "${FILE_CONFIG}" || echo "${VALUE_VAR_LOCAL}" >> "${FILE_CONFIG}"
		elif [[ ${NAME_VAR_LOCAL} != "" && ${VALUE_VAR_LOCAL} != "" ]]; then
        	    ESC_NAMEVALUE_VAR_LOCAL=$(sed 's/[^a-zA-Z0-9,_@%]/\\&/g' <<< "${NAME_VAR_LOCAL}=${VALUE_VAR_LOCAL}")
        	    grep -Eq "^${ESC_NAMEVALUE_VAR_LOCAL}$" "${FILE_CONFIG}" || echo "${NAME_VAR_LOCAL}=${VALUE_VAR_LOCAL}" >> "${FILE_CONFIG}"
		fi
	    fi
	}
	[[ ${SECTION_NAME} == "${SYSCONF}/*" ]] && SECTION_NAME="${SYSCONF}/config"
	local MODE_VAR_LOCAL=${MODE_VAR}
	local NAME_VAR_LOCAL=${NAME_VAR}
	# Удалить крайние ковычки
	#local VALUE_VAR_LOCAL="$(sed "s/^['\"]*//;s/['\"]*$//" <<< ${VALUE_VAR})"
	local VALUE_VAR_LOCAL=${VALUE_VAR}

	if [[ ${MODE_VAR_LOCAL} == "+=" || ${MODE_VAR_LOCAL} == "++=" ]]; then
	    [[ -n ${TARGET} ]] && COMMAND_SRC="--source ${TARGET}"
	    EXIST_VALUE=$(ubconfig --quiet --raw ${COMMAND_SRC} get [${SECTION_NAME}] ${NAME_VAR_LOCAL})
	    if [[ ${EXIST_VALUE} != "(null)" ]]; then
		# Добавить в конец строки
		[[ ${MODE_VAR_LOCAL} == "+=" ]] && VALUE_VAR_LOCAL="${EXIST_VALUE}${VALUE_VAR_LOCAL}"
		# Работа со списком где разделитель запятая (,). Добавить в конец строки через разделитель запятая (,) и заменить дубликаты (,,) (;;) (пробел) на запятую (,)
		if [[ ${MODE_VAR_LOCAL} == "++=" ]]; then
		    SEPARATOR=","
		    EXIST_VALUE=${EXIST_VALUE//;/${SEPARATOR}}
		    EXIST_VALUE=${EXIST_VALUE// /${SEPARATOR}}
		    unset VALUE_VAR_LOCAL_SPLIT
		    VALUE_VAR_LOCAL="${VALUE_VAR_LOCAL//;/,}"; VALUE_VAR_LOCAL="${VALUE_VAR_LOCAL//,,/,}"
		    while IFS= read -ru3 VALUE_VAR_LOCAL_SELECT; do
			# Если в списке уже имеется добавляемое значение, то пропустить
			if [[ ! "${SEPARATOR}${EXIST_VALUE}${SEPARATOR}" =~ [,';'$'\s']+"${VALUE_VAR_LOCAL_SELECT}"[,';'$'\s']+ ]]; then
			    VALUE_VAR_LOCAL_SPLIT="${VALUE_VAR_LOCAL_SPLIT}${SEPARATOR}${VALUE_VAR_LOCAL_SELECT}"
			fi
		    done 3<<< ${VALUE_VAR_LOCAL//,/$'\n'}
		    VALUE_VAR_LOCAL=$(sed -E "s/^[,; ]*//;s/[,; ]*$//;s/[,; ]{2,}/${SEPARATOR}/g" <<< "${EXIST_VALUE},${VALUE_VAR_LOCAL_SPLIT}")
		fi
	    else
		prompt -i "The empty '${NAME_VAR_LOCAL}' variable in '${TARGET}' configuration"
	    fi
	elif [[ ${MODE_VAR_LOCAL} == "-=" || ${MODE_VAR_LOCAL} == "--=" ]]; then
	    [[ -n ${TARGET} ]] && COMMAND_SRC="--source ${TARGET}"
	    EXIST_VALUE=$(ubconfig --quiet --raw ${COMMAND_SRC} get [${SECTION_NAME}] ${NAME_VAR_LOCAL})
	    if [[ -n ${EXIST_VALUE} && ${EXIST_VALUE} != "(null)" ]]; then
		# Удалить все вхождения строки
		[[ ${MODE_VAR_LOCAL} == "-=" ]] && VALUE_VAR_LOCAL=${EXIST_VALUE//"${VALUE_VAR_LOCAL}"/} #"
		# Работа со списком где разделитель запятая (,). Удалить все вхождения строки и заменить дубликаты (,,) (;;) (пробел) на запятую (,)
		if [[ ${MODE_VAR_LOCAL} == "--=" ]]; then 
		    ESC_VALUE_VAR_LOCAL=$(sed 's/[^a-zA-Z0-9,_@%-]/\\&/g' <<< "${VALUE_VAR_LOCAL}")
		    VALUE_VAR_LOCAL="$(sed -E "s/[,; ]+${ESC_VALUE_VAR_LOCAL}[,; ]+/,/g;s/^[,; ]*//;s/[,; ]*$//;s/[,; ]{2,}/,/g" <<< ",${EXIST_VALUE},")"
		fi
		[[ ${EXIST_VALUE} == ${VALUE_VAR_LOCAL} ]] && prompt -wq "Part of the specified value '${VALUE_VAR}' was not found in the variable '${NAME_VAR_LOCAL}' in '${TARGET}' configuration"
	    else
		prompt -wq "The empty '${NAME_VAR_LOCAL}' variable in '${TARGET}' configuration"
	    fi
	fi
	# Условия добавления значения в кавычки
	if [[ ${NAME_VAR_LOCAL} != "" && ${VALUE_VAR_LOCAL} =~ \$(_|1|2|2a|2b|2x|2y|3|5|6|7|md5|sha1|gy|y|argon2d|argon2i|argon2ds|argon2id)\$ ]]; then
	    # Значение хеш пароля
	    # https://en.wikipedia.org/wiki/Crypt_(C)
	    # https://man.archlinux.org/man/core/libxcrypt/crypt.5.en
	    VALUE_VAR_LOCAL="'${VALUE_VAR_LOCAL}'"
	elif [[ ${NAME_VAR_LOCAL} != "" && ${VALUE_VAR_LOCAL} =~ [[:space:][:punct:]] ]]; then
	    # Значение содержит пробел или знаки пунктуации
	    VALUE_VAR_LOCAL="\"${VALUE_VAR_LOCAL}\""
	fi
	[[ ${NAME_VAR_LOCAL} != "" ]] && ESC_NAME_VAR_LOCAL="$(sed 's/[^a-zA-Z0-9,_@%<>]/\\&/g' <<< "${NAME_VAR_LOCAL}")"
	[[ ${VALUE_VAR_LOCAL} != "" ]] && ESC_VALUE_VAR_LOCAL="$(sed 's/[^a-zA-Z0-9,_@%<>]/\\&/g' <<< "${VALUE_VAR_LOCAL}")"
	ESC_VALUE_VAR_LOCAL=${ESC_VALUE_VAR_LOCAL//\\\'/\'}
	ESC_VALUE_VAR_LOCAL=${ESC_VALUE_VAR_LOCAL//\\\$/\\\$}

	if [[ -z ${TARGET} ]]; then
	    set_value_global; STATUS_GLOBAL=$?
	    set_value_system; STATUS_SYSTEM=$?
	elif [[ ${TARGET} == global ]]; then
	    set_value_global; STATUS_GLOBAL=$?
	elif [[ ${TARGET} == system ]]; then
	    set_value_system; STATUS_SYSTEM=$?
	elif [[ -f ${TARGET} ]]; then
	    FILE_UBLINUX_CONF="${TARGET}"
	    set_value_global; STATUS_GLOBAL=$?
	fi
	#[[ ${STATUS_GLOBAL} == 0 ]] && prompt -s "The '${NAME_VAR_LOCAL:-${VALUE_VAR_LOCAL}}' variable has been added to the '${SECTION}' section of the '${FILE_UBLINUX_CONF}' global configuration"
	[[ ${STATUS_GLOBAL} == 0 ]] && prompt -s "Added ==> global ==> ${NAME_VAR_LOCAL:-${VALUE_VAR_LOCAL}} ==> ${SECTION} ==> ${FILE_UBLINUX_CONF}"
	#[[ ${STATUS_GLOBAL} == 1 ]] && { prompt -e " The '${NAME_VAR_LOCAL:-${VALUE_VAR_LOCAL}}' variable has not been added to the '${SECTION}' section of the '${FILE_UBLINUX_CONF}' global configuration '${FILE_UBLINUX_CONF}'"; local STATUS=1; }
	[[ ${STATUS_GLOBAL} == 1 ]] && { prompt -e "Not added --- global --- ${NAME_VAR_LOCAL:-${VALUE_VAR_LOCAL}} --- ${SECTION} --- ${FILE_UBLINUX_CONF}"; local STATUS=1; }
	#[[ ${STATUS_SYSTEM} == 0 ]] && prompt -s "The '${NAME_VAR_LOCAL:-${VALUE_VAR_LOCAL}}' variable has been added to the '${SECTION}' section of the '${FILE_CONFIG}' system configuration"
	[[ ${STATUS_SYSTEM} == 0 ]] && prompt -s "Added ==> system ==> ${NAME_VAR_LOCAL:-${VALUE_VAR_LOCAL}} ==> ${SECTION} ==> ${FILE_CONFIG}"
	#[[ ${STATUS_SYSTEM} == 1 ]] && { prompt -e " The '${NAME_VAR_LOCAL:-${VALUE_VAR_LOCAL}}' variable has not been added to the '${SECTION}' section of the '${FILE_CONFIG}' system configuration"; local STATUS=1; }
	[[ ${STATUS_SYSTEM} == 1 ]] && { prompt -e "Not added --- system --- ${NAME_VAR_LOCAL:-${VALUE_VAR_LOCAL}} --- ${SECTION} --- ${FILE_CONFIG}"; local STATUS=1; }
	[[ ${STATUS} == 1 ]] && return 1 || return 0
    }
    local STATUS_SYSTEM STATUS_GLOBAL
    [[ -n "$@" ]] || prompt -eq " not found arguments !"
    for ARG in "$@"; do
	if [[ ${ARG:0:1} == @('+'|'-'|'|'|'#') ]]; then
	## Первый символ параметра умной строки для вставки
	    unset MODE_VAR NAME_VAR
	    VALUE_VAR="${ARG}"
	elif [[ ${ARG} =~ ^(a-z|A-Z|0-9|.|_|-|\/|\[|\])+\+\+=.*$ ]]; then
	## Режим ++=
	    MODE_VAR="++="; NAME_VAR=${ARG%%++=*}; VALUE_VAR=${ARG#*++=}
	elif [[ ${ARG} =~ ^(a-z|A-Z|0-9|.|_|-|\/|\[|\])+\+=.*$ ]]; then
	## Режим +=
	    MODE_VAR="+="; NAME_VAR=${ARG%%+=*}; VALUE_VAR=${ARG#*+=}
	elif [[ ${ARG} =~ ^(a-z|A-Z|0-9|.|_|-|\/|\[|\])+\-\-=.*$ ]]; then
	## Режим --=
	    MODE_VAR="--="; NAME_VAR=${ARG%%--=*}; VALUE_VAR=${ARG#*--=}
	elif [[ ${ARG} =~ ^(a-z|A-Z|0-9|.|_|-|\/|\[|\])+\-=.*$ ]]; then
	## Режим -=
	    MODE_VAR="-="; NAME_VAR=${ARG%%-=*}; VALUE_VAR=${ARG#*-=}
	elif [[ ${ARG} =~ ^(a-z|A-Z|0-9|.|_|-|\/|\[|\])+=.*$ ]]; then
	## Режим =
	    MODE_VAR="="; NAME_VAR=${ARG%%=*}; VALUE_VAR=${ARG#*=}
	else
	## Только значение, не разделять
	    unset MODE_VAR NAME_VAR
	    VALUE_VAR="${ARG}"
	fi
	[[ ${VALUE_VAR} != "" && ${VALUE_VAR} =~ ^[\'|\"](.*)[\'|\"]$ ]] && VALUE_VAR=${BASH_REMATCH[1]}
	[[ ${COMMAND} != "update" ]] && preprocess_value_all
	set_value_all; local STATUS=$?
	[[ ${STATUS} == 1 ]] && STATUS_EXIT=1
	[[ ${STATUS_SYSTEM} == 0 && -z ${SET_NOEXECUTE} ]] && select_exec_system || true
    done
    [[ ${STATUS_EXIT} == 1 ]] && return 1 || return 0
}
preprocess_value_all(){
    case "[${SECTION_NAME}]" in
	"[${SYSCONF}/users]"|"[users]")
	    case "${NAME_VAR}" in
		DEFAULTPASSWD)		VALUE_VAR=$(${ROOTFS}/usr/lib/ublinux/functions return_hash_password phash ${VALUE_VAR}) ;;
		DEFAULTROOTPASSWD)	VALUE_VAR=$(${ROOTFS}/usr/lib/ublinux/functions return_hash_password phash ${VALUE_VAR}) ;;
		USERADD\[*\])		[[ ${VALUE_VAR} =~ ^([^:]*)':'([^:]*)':'([^:]*)':'([^:]*)':'([^:]*)':'([^:]+) && ${BASH_REMATCH[6]} != 'x' ]]  \
					&& VALUE_VAR="${BASH_REMATCH[1]}:${BASH_REMATCH[2]}:${BASH_REMATCH[3]}:${BASH_REMATCH[4]}:${BASH_REMATCH[5]}:$(${ROOTFS}/usr/lib/ublinux/functions return_hash_password phash ${BASH_REMATCH[6]})"
	        ;;
	        GROUPADD\[*\])		[[ ${VALUE_VAR} =~ ^([^:]*)':'([^:]*)':'([^:]*)':'([^:]*)':'([^:]+) && ${BASH_REMATCH[5]} != 'x' ]] \
					&& VALUE_VAR="${BASH_REMATCH[1]}:${BASH_REMATCH[2]}:${BASH_REMATCH[3]}:${BASH_REMATCH[4]}:$(${ROOTFS}/usr/lib/ublinux/functions return_hash_password phash ${BASH_REMATCH[5]})"
	        ;;
	        *)			local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	\[*\])
	    case "${NAME_VAR}" in
	        *)		local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	*) local NO_FIND_EXCUTE=1 ;;
    esac
}
select_exec_system(){
    [[ ${NO_FIND_EXCUTE} == 1 ]] || prompt -s "Execute system configuration commands for option ${NAME_VAR}"
    case "[${SECTION_NAME}]" in
	"[${SYSCONF}/config]"|"[config]")
	    case "${NAME_VAR}" in
	        HOSTNAME)		${ROOTFS}/usr/lib/ublinux/rc.preinit.d/30-network-hostname ${COMMAND} "${NAME_VAR}=${VALUE_VAR}" ;;
	        SERVICESSTART|SERVICESNOSTART|SERVICESMASK|SERVICESUNMASK|\
	        SERVICES_ENABLE|SERVICES_DISABLE|SERVICES_MASK|SERVICES_UNMASK)
					${ROOTFS}/usr/lib/ublinux/rc.preinit.d/20-services exec_services_enabledisable ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}"
					${ROOTFS}/usr/lib/ublinux/rc.preinit.d/20-services exec_services_startstop_live ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}"
		;;
		FIRSTSTART)		${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_99_firststart ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
	        *)			local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	"[${SYSCONF}/system]"|"[system]")
	    case "${NAME_VAR}" in
	        HOSTNAME)		${ROOTFS}/usr/lib/ublinux/rc.preinit.d/30-network-hostname ${COMMAND} "${NAME_VAR}=${VALUE_VAR}" ;;
	        SERVICESSTART|SERVICESNOSTART|SERVICESMASK|SERVICESUNMASK|\
	        SERVICES_ENABLE|SERVICES_DISABLE|SERVICES_MASK|SERVICES_UNMASK)
					${ROOTFS}/usr/lib/ublinux/rc.preinit.d/20-services exec_services_enabledisable ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}"
					${ROOTFS}/usr/lib/ublinux/rc.preinit.d/20-services exec_services_startstop_live ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}"
		;;
	        *)			local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	"[${SYSCONF}/users]"|"[users]")
	    case "${NAME_VAR}" in
		DEFAULTROOTPASSWD)	${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_00_defaultrootpasswd ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
		DEFAULTPASSWD)		${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_00_defaultpasswd ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
		DEFAULTGROUP)		${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_01_add_groups ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
		ADMGROUPS)		${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_01_add_groups ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
		USERGROUPS)		${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_01_add_groups ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
		NEEDEDUSERS)		${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_02_neededusers ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
	        USERADD\[*\])		${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_03_useradd ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
	        USERSHADOW\[*\])	${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_04_usershadow ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
	        GROUPADD\[*\])		${ROOTFS}/usr/lib/ublinux/rc.preinit/10-accounts exec_05_groupadd ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
	        *)			local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	"[${SYSCONF}/boot]"|"[boot]")
	    case "${NAME_VAR}" in
		GRUB_TIMEOUT)		${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_timeout ;;
		GRUB_DEFAULT)		${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_default ;;
		GRUB_SUPERUSERS)	${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_superusers ;;
		GRUB_PASSWORD\[*\])	${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_password ;;
		GRUB_BOOT_SILENT)	${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_boot_silent ;;
		GRUB_TERMINAL_INPUT)	${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_terminal_input ;;
		GRUB_TERMINAL_OUTPUT)	${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_terminal_output ;;
		GRUB_PLAY)		${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_play ;;
		GRUB_CMDLINE_LINUX)	${ROOTFS}/usr/lib/ublinux/rc.halt.pre/20-grub exec_grub_cmdline_linux ;;
		*)			local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	"[${SYSCONF}/logging]"|"[logging]")
	    case "${NAME_VAR}" in
		AUDITD\[*\])		${ROOTFS}/usr/lib/ublinux/rc.preinit.d/24-logging exec_auditd ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" 
	    				setsid ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/24-logging exec_auditd_live &;;
	        JOURNALD\[*\])		${ROOTFS}/usr/lib/ublinux/rc.preinit.d/24-logging exec_journald ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" 
	    				setsid ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/24-logging exec_journald_live &;;
	    	LOGROTATE\[*\])		${ROOTFS}/usr/lib/ublinux/rc.preinit.d/24-logging exec_logrotate ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" 
	    				setsid ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/24-logging exec_logrotate_live "${NAME_VAR}" &;;
	    	SYSTEMD_COREDUMP\[*\])	${ROOTFS}/usr/lib/ublinux/rc.preinit.d/24-logging exec_systemd_coredump ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
	        *)			local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	"[${SYSCONF}/clock]"|"[clock]")
	    case "${NAME_VAR}" in
		ZONE)			${ROOTFS}/usr/lib/ublinux/rc.preinit.d/10-system exec_timezone ;;
		HWCLOCK_SYNC)		
					${ROOTFS}/usr/lib/ublinux/rc.halt/20-timesave
					${ROOTFS}/usr/lib/ublinux/rc.post.d/02-hwclock
		;;
		*)			local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	"[${SYSCONF}/server]"|"[server]")
	    case "${NAME_VAR}" in
	        STORAGE_CONTAINERS_PATH)	${ROOTFS}/usr/lib/ublinux/rc.preinit.d/80-server-containers-storage ${COMMAND} ;;
	        STORAGE_LIBVIRT_PATH)		${ROOTFS}/usr/lib/ublinux/rc.preinit.d/81-server-libvirt-storage ${COMMAND} ;;
	        UBPILE)				${ROOTFS}/usr/lib/ublinux/rc.local.d/98-ubpile exec_01_ubpile ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
	        UBPILE\[*\])			${ROOTFS}/usr/lib/ublinux/rc.local.d/98-ubpile exec_01_ubpile ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
	        UBPILE_REVERSE_PROXY_PORT)	${ROOTFS}/usr/lib/ublinux/rc.local.d/98-ubpile exec_02_reverse_proxy_port ${COMMAND}${MODE_VAR} "${NAME_VAR}=${VALUE_VAR}" ;;
	        *)				local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	"[${SYSCONF}/desktop]"|"[desktop]")
	    case "${NAME_VAR}" in
	        MULTISEAT_SIMPLE)	${ROOTFS}/usr/lib/ublinux/rc.preinit.d/55-multiseat ;;
	        AUTOEXEC)		${ROOTFS}/usr/lib/ublinux/rc.desktop/all/autoexec ${COMMAND} "${NAME_VAR}=${VALUE_VAR}" ;;
	        AUTOEXEC\[*\])		${ROOTFS}/usr/lib/ublinux/rc.desktop/all/autoexec ${COMMAND} "${NAME_VAR}=${VALUE_VAR}" ;;
	        *)			local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	"[${SYSCONF}/save]"|"[save]")
	    case "${NAME_VAR}" in
		SAVE_ALL_CACHE)		${ROOTFS}/usr/lib/ublinux/rc.halt.pre/75-save-cache ;;
	        SAVE_ROOTCOPY_CHANGES)	${ROOTFS}/usr/lib/ublinux/rc.halt.pre/76-save-rootcopy ${COMMAND} "${NAME_VAR}=${VALUE_VAR}" ;;
	        SAVE_ROOTCOPY_INCLUDE)	${ROOTFS}/usr/lib/ublinux/rc.halt.pre/76-save-rootcopy ${COMMAND} "${NAME_VAR}=${VALUE_VAR}" ;;
	        SAVE_ROOTCOPY_EXCLUDE)	${ROOTFS}/usr/lib/ublinux/rc.halt.pre/76-save-rootcopy ${COMMAND} "${NAME_VAR}=${VALUE_VAR}" ;;
	        *)			local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	"[${SYSCONF}/network]"|"[network]")
    	    case "${NAME_VAR}" in
		DOMAIN)		 	export PARENT="${PKGNAME}"
					if [[ ${COMMAND} == 'set' ]]; then
					    ${ROOTFS}/usr/bin/ubdomain-client -q configure
					elif [[ ${COMMAND} == 'remove' ]]; then
					    ${ROOTFS}/usr/bin/ubdomain-client -q unconfigure
					fi
		;;
		'DOMAIN[server]') 	true ;;
		NTPSERVERS)		${ROOTFS}/usr/lib/ublinux/rc.preinit.d/21-ntp ${COMMAND} ;;
		PROXY_SYSTEM\[*\])	${ROOTFS}/usr/lib/ublinux/rc.preinit.d/31-network-proxy-system ;;
		*)			local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	"[${SYSCONF}/security]"|"[security]")
    	    case "${NAME_VAR}" in
		OPENSSL_ENGINE)			 ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/56-openssl-engine ;;
		ACCESS_DENIED_VTX11)		 ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/57-access-denied-vtx11 ;;
		ACCESS_ALLOWED_LOGIN)		 ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/58-access-login exec_access_allowed_login ;;
		ACCESS_DENIED_LOGIN)		 ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/58-access-login exec_access_denied_login ;;
		ACCESS_ALLOWED_SUID\[*\])	 ${ROOTFS}/usr/lib/ublinux/rc.post.d/42-access-suid-sgid exec_access_allowed_suid ;;
		ACCESS_ALLOWED_SGID\[*\])	 ${ROOTFS}/usr/lib/ublinux/rc.post.d/42-access-suid-sgid exec_access_allowed_sgid ;;
		ACCESS_ALLOWED_INTERPRETER\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.post.d/43-access-interpreter ;;
		MOUNT_ATTR\[*\])		 ${ROOTFS}/usr/lib/ublinux/rc.post.d/44-mountattr ;;
		MOUNT_QUOTA\[*\])		 ${ROOTFS}/usr/lib/ublinux/rc.post.d/45-disk-quota ;;
		CGROUP_QUOTA\[*\])		 ${ROOTFS}/usr/lib/ublinux/rc.post.d/46-cgroup-quota ${COMMAND} "${NAME_VAR}=${VALUE_VAR}" ;;
		POLKIT\[*\])			 ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/59-polkit ;;
		*)				 local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	\[*\])
	    case "${NAME_VAR}" in
	        *)		local NO_FIND_EXCUTE=1 ;;
	    esac
	;;
	*) prompt -i " [${SECTION_NAME}] section not found for execution"; local NO_FIND_EXCUTE=1 ;;
    esac
}

###############################
###   :::   E X E C   :::   ###
###############################
exec_simple_set_remove(){
    if [[ ${COMMAND} == 'set' || ${COMMAND} == 'remove' ]]; then
	$@
    fi
}

###################################
###   :::   U P D A T E   :::   ###
###################################
update_config(){
    update_config_system(){
	[[ -e ${FILE_UBLINUX_CONF} ]] || { prompt -w "Global configuration file ${FILE_UBLINUX_CONF} not found!"; return 1; }
	[[ ${STATUS} == 1 ]] && return 1 || return 0
    }
    update_config_global(){
	update_section_param(){
	    param_template(){
		PARAM_TEMPLATE[config:HOSTNAME]=system:HOSTNAME:
		PARAM_TEMPLATE[config:MACHINEID]=system:MACHINEID:
		PARAM_TEMPLATE[config:SERVICESSTART]=system:SERVICES_ENABLE:
		PARAM_TEMPLATE[config:SERVICESNOSTART]=system:SERVICES_DISABLE:
		PARAM_TEMPLATE[config:SERVICESMASK]=system:SERVICES_MASK:
		PARAM_TEMPLATE[config:SERVICESUNMASK]=system:SERVICES_UNMASK:

		PARAM_TEMPLATE[config:DEFAULTPASSWD]=users:DEFAULTPASSWD:
		PARAM_TEMPLATE[config:DEFAULTROOTPASSWD]=users:DEFAULTROOTPASSWD:
		PARAM_TEMPLATE[config:DEFAULTUSER]=users:DEFAULTUSER:
		PARAM_TEMPLATE[config:HASHPASSWD]=users:HASHPASSWD:
		PARAM_TEMPLATE[config:NEEDEDUSERS]=users:USERADD:convert_neededusers_adduser
		PARAM_TEMPLATE[users:NEEDEDUSERS]=users:USERADD:convert_neededusers_adduser
		PARAM_TEMPLATE[config:USERGROUPS]=users:USERGROUPS:
		PARAM_TEMPLATE[config:ADDADM]=users:ADDADM:
		PARAM_TEMPLATE[config:UPDATEHOME]=users:UPDATEHOME:
	
		PARAM_TEMPLATE[config:AUTOMOUNT_SHARE]=mount:AUTOMOUNT_SHARE:
		PARAM_TEMPLATE[config:PRINTERADD]=hardware:PRINTERADD:
		PARAM_TEMPLATE[config:DEPMOD]=hardware:DEPMOD:
	    }
	    convert_neededusers_adduser(){
		LINE_NEW=()
		VALUE_VAR_LAST=${VALUE_VAR_LAST//\"/}; VALUE_VAR_LAST=${VALUE_VAR_LAST//\'/}
		VALUE_VAR_LAST=${VALUE_VAR_LAST//;/,}; VALUE_VAR_LAST=${VALUE_VAR_LAST//,,/,}
		while IFS=: read -ru3 USER_NAME USER_UID PASSWORD COMMENT NULL; do
		    LINE_NEW+=(USERADD[${USER_NAME}]="'${COMMENT}:${USER_UID}:x:x::${PASSWORD}'")
		done 3<<< ${VALUE_VAR_LAST//,/$'\n'}
	    }
	    declare -A PARAM_TEMPLATE
	    param_template
	    local NAME_VAR_LAST NAME_VAR_LAST_EXTRA VALUE_VAR_LAST
	    NAME_VAR_LAST=${LINE%%=*}; VALUE_VAR_LAST=${LINE#*=}
	    # Если NAME_VAR_LAST имя двухмерного массива
	    [[ ${NAME_VAR_LAST} =~ '['.*']'$ ]] && NAME_VAR_LAST_EXTRA=${NAME_VAR_LAST#*[} && NAME_VAR_LAST_EXTRA="[${NAME_VAR_LAST_EXTRA}" && NAME_VAR_LAST=${NAME_VAR_LAST%%[*} #|| unset NAME_VAR_LAST_EXTRA
	    if [[ ${PARAM_TEMPLATE[${FILE_CONFIG##*/}:${NAME_VAR_LAST}]} != "" ]]; then
		IFS=: read -r FILE_CONFIG_NEW NAME_VAR_NEW NAME_VAR_FUNC_UPDATE NULL <<< "${PARAM_TEMPLATE[${FILE_CONFIG##*/}:${NAME_VAR_LAST}]}"
		[[ ${FILE_CONFIG_NEW} != "" && ${FILE_CONFIG_NEW} != ${FILE_CONFIG##*/} ]] && FILE_CONFIG_NEW="${SYSCONF}/${FILE_CONFIG_NEW}"
		[[ ${NAME_VAR_NEW} != "" && ${NAME_VAR_NEW} != ${NAME_VAR_LAST} ]] && LINE_NEW=(${NAME_VAR_NEW}${NAME_VAR_LAST_EXTRA}="'${VALUE_VAR_LAST}'")
		[[ -n ${NAME_VAR_FUNC_UPDATE} ]] && ${NAME_VAR_FUNC_UPDATE}
	    fi
	}
	
	[[ -e ${FILE_UBLINUX_CONF} ]] || { prompt -w "Global configuration file ${FILE_UBLINUX_CONF} not found!"; return 1; }
	FILE_UBLINUX_CONF="$(realpath ${FILE_UBLINUX_CONF})"
	# Если версии одинаковые, то выход
	VERSION_CONF_TEMPLATE=$(${ROOTFS}/usr/bin/ubconfig --raw --source ${FILE_UBLINUX_CONF_TEMPLATE} get [config] VERSION)
	VERSION_CONF_FILE=$(${ROOTFS}/usr/bin/ubconfig --raw --source ${FILE_UBLINUX_CONF} get [config] VERSION)
	if [[ ${VERSION_CONF_TEMPLATE}  == ${VERSION_CONF_FILE} ]]; then
	    #prompt -iq "The update was canceled because the version of the configuration file ${FILE_UBLINUX_CONF_TEMPLATE} is equal to the version of the file ${FILE_UBLINUX_CONF}"
	    prompt -iq "Update canceled --- version is equal -- ${FILE_UBLINUX_CONF_TEMPLATE}--> ${VERSION_CONF_TEMPLATE} = ${VERSION_CONF_FILE} <--${FILE_UBLINUX_CONF}"
	    return 0
	fi
	PATH_UBLINUX_CONF=${FILE_UBLINUX_CONF%/*}
	SYSTEM_LANG=$(locale | grep LANG | cut -d= -f2 | cut -d. -f1| cut -d_ -f1)
	if [[ ${SYSTEM_LANG} =~ 'ru' ]]; then
	    FILE_UBLINUX_CONF_TEMPLATE="${FILE_UBLINUX_CONF_TEMPLATE_RU}"
	elif [[ ${SYSTEM_LANG} =~ 'de' ]]; then
	    FILE_UBLINUX_CONF_TEMPLATE="${FILE_UBLINUX_CONF_TEMPLATE_DE}"
	elif [[ ${SYSTEM_LANG} =~ 'fr' ]]; then
	    FILE_UBLINUX_CONF_TEMPLATE="${FILE_UBLINUX_CONF_TEMPLATE_FR}"
	fi
	# Копируем новый файл конфигурации в замен старого, старый переименовываем в резервный
	install -Dm0640 -o root -g root --backup=numbered ${FILE_UBLINUX_CONF_TEMPLATE} ${FILE_UBLINUX_CONF}
	# Предыдущий действующий файл конфигурации, последний из резервных
	LAST_FILE_UBLINUX_CONF=$(ls -v1 ${FILE_UBLINUX_CONF}.~*~ | tail -1)
	while IFS= read -ru3 LINE; do
	    if [[ ${LINE} =~ ^'['.*']' ]]; then
        	FILE_CONFIG=$(tr '[]' '|' <<< "${LINE}" | cut -d'|' -f2)
        	FILE_CONFIG_MOD=$(tr '[]' '|' <<< "${LINE}" | cut -d'|' -f3 | tr -d ' ')
        	FILE_CONFIG_EXEC=$(tr '[]' '|' <<< "${LINE}" | cut -d'|' -f4)
        	[[ -n ${FILE_CONFIG_EXEC} ]] && FILE_CONFIG_EXEC="[${FILE_CONFIG_EXEC}]"
        	[[ -n ${FILE_CONFIG_MOD} || -n ${FILE_CONFIG_EXEC} ]] && FILE_CONFIG_EXT="${FILE_CONFIG_MOD} ${FILE_CONFIG_EXEC}"
        	# Если указан файл без пути, то добавить путь по умолчанию  ${SYSCONF}
        	[[ ${FILE_CONFIG} =~ "/" ]] || FILE_CONFIG="${SYSCONF}/${FILE_CONFIG}"
    	    elif [[ ${LINE} =~ ^(a-z|A-Z|0-9|.|_|-|\/|\[|\])+=.*$ ]]; then
    		FILE_CONFIG_NEW=
    		# Если полученная строка будет конвертироваться в несколько параметров передаваемых для ubconfig, то все новые переменные загонять в массив переменных
    		# Иначе будет воспринято будет как одна новая переменная
    		LINE_NEW=()
    		# Пропускаем параметры которые не нужно обновлять
		[[ ${LINE} =~ ^[[:space:]]*"VERSION=" ]] && continue
		update_section_param
		[[ ${FILE_CONFIG_NEW} == "" ]] && FILE_CONFIG_NEW="${FILE_CONFIG}"
		[[ ${#LINE_NEW[@]} -eq 0 ]] && LINE_NEW=("${LINE}")
		TARGET=${FILE_UBLINUX_CONF}
		prepare_section "[${FILE_CONFIG_NEW}]${FILE_CONFIG_EXT}"
		set_value "${LINE_NEW[@]}"
		#${ROOTFS}/usr/bin/ubconfig ${QUIET} ${NOCOLOR} --target "${FILE_UBLINUX_CONF}" set [${FILE_CONFIG_NEW}]${FILE_CONFIG_EXT} "${LINE_NEW[@]}"
    	    elif [[ ${LINE} =~ ^('+'|'|'|'-') ]]; then
    		TARGET=${FILE_UBLINUX_CONF}
    		prepare_section "[${FILE_CONFIG_NEW}]${FILE_CONFIG_EXT}"
		set_value "${LINE_NEW}"
		#${ROOTFS}/usr/bin/ubconfig ${QUIET} ${NOCOLOR} --target "${FILE_UBLINUX_CONF}" set [${FILE_CONFIG}]${FILE_CONFIG_EXT} "${LINE}"
	    else
    		TARGET=${FILE_UBLINUX_CONF}
    		prepare_section "[${FILE_CONFIG_NEW}]${FILE_CONFIG_EXT}"
		set_value "${LINE_NEW}"
		#${ROOTFS}/usr/bin/ubconfig ${QUIET} ${NOCOLOR} --target "${FILE_UBLINUX_CONF}" set [${FILE_CONFIG}]${FILE_CONFIG_EXT} "${LINE}"
    	    fi
	done 3< <(sed -E 's/^\s*//g;/^(\s*$|#+)/d' "${LAST_FILE_UBLINUX_CONF}")
	[[ ${STATUS} == 1 ]] && return 1 || return 0
    }
    if [[ -z ${TARGET} ]]; then
        update_config_global; STATUS_SYSTEM=$?
        update_config_system; STATUS_GLOBAL=$?
    elif [[ ${TARGET} == global ]]; then
        update_config_global; STATUS_GLOBAL=$?
    elif [[ ${TARGET} == system ]]; then
        update_config_system; STATUS_SYSTEM=$?
    elif [[ -e ${TARGET} ]]; then
        FILE_UBLINUX_CONF=${TARGET}
        update_config_global; STATUS_GLOBAL=$?
    fi
    #[[ ${STATUS_GLOBAL} == 0 ]] && prompt -s "Global configuration file '${FILE_UBLINUX_CONF}' updated"
    [[ ${STATUS_GLOBAL} == 0 ]] && prompt -s "Updated ==> global ==> ${FILE_UBLINUX_CONF}"
    #[[ ${STATUS_GLOBAL} == 1 ]] && { prompt -e "Global configuration file '${FILE_UBLINUX_CONF}' update faild!"; local STATUS=1; }
    [[ ${STATUS_GLOBAL} == 1 ]] && { prompt -e "Not updated --- global --- ${FILE_UBLINUX_CONF}"; local STATUS=1; }
    #[[ ${STATUS_SYSTEM} == 0 ]] && prompt -s "System configuration updated"
    [[ ${STATUS_SYSTEM} == 0 ]] && prompt -s "Updated ==> system"
    #[[ ${STATUS_SYSTEM} == 1 ]] && { prompt -e "System configuration update failed!"; local STATUS=1; }
    [[ ${STATUS_SYSTEM} == 1 ]] && { prompt -e "Not updated --- system"; local STATUS=1; }
}


###############################
###   :::   M A I N   :::   ###
###############################

    PKGNAME=${0##*/}
    PATH_WORK=${PWD}
    unset ROOTFS; [[ -d /usr/lib/ublinux ]] || ROOTFS=.
    eval $(grep -i "^SYSCONF=" ${ROOTFS}/usr/lib/ublinux/default)
    [[ -n ${SYSCONF} ]] || SYSCONF="/etc/ublinux"

    PATH_UBLINUX_CURRENT="${ROOTFS}${SYSCONF}"
    FILE_UBLINUX_NAME="ublinux.ini"
    FILE_UBLINUX_CONF=$(ls -v1 ${ROOTFS}/memory/layer-base/*/${FILE_UBLINUX_NAME} 2>/dev/null | tail -1)
    FILE_UBLINUX_DEFAULT="${ROOTFS}/usr/lib/ublinux/default"
    FILE_UBLINUX_CONF_TEMPLATE="${ROOTFS}/usr/lib/ublinux/templates/ublinux-data.ini"
    FILE_UBLINUX_CONF_TEMPLATE_RU="${ROOTFS}/usr/lib/ublinux/templates/ublinux-data_ru.ini"
    FILE_UBLINUX_CONF_TEMPLATE_DE="${ROOTFS}/usr/lib/ublinux/templates/ublinux-data.ini"
    FILE_UBLINUX_CONF_TEMPLATE_FR="${ROOTFS}/usr/lib/ublinux/templates/ublinux-data.ini"

## DEBUG PATH:
#DEBUG=yes
#PATH_UBLINUX_CURRENT="./etc/ublinux"; [[ -d ${PATH_UBLINUX_CURRENT} ]] && PATH_UBLINUX_CURRENT=$(realpath "${PATH_UBLINUX_CURRENT}") || exit 1
#FILE_UBLINUX_CONF="ublinux.ini"; [[ -f ${FILE_UBLINUX_CONF} ]] && FILE_UBLINUX_CONF=$(realpath "${FILE_UBLINUX_CONF}") || exit 1
#FILE_UBLINUX_DEFAULT="default"; [[ -f ${FILE_UBLINUX_CONF} ]] && FILE_UBLINUX_DEFAULT=$(realpath "${FILE_UBLINUX_DEFAULT}") ||  exit 1

    REQUEST_ARGS=()
    arguments "$@"
    set -- "${REQUEST_ARGS[@]}"

    [[ -n ${NOCOLOR} ]] || set_color
    SKIP_ARGS_SECTION=0
    [[ -z $1 ]] || prepare_section "$@"
    shift ${SKIP_ARGS_SECTION}

    if [[ ${COMMAND} == 'get' ]]; then
        get_value "$@"
    elif [[ ${COMMAND} == 'set' ]]; then
	[[ -z $1 ]] && help || set_value "$@"
    elif [[ ${COMMAND} == 'remove' ]]; then
	[[ -z $1 ]] && help || remove_value "$@"
    elif [[ ${COMMAND} == 'update' ]]; then
	update_config "$@"
    fi
