#!/usr/bin/env bash
#
# Author: Dmitry Razumov <asmeron@ublinux.com>
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
#

ENABLED=yes
[[ ${ENABLED} == yes ]] || exit 0
DEBUGMODE=no

SOURCE=/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null  || exit 0
SOURCE=/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null  || exit 0
SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/network; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null

FILE_NETWORK="${SYSCONF}/network"

debug_mode "$0" "$@"

# mount ublinux-server

## Переделать authselect и связать с опциями домена
    # Name Service Switch Win Avahi nsswitch.conf
#    if [[ ${NSSWITCHAVAHI,,} == "yes" ]]; then
#	file_nss=$(grep hosts /etc/nsswitch.conf)
#	grep -q "mdns4_minimal" <<< "${file_nss}" || sed "/^hosts: /s/ resolve/ mdns4_minimal [NOTFOUND=return] resolve/" -i /etc/nsswitch.conf
#	grep -q "mdns4" <<< "${file_nss}" || sed "/^hosts: /s/ dns/ dns mdns4/" -i /etc/nsswitch.conf
#    fi
#    if [[ ${NSSWITCHWINS,,} == "yes" ]]; then
#	[[ -z ${file_nss} ]] && file_nss=$(grep hosts /etc/nsswitch.conf)
#	grep -q "wins" <<< "${file_nss}" || sed "/^hosts:/s/ dns/ dns wins/" -i /etc/nsswitch.conf
#    fi

exec_network(){
    # Network configuration
    if [[ -n ${NETWORK[@]} ]]; then
	NMCLI_UP_DEVICE=()
	NMCLI_UP_UUID=()
	IFS=$'\n'; declare -a NETWORK_ORDER=($(sed -E '/^\s*NETWORK\[/!d;s/^\s*NETWORK\[(.*)\]=.*/\1/' ${FILE_NETWORK})); unset IFS #'
	for NETWORK_ITEM in "${NETWORK_ORDER[@]}"; do
	    NETWORK_NAME=${NETWORK_ITEM%%@*}
	    NETWORK_TYPE=${NETWORK_ITEM#*@}
	    #NETWORK_DEVICE_ALL=$(nmcli --mode tabular -g GENERAL.DEVICE,GENERAL.TYPE,GENERAL.CONNECTION,GENERAL.CON-UUID device show | sed -E ':a;N;$!ba;s/\n/,/g;s/[,]{2,}/\n/g' | grep '\S')
	    NETWORK_DEVICE_ALL="$(nmcli -m multiline -f GENERAL.DEVICE,GENERAL.TYPE,GENERAL.CONNECTION,GENERAL.CON-UUID,GENERAL.HWADDR device show | sed -E "s/.*:\s{4,}//" | sed -E ':a;N;$!ba;s/\n/|/g;s/[|]{2,}/|\n/g')|"
	    NETWORK_DEVICE_ALL+=$'\n'$(nmcli -m tabular -t -f device,type,name,uuid connection show | sed 's/$/|/;s/:/|/g;s/802-3-ethernet/ethernet/g;s/802-11-wireless/wireless/g')
	    NETWORK_DEVICE_ALL=$(sort --field-separator='|' -u -k 1,1 <<< ${NETWORK_DEVICE_ALL})
#	    echo "${NETWORK_NAME}@${NETWORK_TYPE}=${NETWORK[${NETWORK_ITEM}]}"
	    if [[ ${NETWORK_TYPE,,} == "nmcli" ]]; then
		eval "nmcli ${NETWORK[${NETWORK_ITEM}]}" &>/dev/null
	    elif [[ ${NETWORK_TYPE,,} == "wifi" ]]; then
		eval "nmcli device wifi ${NETWORK[${NETWORK_ITEM}]}" &>/dev/null
	    elif [[ ${NETWORK_TYPE,,} == "imp-ovpn" ]]; then
		eval "nmcli connection import type openvpn file ${NETWORK[${NETWORK_ITEM}]}" &>/dev/null
	    elif [[ ${NETWORK_TYPE,,} == "add-pptp" ]]; then
		eval "nmcli connection add connection.id ${NETWORK_NAME} connection.type vpn vpn.service-type pptp ${NETWORK[${NETWORK_ITEM}]}" &>/dev/null
	    elif [[ ${NETWORK_TYPE,,} == "add-l2tp" ]]; then
		eval "nmcli connection add connection.id ${NETWORK_NAME} connection.type vpn vpn.service-type l2tp ${NETWORK[${NETWORK_ITEM}]}" &>/dev/null
	    else
		[[ ${NETWORK_NAME,,} =~ "all"|"any" ]] && UNIT_DEVICE_FIND=${NETWORK_DEVICE_ALL} \
		|| UNIT_DEVICE_FIND=$(grep "${NETWORK_NAME}|" <<< ${NETWORK_DEVICE_ALL})
#		echo "UNIT_DEVICE_FIND=${UNIT_DEVICE_FIND}"
		while read UNIT_DEVICE; do
#		    echo "UNIT_DEVICE=${UNIT_DEVICE}"
		    DEVICE=${UNIT_DEVICE%%|*}; UNIT_DEVICE_TRIM=${UNIT_DEVICE#*|}
		    TYPE=${UNIT_DEVICE_TRIM%%|*}; UNIT_DEVICE_TRIM=${UNIT_DEVICE_TRIM#*|}
		    CONNECTION=${UNIT_DEVICE_TRIM%%|*}; UNIT_DEVICE_TRIM=${UNIT_DEVICE_TRIM#*|}
		    UUID=${UNIT_DEVICE_TRIM%%|*}
#		    echo "DEVICE=${DEVICE}:TYPE=${TYPE}:CONNECTION=${CONNECTION}:UUID=${UUID}"
		    if [[ -n ${DEVICE} ]]; then
			[[ ${NETWORK_TYPE,,} == "devmod" ]] && NMCLI_UP_DEVICE+=("${DEVICE}") && eval "nmcli device modify ${DEVICE} ${NETWORK[${NETWORK_ITEM}]}" &>/dev/null
			[[ ${NETWORK_TYPE,,} == "devup" ]] && nmcli device up ${DEVICE} &>/dev/null
			[[ ${NETWORK_TYPE,,} == "devdown" ]] && nmcli device down ${DEVICE} &>/dev/null
		    fi
		    if [[ -n ${UUID} && ${UUID} != "--" ]]; then
			[[ ${NETWORK_TYPE,,} == "connmod" ]] && NMCLI_UP_UUID+=("${UUID}") && eval "nmcli connection modify ${UUID} ${NETWORK[${NETWORK_ITEM}]}" &>/dev/null
			[[ ${NETWORK_TYPE,,} == "connup" ]] && nmcli connection up uuid ${UUID} &>/dev/null
			[[ ${NETWORK_TYPE,,} == "conndown" ]] && nmcli connection down uuid ${UUID} &>/dev/null
		    fi
		done <<< "${UNIT_DEVICE_FIND}"
	    fi
	done
	#nmcli networking off && nmcli networking on
	# Переподнятие устройств/подключений, для применения изменений
	if [[ -n ${NMCLI_UP_DEVICE} ]]; then
	    while read -r ITEM_DEVICE; do
		nmcli device show ${ITEM_DEVICE} | grep -q GENERAL.STATE && nmcli device up ${ITEM_DEVICE} &>/dev/null
	    done < <(printf '%s\n' "${NMCLI_UP_DEVICE[@]}")
	fi
	if [[ -n ${NMCLI_UP_UUID} ]]; then
	    while read -r ITEM_UUID; do
		nmcli connection show uuid ${ITEM_UUID} | grep -q GENERAL.STATE && nmcli connection up uuid ${ITEM_UUID} &>/dev/null
	    done < <(printf '%s\n' "${NMCLI_UP_UUID[@]}")
	fi
	sed "/password/d" -i ${FILE_NETWORK}
    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

