#!/bin/bash
powershell="/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe"

# Fichier variables nftables
utilsvariablesnftablesfile="/etc/scibian-firewall/utils/variables"

regex_ethernet_interfaces_var="^define ethernet_interfaces.*"
regex_vpn_interfaces_var="^define vpn_interface.*"
regex_wifi_interfaces_var="^define wifi_interfaces.*"

script="(Get-NetAdapter -IncludeHidden | Select-Object MacAddress, NdisPhysicalMedium, InterfaceDescription |ConvertTo-Csv -Delimiter '|' -NoTypeInformation | Select-Object -Skip 1) -replace '\"',''"

# Recherche type interface (Wifi, VPN ou Ethernet)
listInterfaces="$($powershell -Command "$script")"

vpn_interfaces=()
wifi_interfaces=()
ethernet_interfaces=()
while IFS= read -r line
do
    MacAddress="$(echo "$line" | cut -d'|' -f1 | sed "s/-/:/g" | tr '[:upper:]' '[:lower:]')"
    NdisPhysicalMedium="$(echo "$line" | cut -d'|' -f2)"
    InterfaceDescription="$(echo "$line" | cut -d'|' -f3-)"
    interfacename="$(ip -br link | awk -v ma="$MacAddress" '$3 ~ ma {print $1}')"
    if [ -n "$MacAddress" ] && [ -n "$interfacename" ]; then
        if [ "$NdisPhysicalMedium" == "9" ]; then
            interfacetype="wifi"
            wifi_interfaces+=("$interfacename")
        elif [ "$NdisPhysicalMedium" == "14" ] || [ "$NdisPhysicalMedium" == "0" ]; then
            if [[ "$InterfaceDescription" =~ .*"Juniper".* ]]; then
                interfacetype="vpn"
                vpn_interfaces+=("$interfacename")
            else
                interfacetype="ethernet"
                ethernet_interfaces+=("$interfacename")
            fi
        else
            continue
        fi
        echo "Associated interface $interfacename -> $MacAddress -> $interfacetype"
    fi
done < <(printf '%s\n' "$listInterfaces")

formatListToNftVariable () {
    local tab=("$@")
    for i in "${!tab[@]}"; do
        if [ ${#tab[@]} -gt 1 ];then
                if [ "$i" -eq 0 ]; then
                        formatlistnft+="{\"${tab[$i]}\","
                elif [ "$i" -eq "$((${#tab[@]}-1))" ]; then
                        formatlistnft+=" \"${tab[$i]}\"}"
                else
                formatlistnft+="\"${tab[$i]}\","
                fi
        else
                formatlistnft="${tab[0]}"
        fi
    done
    echo "${formatlistnft// /}"
}

format_vpn_interfaces=$(formatListToNftVariable "${vpn_interfaces[@]}")
format_wifi_interfaces=$(formatListToNftVariable "${wifi_interfaces[@]}")
format_ethernet_interfaces=$(formatListToNftVariable "${ethernet_interfaces[@]}")

current_format_vpn_interfaces="$(grep "$regex_vpn_interfaces_var" "$utilsvariablesnftablesfile" | cut -d= -f2 | sed "s/ //g")"
current_format_ethernet_interfaces="$(grep "$regex_ethernet_interfaces_var" "$utilsvariablesnftablesfile" | cut -d= -f2 | sed "s/ //g")"
current_format_wifi_interfaces="$(grep "$regex_wifi_interfaces_var" "$utilsvariablesnftablesfile" | cut -d= -f2 | sed "s/ //g")"

if [ -n "$format_wifi_interfaces" ] && [ "$current_format_wifi_interfaces" != "$format_wifi_interfaces" ]; then
        sed -i "s/$regex_wifi_interfaces_var/define wifi_interfaces = $format_wifi_interfaces/g" $utilsvariablesnftablesfile
        echo "INFO: Variable wifi_interfaces updated in $utilsvariablesnftablesfile file"
        systemctl reload nftables
fi
if [ -n "$format_ethernet_interfaces" ] && [ "$current_format_ethernet_interfaces" != "$format_ethernet_interfaces" ]; then
        sed -i "s/$regex_ethernet_interfaces_var/define ethernet_interfaces = $format_ethernet_interfaces/g" $utilsvariablesnftablesfile
        echo "INFO: Variable ethernet_interfaces updated in $utilsvariablesnftablesfile file"
        systemctl reload nftables
fi
if [ -n "$format_vpn_interfaces" ] && [ "$current_format_vpn_interfaces" != "$format_vpn_interfaces" ]; then
        sed -i "s/$regex_vpn_interfaces_var/define vpn_interface = $format_vpn_interfaces/g" $utilsvariablesnftablesfile
        echo "INFO: Variable vpn_interface updated in $utilsvariablesnftablesfile file"
        systemctl reload nftables
fi

# On ignore les interfaces loopback
if [ "$IFACE" != "lo*" ]; then
    if [ "$STATE" = "off" ]; then
        python3 /etc/scibian-firewall/03-scibian-firewall "$IFACE" "down"
    elif [ "$STATE" = "routable" ]; then
        python3 /etc/scibian-firewall/03-scibian-firewall "$IFACE" "up"
    fi
fi