#!/bin/bash

# ipforward — управление IPv4-форвардингом для Debian 13
# Использование:
#   ipforward                  — показать текущее состояние
#   ipforward 1                — временно включить
#   ipforward 0                — временно выключить
#   ipforward 1 permanent      — включить постоянно (и сразу)
#   ipforward 0 permanent      — выключить постоянно (и сразу)
#   ipforward status           — то же, что без параметров
#   ipforward help             — справка

SELF=$(basename "$0")

set -euo pipefail

SYSCTL_KEY="net.ipv4.ip_forward"
SYSCTL_FILE="/etc/sysctl.d/99-ipforward.conf"
PROC_FILE="/proc/sys/net/ipv4/ip_forward"

# Цвета (если терминал поддерживает)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

need_root() {
    if [[ $EUID -ne 0 ]]; then
        echo -e "${RED}Ошибка: для изменения настроек нужны права root (sudo).${NC}" >&2
        exit 1
    fi
}

get_current() {
    if [[ -r "$PROC_FILE" ]]; then
        cat "$PROC_FILE"
    else
        sysctl -n "$SYSCTL_KEY" 2>/dev/null || echo "unknown"
    fi
}

show_status() {
    local current
    current=$(get_current)

    echo "=== Текущее состояние IPv4-форвардинга ==="
    if [[ "$current" == "1" ]]; then
        echo -e "Активно сейчас: ${GREEN}ВКЛЮЧЕНО${NC} (1)"
    elif [[ "$current" == "0" ]]; then
        echo -e "Активно сейчас: ${RED}ВЫКЛЮЧЕНО${NC} (0)"
    else
        echo -e "Активно сейчас: ${YELLOW}неизвестно${NC} ($current)"
    fi

    # Проверяем постоянную настройку
    if [[ -f "$SYSCTL_FILE" ]]; then
        local permanent
        permanent=$(grep -E "^\s*${SYSCTL_KEY}\s*=" "$SYSCTL_FILE" 2>/dev/null | tail -1 | awk -F= '{print $2}' | tr -d '[:space:]' || true)
        if [[ "$permanent" == "1" ]]; then
            echo -e "Постоянная настройка: ${GREEN}ВКЛЮЧЕНО${NC} (файл $SYSCTL_FILE)"
        elif [[ "$permanent" == "0" ]]; then
            echo -e "Постоянная настройка: ${RED}ВЫКЛЮЧЕНО${NC} (файл $SYSCTL_FILE)"
        else
            echo -e "Постоянная настройка: ${YELLOW}не найдена/некорректна${NC} в $SYSCTL_FILE"
        fi
    else
        # Проверяем основной sysctl.conf на всякий случай
        if grep -qE "^\s*${SYSCTL_KEY}\s*=\s*1" /etc/sysctl.conf 2>/dev/null; then
            echo -e "Постоянная настройка: ${GREEN}ВКЛЮЧЕНО${NC} (в /etc/sysctl.conf)"
        elif grep -qE "^\s*${SYSCTL_KEY}\s*=\s*0" /etc/sysctl.conf 2>/dev/null; then
            echo -e "Постоянная настройка: ${RED}ВЫКЛЮЧЕНО${NC} (в /etc/sysctl.conf)"
        else
            echo -e "Постоянная настройка: ${YELLOW}не задана${NC} (будет 0 после перезагрузки по умолчанию)"
        fi
    fi
}

set_temporary() {
    local value="$1"
    need_root
    sysctl -w "${SYSCTL_KEY}=${value}" >/dev/null
    echo -e "Временно: IPv4-форвардинг ${value} → $( [[ $value == 1 ]] && echo -e "${GREEN}ВКЛЮЧЁН${NC}" || echo -e "${RED}ВЫКЛЮЧЕН${NC}" )"
}

set_permanent() {
    local value="$1"
    need_root

    # Создаём/обновляем файл в sysctl.d (правильный способ для Debian)
    cat > "$SYSCTL_FILE" <<EOF
# Управление IPv4-форвардингом (создано скриптом ipforward)
${SYSCTL_KEY} = ${value}
EOF

    # Сразу применяем
    sysctl -p "$SYSCTL_FILE" >/dev/null 2>&1 || sysctl -w "${SYSCTL_KEY}=${value}" >/dev/null

    echo -e "Постоянно: IPv4-форвардинг ${value} → $( [[ $value == 1 ]] && echo -e "${GREEN}ВКЛЮЧЁН${NC}" || echo -e "${RED}ВЫКЛЮЧЕН${NC}" )"
    echo "Настройка сохранена в $SYSCTL_FILE и будет действовать после перезагрузки."
}

usage() {
    cat <<EOF
Использование: $SELF [опции]

  $SELF                  Показать текущее состояние
  $SELF status           То же самое
  $SELF 1                Временно включить IPv4-форвардинг
  $SELF 0                Временно выключить IPv4-форвардинг
  $SELF 1 permanent      Включить постоянно (и сразу)
  $SELF 0 permanent      Выключить постоянно (и сразу)
  $SELF help | -h        Показать эту справку

Примеры:
  sudo $SELF 1                  # включить до перезагрузки
  sudo $SELF 1 permanent        # включить навсегда
  sudo $SELF 0 permanent        # выключить навсегда
EOF
}

# --- Основная логика ---
case "${1:-}" in
    ""|status)
        show_status
        ;;
    1|0)
        if [[ "${2:-}" == "permanent" || "${2:-}" == "perm" || "${2:-}" == "p" ]]; then
            set_permanent "$1"
        else
            set_temporary "$1"
        fi
        # После изменения показываем статус
        echo
        show_status
        ;;
    help|-h|--help)
        usage
        ;;
    *)
        echo -e "${RED}Неизвестный параметр: $1${NC}" >&2
        echo
        usage
        exit 1
        ;;
esac
