#!/bin/bash

# Функция для проверки IPv4
function is_valid_ipv4() {
    local ip=$1
    local stat=1
    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        OIFS=$IFS
        IFS='.'
        ip=($ip)
        IFS=$OIFS
        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
            && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
        stat=$?
    fi
    return $stat
}

# Функция для проверки IPv6
function is_valid_ipv6() {
    local ip=$1
    local stat=1
    if [[ $ip =~ ^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$ ]]; then
        stat=0
    fi
    return $stat
}

# Определение шлюза
function get_gateway() {
    local ip=$1
    if is_valid_ipv4 "$ip"; then
        IFS='.' read -ra octets <<< "$ip"
        octets[3]=1
        echo "${octets[0]}.${octets[1]}.${octets[2]}.${octets[3]}"
    elif is_valid_ipv6 "$ip"; then
        IFS=':' read -ra hextets <<< "$ip"
        hextets[-1]="1"
        echo "$(IFS=:; echo "${hextets[*]}")"
    else
        echo "Неверный IP-адрес"
        exit 1
    fi
}

# Форматирование DNS для YAML
function format_dns() {
    local formatted=()
    for addr in "$@"; do
        formatted+=("\"$addr\"")
    done
    echo "${formatted[*]}" | sed 's/ /, /g'
}

# Вывод списка доступных интерфейсов
function show_interfaces() {
    echo "Доступные сетевые интерфейсы:"
    ip -o link show | awk -F': ' '{print $2}'
}

# Запрос типа настройки
read -p "Настройка временная (1) или постоянная (2)? Введите 1 или 2: " config_type

# Вывод списка интерфейсов и запрос выбора
show_interfaces
read -p "Введите имя интерфейса (например, eth0): " interface

# Проверка существования интерфейса
if ! ip link show "$interface" &> /dev/null; then
    echo "Интерфейс $interface не найден!"
    exit 1
fi

# Ввод IPv4 адресов
while true; do
    read -p "Введите IPv4 адреса через пробел (первый будет основным): " ipv4_input
    ipv4_addresses=($ipv4_input)
    valid=true
    for ip in "${ipv4_addresses[@]}"; do
        if ! is_valid_ipv4 "$ip"; then
            echo "Неверный формат IPv4: $ip"
            valid=false
            break
        fi
    done
    if $valid; then
        break
    fi
done

# Основной IPv4 и шлюз
main_ipv4=${ipv4_addresses[0]}
ipv4_gateway=$(get_gateway "$main_ipv4")

# Ввод IPv6 адресов (опционально)
read -p "Добавить IPv6 адреса? (y/n): " add_ipv6
if [[ $add_ipv6 == "y" ]]; then
    while true; do
        read -p "Введите IPv6 адреса через пробел (первый будет основным): " ipv6_input
        ipv6_addresses=($ipv6_input)
        valid=true
        for ip in "${ipv6_addresses[@]}"; do
            if ! is_valid_ipv6 "$ip"; then
                echo "Неверный формат IPv6: $ip"
                valid=false
                break
            fi
        done
        if $valid; then
            break
        fi
    done

    # Основной IPv6 и шлюз
    main_ipv6=${ipv6_addresses[0]}
    ipv6_gateway=$(get_gateway "$main_ipv6")
fi

# DNS-серверы
dns=()
read -p "Использовать DNS по умолчанию (Cloudflare)? (y/n): " use_default_dns
if [[ $use_default_dns == "y" ]]; then
    dns=("1.1.1.1" "1.0.0.1" "2606:4700:4700::1111" "2606:4700:4700::1001")
else
    echo "Введите DNS-серверы (завершите пустой строкой):"
    while true; do
        read dns_entry
        [[ -z $dns_entry ]] && break
        dns+=("$dns_entry")
    done
fi
dns_string=$(format_dns "${dns[@]}")

# Временная настройка
if [[ $config_type == "1" ]]; then
    echo "Применение временных настроек..."
    # Добавление IPv4 адресов
    for ip in "${ipv4_addresses[@]}"; do
        sudo ip addr add "$ip/24" dev $interface
    done
    
    # Добавление IPv6 адресов
    if [[ $add_ipv6 == "y" ]]; then
        for ip in "${ipv6_addresses[@]}"; do
            sudo ip addr add "$ip/128" dev $interface
        done
    fi
    
    # Настройка маршрутов
    if [[ -n "$ipv4_gateway" ]]; then
        sudo ip route replace default via $ipv4_gateway dev $interface
    fi
    if [[ -n "$ipv6_gateway" && $add_ipv6 == "y" ]]; then
        sudo ip -6 route replace default via $ipv6_gateway dev $interface
    fi
    
    echo "Временные настройки применены"

# Постоянная настройка для Ubuntu
else
    echo "Применение постоянных настроек для Ubuntu..."
    
    # Создание IPv4 конфига
    if [[ ${#ipv4_addresses[@]} -gt 0 ]]; then
        ipv4_file="/etc/netplan/99-ipv4.yaml"
        # Форматирование адресов для YAML
        ipv4_formatted=()
        for ip in "${ipv4_addresses[@]}"; do
            ipv4_formatted+=("\"$ip/24\"")
        done
        ipv4_string=$(IFS=,; echo "${ipv4_formatted[*]}")
        
        cat << EOF | sudo tee $ipv4_file > /dev/null
network:
  version: 2
  renderer: networkd
  ethernets:
    $interface:
      dhcp4: false
      addresses: [$ipv4_string]
      routes:
        - to: 0.0.0.0/0
          via: $ipv4_gateway
      nameservers:
        addresses: [$dns_string]
EOF
        sudo chmod 600 $ipv4_file
    fi
    
    # Создание IPv6 конфига
    if [[ ${#ipv6_addresses[@]} -gt 0 && $add_ipv6 == "y" ]]; then
        ipv6_file="/etc/netplan/99-ipv6.yaml"
        # Форматирование адресов для YAML
        ipv6_formatted=()
        for ip in "${ipv6_addresses[@]}"; do
            ipv6_formatted+=("\"$ip/128\"")
        done
        ipv6_string=$(IFS=,; echo "${ipv6_formatted[*]}")
        
        cat << EOF | sudo tee $ipv6_file > /dev/null
network:
  version: 2
  renderer: networkd
  ethernets:
    $interface:
      dhcp6: false
      addresses: [$ipv6_string]
      routes:
        - to: ::/0
          via: $ipv6_gateway
      nameservers:
        addresses: [$dns_string]
EOF
        sudo chmod 600 $ipv6_file
    fi
    
    # Резервирование старых конфигов
    sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.backup 2>/dev/null
    
    # Применение настроек
    sudo netplan apply
    echo "Настройки применены. Рекомендуется перезагрузить сервер."
fi
