package linuxmodules

import (
	"fmt"
	"rubric/utils"
)

var SysconfigModule = Module{
	Key:         "sysconfig",
	Aliases:     []string{"cfg", "time", "ntp", "chrony", "настройка"},
	Title:       "Конфигурация системы",
	Description: "Темы 53–54: установка RHEL, настройка времени, NTP, chronyd",
	Run:         showSysconfig,
}

func showSysconfig() {
	utils.Header("Linux — Конфигурация системы")

	// ─── 53. Установка RHEL ───────────────────────────────────────
	utils.Section("53. Установка RHEL и первоначальная настройка")

	utils.Println("RHEL (Red Hat Enterprise Linux) — коммерческий дистрибутив.")
	utils.Println("Бесплатные альтернативы: AlmaLinux, Rocky Linux (1:1 совместимы с RHEL).")
	fmt.Println()
	utils.Println(utils.ColorBold + "Получение RHEL:" + utils.ColorReset)
	utils.Code(`# Бесплатная подписка для разработчиков (до 16 машин):
# https://developers.redhat.com/articles/faqs-no-cost-red-hat-enterprise-linux

# Скачать ISO:
# https://access.redhat.com/downloads

# Альтернативы без подписки:
# AlmaLinux: https://almalinux.org
# Rocky Linux: https://rockylinux.org
# CentOS Stream: https://www.centos.org/centos-stream/`)

	utils.Println(utils.ColorBold + "Первоначальная настройка после установки:" + utils.ColorReset)
	utils.Code(`# Обновить систему:
dnf update -y

# Настроить hostname:
hostnamectl set-hostname server01.example.com
hostnamectl status

# Настроить часовой пояс:
timedatectl set-timezone Europe/Moscow

# Включить автоматическую синхронизацию времени:
timedatectl set-ntp true

# Добавить репозиторий EPEL (Extra Packages):
dnf install epel-release -y
# или для RHEL:
subscription-manager repos --enable codeready-builder-for-rhel-9-x86_64-rpms

# Включить CRB (CodeReady Builder) — нужен для некоторых пакетов EPEL:
dnf config-manager --set-enabled crb   # RHEL 9
dnf config-manager --set-enabled powertools  # RHEL 8`)

	utils.Println(utils.ColorBold + "subscription-manager — управление подпиской RHEL:" + utils.ColorReset)
	utils.Code(`# Зарегистрировать систему:
subscription-manager register --username=myuser --password=mypass

# Присоединить подписку:
subscription-manager attach --auto

# Список доступных репозиториев:
subscription-manager repos --list

# Включить репозиторий:
subscription-manager repos --enable rhel-9-for-x86_64-baseos-rpms
subscription-manager repos --enable rhel-9-for-x86_64-appstream-rpms

# Отключить регистрацию:
subscription-manager unregister`)

	utils.Println(utils.ColorBold + "hostnamectl — управление именем хоста:" + utils.ColorReset)
	utils.Command("hostnamectl", "показать всю информацию о хосте")
	utils.Command("hostnamectl set-hostname myserver", "установить hostname")
	utils.Command("hostnamectl set-hostname 'My Server' --pretty", "красивое имя")
	utils.Command("hostname", "показать текущий hostname")
	utils.Command("cat /etc/hostname", "hostname из файла")
	fmt.Println()
	utils.Println(utils.ColorBold + "localectl — настройка локали и раскладки:" + utils.ColorReset)
	utils.Command("localectl", "показать текущую локаль")
	utils.Command("localectl list-locales | grep ru", "русские локали")
	utils.Command("localectl set-locale LANG=ru_RU.UTF-8", "установить русскую локаль")
	utils.Command("localectl set-keymap ru", "русская раскладка для консоли")
	utils.Command("localectl list-keymaps | grep ru", "доступные раскладки")

	// ─── 54. Настройка времени ────────────────────────────────────
	utils.Section("54. Настройка времени. NTP и chronyd")

	utils.Println(utils.ColorBold + "Типы часов в Linux:" + utils.ColorReset)
	utils.Code(`RTC (Hardware Clock) — аппаратные часы (BIOS/UEFI), работают без питания
System Clock        — системные часы ядра, синхронизируются от RTC при загрузке

UTC vs LOCAL:
RTC рекомендуется хранить в UTC, чтобы избежать проблем с летним временем.
Отображение в локальном времени — задача ОС.`)

	utils.Println(utils.ColorBold + "timedatectl — управление временем:" + utils.ColorReset)
	utils.Command("timedatectl", "показать время, часовой пояс, NTP")
	utils.Command("timedatectl status", "то же самое")
	utils.Command("timedatectl list-timezones", "список часовых поясов")
	utils.Command("timedatectl list-timezones | grep Moscow", "найти московский пояс")
	utils.Command("timedatectl set-timezone Europe/Moscow", "установить часовой пояс")
	utils.Command("timedatectl set-time '2024-01-15 14:30:00'", "установить время вручную")
	utils.Command("timedatectl set-ntp true", "включить синхронизацию по NTP")
	utils.Command("timedatectl set-ntp false", "отключить NTP")
	utils.Command("timedatectl set-local-rtc 0", "хранить RTC в UTC")
	fmt.Println()
	utils.Println(utils.ColorBold + "hwclock — работа с аппаратными часами:" + utils.ColorReset)
	utils.Command("hwclock", "показать время RTC")
	utils.Command("hwclock --systohc", "записать системное время в RTC")
	utils.Command("hwclock --hctosys", "установить системное время из RTC")
	utils.Command("hwclock --utc", "RTC в UTC")
	fmt.Println()
	utils.Println(utils.ColorBold + "NTP — Network Time Protocol:" + utils.ColorReset)
	utils.Code(`NTP — протокол синхронизации времени по сети.
Иерархия серверов (stratum):
  Stratum 0 — атомные часы, GPS
  Stratum 1 — серверы напрямую подключённые к stratum 0
  Stratum 2 — синхронизируются от stratum 1
  ...
  Stratum 16 — несинхронизированы

Популярные публичные NTP-серверы:
  pool.ntp.org          — пул серверов (рекомендуется)
  time.google.com       — Google
  time.cloudflare.com   — Cloudflare
  ntp1.vniiftri.ru      — Россия (ВНИИФТРИ)
  ntp2.vniiftri.ru      — Россия`)

	utils.Println(utils.ColorBold + "chronyd — рекомендуемый NTP-клиент в RHEL:" + utils.ColorReset)
	utils.Code(`# Установка (обычно предустановлен):
dnf install chrony      # RHEL/Fedora
apt install chrony      # Debian/Ubuntu

# Управление:
systemctl enable --now chronyd
systemctl status chronyd`)

	utils.Command("chronyc tracking", "статус синхронизации")
	utils.Command("chronyc sources", "список NTP-источников")
	utils.Command("chronyc sources -v", "подробно")
	utils.Command("chronyc sourcestats", "статистика источников")
	utils.Command("chronyc makestep", "принудительно синхронизировать (мгновенный шаг)")
	utils.Command("chronyc ntpdata", "NTP-данные каждого источника")
	fmt.Println()
	utils.Println(utils.ColorBold + "Конфигурация chronyd (/etc/chrony.conf):" + utils.ColorReset)
	utils.Code(`# Серверы синхронизации:
server pool.ntp.org iburst
server ntp1.vniiftri.ru iburst
server ntp2.vniiftri.ru iburst
pool 2.rhel.pool.ntp.org iburst

# iburst — отправлять несколько пакетов при первом контакте (быстрее)

# Разрешить синхронизацию для подсети (NTP-сервер):
allow 192.168.1.0/24

# Синхронизировать RTC с системными часами:
rtcsync

# Сохранять данные о дрейфе:
driftfile /var/lib/chrony/drift

# Принять шаг > 1 сек только при старте:
makestep 1.0 3

# Применить изменения:
systemctl restart chronyd`)

	utils.Println(utils.ColorBold + "Настройка chronyd как NTP-сервера для локальной сети:" + utils.ColorReset)
	utils.Code(`# /etc/chrony.conf на сервере:
server pool.ntp.org iburst
allow 192.168.1.0/24    # разрешить клиентам из этой подсети

# На клиентах /etc/chrony.conf:
server 192.168.1.10 iburst  # указать IP локального NTP-сервера

# Открыть порт на файрволе сервера:
firewall-cmd --permanent --add-service=ntp
firewall-cmd --reload

# Проверить что клиент синхронизирован:
chronyc sources`)

	utils.Footer()
}
