#!/usr/bin/env bash

## Скрипт настраивает дублирование udp-пакетов передаваемых
## в порт IP_PORT_IN на заданный порт IP_PORT_OUT.
## Предназначен для работы в среде Астра 1.6 Смоленск:
## ```bash
## iptables --version
## ```
## > iptables v1.8.2 (nf_tables)

INI_FILE="/opt/5p28/device.ini"  ## Путь к INI-файлу 5п28
SECTION_NAME="navigat"           ## Название секции INI-файла 5п28
IP_PORT_NAME="port"              ## Имя поля INI-файла 5п28 в котором хранится номер порта назначения
IP_PORT_OUT="60000"              ## Порт на который направлять дублированные пакеты
SUDO_PASS="12345678"             ## Пароль администратора

set -e

if [[ -n "$1" ]]; then
  INI_FILE="$1"
fi

if [[ -n "$2" ]]; then
  SUDO_PASS="$2"
fi

if [[ -n "$3" ]]; then
  IP_PORT_OUT="$3"
fi

# Возвращает значение из INI-файла
read_ini() {
    local section="$1"
    local key="$2"
    # Игнорируем комментарии (# и ;), обрезаем пробелы
    awk -F '=' -v section="$section" -v key="$key" '
        /^\[/ { current_section = substr($0, 2, length($0)-2) }
        current_section == section && $1 ~ /^[[:space:]]*'$key'[[:space:]]*$/ {
            gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2)
            gsub(/^"|"$/, "", $2)  # Удаляем кавычки, если есть
            print $2
            exit
        }
    ' "${INI_FILE}"
}

# Проверка существования файла
if [[ ! -f "${INI_FILE}" ]]; then
    echo "ошибка: файл \"${INI_FILE}\" не найден"
    exit 1
fi

# Чтение значений из ini-файла
IP_PORT_IN=$(read_ini "${SECTION_NAME}" "${IP_PORT_NAME}")

# Проверка достоверности
if [[ -z "$IP_PORT_IN" ]]; then
    echo "ошибка: параметр \"${IP_PORT_NAME}\" не найден в секции [${SECTION_NAME}]"
    exit 1
fi

# Дублирование трафика на другой порт. Перенаправить копии входящих UDP-пакетов
# с порта ${IP_PORT_IN} на порт ${IP_PORT_OUT}, чтобы другой процесс продолжал
# работать с портом ${IP_PORT_IN}, а копии пакетов отправлялись на ${IP_PORT_OUT}:
echo "${SUDO_PASS}" | sudo -S iptables -t nat -A PREROUTING -p udp --dport "${IP_PORT_IN}" -j REDIRECT --to-ports "${IP_PORT_OUT}"
echo "${SUDO_PASS}" | sudo -S iptables -A INPUT -p udp --dport "${IP_PORT_IN}" -j ACCEPT
echo "${SUDO_PASS}" | sudo -S iptables -t nat -L -n -v
