package linuxmodules

import (
	"fmt"
	"rubric/utils"
)

var NetworkModule = Module{
	Key:         "network",
	Aliases:     []string{"net", "ssh", "сеть"},
	Title:       "Сети и SSH",
	Description: "Темы 42–44: основы сетей, настройка, SSH",
	Run:         showNetwork,
}

func showNetwork() {
	utils.Header("Linux — Сети и SSH")

	// ─── 42. Основы сетей ─────────────────────────────────────────
	utils.Section("42. Основы сетей")

	utils.Println(utils.ColorBold + "Ключевые понятия:" + utils.ColorReset)
	utils.Code(`IP-адрес    — уникальный адрес устройства в сети
              IPv4: 192.168.1.10  (4 байта, 0-255)
              IPv6: 2001:db8::1   (16 байт, hex)
Маска сети  — определяет границу сети и хостов
              /24 = 255.255.255.0 (256 адресов, 254 хоста)
              /16 = 255.255.0.0   (65536 адресов)
Шлюз        — маршрутизатор для выхода за пределы сети
DNS         — перевод имён в IP (8.8.8.8 = Google DNS)
MAC-адрес   — физический адрес сетевого интерфейса
DHCP        — автоматическое получение IP от сервера

Приватные сети (RFC 1918):
  10.0.0.0/8        (10.x.x.x)
  172.16.0.0/12     (172.16-31.x.x)
  192.168.0.0/16    (192.168.x.x)

Localhost:
  127.0.0.1         — loopback IPv4 (lo)
  ::1               — loopback IPv6`)

	utils.Println(utils.ColorBold + "Информация о сетевых интерфейсах:" + utils.ColorReset)
	utils.Command("ip addr", "IP-адреса всех интерфейсов")
	utils.Command("ip addr show eth0", "конкретный интерфейс")
	utils.Command("ip link", "состояние интерфейсов (UP/DOWN)")
	utils.Command("ip route", "таблица маршрутизации")
	utils.Command("ip route show default", "шлюз по умолчанию")
	utils.Command("ip neigh", "ARP-таблица (MAC → IP)")
	fmt.Println()
	utils.Code(`# Старые команды (net-tools, устаревшие):
ifconfig       # → ip addr
route -n       # → ip route
netstat -rn    # → ip route
arp -n         # → ip neigh`)

	utils.Println(utils.ColorBold + "Диагностика сети:" + utils.ColorReset)
	utils.Command("ping 8.8.8.8", "проверить доступность хоста")
	utils.Command("ping -c 4 google.com", "4 пакета")
	utils.Command("ping6 ::1", "ping для IPv6")
	utils.Command("traceroute google.com", "маршрут до хоста")
	utils.Command("tracepath google.com", "маршрут (без root)")
	utils.Command("mtr google.com", "ping + traceroute в реальном времени")
	utils.Command("nslookup google.com", "DNS-запрос")
	utils.Command("dig google.com", "подробный DNS-запрос")
	utils.Command("dig @8.8.8.8 google.com", "DNS через конкретный сервер")
	utils.Command("host google.com", "быстрый DNS-запрос")
	utils.Command("whois 192.168.1.1", "информация об IP/домене")
	fmt.Println()
	utils.Println(utils.ColorBold + "Сетевые соединения и порты:" + utils.ColorReset)
	utils.Command("ss -tuln", "прослушиваемые порты (t=tcp u=udp l=listen n=numeric)")
	utils.Command("ss -tulnp", "с именами процессов (root)")
	utils.Command("ss -s", "статистика соединений")
	utils.Command("ss -tn state established", "активные TCP-соединения")
	utils.Command("netstat -tuln", "аналог ss (устаревший)")
	utils.Command("lsof -i :80", "что слушает порт 80")
	utils.Command("lsof -i :22", "что слушает порт 22")
	utils.Command("nmap -sS 192.168.1.0/24", "сканирование сети (нужно установить)")
	utils.Command("nmap -p 22,80,443 server", "проверить конкретные порты")

	// ─── 43. Работа с сетью ───────────────────────────────────────
	utils.Section("43. Настройка сети")

	utils.Println(utils.ColorBold + "Временная настройка (без сохранения):" + utils.ColorReset)
	utils.Code(`# Добавить IP:
ip addr add 192.168.1.10/24 dev eth0

# Удалить IP:
ip addr del 192.168.1.10/24 dev eth0

# Включить/выключить интерфейс:
ip link set eth0 up
ip link set eth0 down

# Добавить маршрут:
ip route add 10.0.0.0/8 via 192.168.1.1
ip route add default via 192.168.1.1

# Удалить маршрут:
ip route del default`)

	utils.Println(utils.ColorBold + "NetworkManager — постоянная настройка:" + utils.ColorReset)
	utils.Code(`# nmcli — командная строка NetworkManager
nmcli device status           # список устройств
nmcli connection show         # все соединения
nmcli connection show eth0    # параметры соединения

# Статический IP:
nmcli con mod eth0 ipv4.addresses 192.168.1.10/24
nmcli con mod eth0 ipv4.gateway 192.168.1.1
nmcli con mod eth0 ipv4.dns "8.8.8.8 8.8.4.4"
nmcli con mod eth0 ipv4.method manual   # static (не DHCP)
nmcli con up eth0             # применить

# DHCP:
nmcli con mod eth0 ipv4.method auto
nmcli con up eth0

# Создать соединение:
nmcli con add type ethernet con-name myconn ifname eth1 \
    ipv4.addresses 10.0.0.5/24 ipv4.gateway 10.0.0.1 \
    ipv4.method manual

# nmtui — псевдографический интерфейс:
nmtui`)

	utils.Println(utils.ColorBold + "DNS-настройка:" + utils.ColorReset)
	utils.Code(`# /etc/resolv.conf — DNS-серверы:
nameserver 8.8.8.8
nameserver 8.8.4.4
search mydomain.local          # домен для коротких имён

# /etc/hosts — локальное разрешение имён:
127.0.0.1    localhost
192.168.1.10 server01.local server01

# Порядок разрешения (/etc/nsswitch.conf):
hosts: files dns myhostname   # сначала /etc/hosts, потом DNS`)

	utils.Println(utils.ColorBold + "curl и wget — HTTP-запросы:" + utils.ColorReset)
	utils.Command("curl https://example.com", "GET запрос")
	utils.Command("curl -I https://example.com", "только заголовки")
	utils.Command("curl -o file.txt https://example.com/file", "сохранить в файл")
	utils.Command("curl -L https://example.com", "следовать перенаправлениям")
	utils.Command("curl -X POST -d 'data' https://api.example.com", "POST запрос")
	utils.Command("curl -H 'Authorization: Bearer token' https://api.example.com", "с заголовком")
	utils.Command("wget https://example.com/file.tar.gz", "скачать файл")
	utils.Command("wget -r -np https://example.com/docs/", "рекурсивно скачать")

	// ─── 44. SSH ──────────────────────────────────────────────────
	utils.Section("44. Удалённый доступ — SSH")

	utils.Println("SSH (Secure Shell) — зашифрованный протокол удалённого доступа.")
	fmt.Println()
	utils.Println(utils.ColorBold + "Подключение:" + utils.ColorReset)
	utils.Command("ssh user@server", "подключиться к серверу")
	utils.Command("ssh user@192.168.1.10", "по IP")
	utils.Command("ssh -p 2222 user@server", "нестандартный порт")
	utils.Command("ssh -i ~/.ssh/mykey user@server", "с конкретным ключом")
	utils.Command("ssh -v user@server", "подробный вывод (отладка)")
	utils.Command("ssh -A user@server", "пробросить SSH-агент")
	fmt.Println()
	utils.Println(utils.ColorBold + "SSH-ключи — аутентификация без пароля:" + utils.ColorReset)
	utils.Code(`# Генерация пары ключей:
ssh-keygen -t ed25519 -C "alice@example.com"  # (рекомендуется)
ssh-keygen -t rsa -b 4096 -C "alice@example.com"  # RSA 4096

# Файлы:
~/.ssh/id_ed25519       — приватный ключ (НИКОМУ не передавать!)
~/.ssh/id_ed25519.pub   — публичный ключ

# Скопировать публичный ключ на сервер:
ssh-copy-id user@server              # автоматически
ssh-copy-id -i ~/.ssh/mykey.pub user@server

# Вручную (добавить в ~/.ssh/authorized_keys на сервере):
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh/`)

	utils.Println(utils.ColorBold + "~/.ssh/config — настройка подключений:" + utils.ColorReset)
	utils.Code(`# ~/.ssh/config
Host myserver
    HostName 192.168.1.10
    User alice
    Port 22
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60

Host bastion
    HostName bastion.example.com
    User admin
    ForwardAgent yes

Host internal
    HostName 10.0.0.5
    User root
    ProxyJump bastion    # подключиться через bastion

# Использование:
ssh myserver        # вместо ssh alice@192.168.1.10 -i ~/.ssh/id_ed25519`)

	utils.Println(utils.ColorBold + "Передача файлов:" + utils.ColorReset)
	utils.Command("scp file.txt user@server:/path/", "скопировать на сервер")
	utils.Command("scp user@server:/path/file.txt .", "скопировать с сервера")
	utils.Command("scp -r dir/ user@server:/path/", "директорию рекурсивно")
	utils.Command("rsync -avzP dir/ user@server:/path/", "синхронизация (лучше scp)")
	fmt.Println()
	utils.Println(utils.ColorBold + "Конфигурация сервера (/etc/ssh/sshd_config):" + utils.ColorReset)
	utils.Code(`Port 22                        # порт (лучше изменить)
PermitRootLogin no             # запретить вход root (рекомендуется)
PasswordAuthentication no      # только ключи
PubkeyAuthentication yes       # ключи разрешены
AuthorizedKeysFile .ssh/authorized_keys
AllowUsers alice bob           # только эти пользователи
MaxAuthTries 3                 # попытки аутентификации

# Применить изменения:
sudo systemctl reload sshd

# Проверить конфигурацию:
sudo sshd -t`)

	utils.Println(utils.ColorBold + "Туннели SSH (Port Forwarding):" + utils.ColorReset)
	utils.Code(`# Локальный туннель (доступ к удалённому сервису через localhost):
ssh -L 8080:localhost:80 user@server
# Теперь http://localhost:8080 = http://server:80

# Удалённый туннель (открыть порт на удалённом сервере):
ssh -R 9090:localhost:3000 user@server
# Теперь server:9090 → localhost:3000

# SOCKS-прокси (динамический туннель):
ssh -D 1080 user@server
# Настроить браузер на SOCKS5 proxy localhost:1080`)

	utils.Footer()
}
