package linuxmodules

import (
	"rubric/utils"
)

var LogsModule = Module{
	Key:         "logs",
	Aliases:     []string{"l", "cron", "логи"},
	Title:       "Логирование и планировщики",
	Description: "Темы 36–37: rsyslog, journald, cron, at",
	Run:         showLogs,
}

func showLogs() {
	utils.Header("Linux — Логирование и планировщики задач")

	// ─── 36. Логирование ──────────────────────────────────────────
	utils.Section("36. Логирование")

	utils.Println("В современных системах логирование — двухуровневое:")
	utils.Println("journald (systemd) + rsyslog/syslog (традиционный)")

	utils.Println(utils.ColorBold + "\nОсновные лог-файлы в /var/log/:" + utils.ColorReset)
	utils.Code(`/var/log/syslog         — общий системный лог (Debian/Ubuntu)
/var/log/messages       — общий системный лог (RHEL/Fedora)
/var/log/auth.log       — аутентификация, sudo, ssh (Debian)
/var/log/secure         — аутентификация (RHEL)
/var/log/kern.log       — сообщения ядра
/var/log/dmesg          — сообщения при загрузке
/var/log/boot.log       — процесс загрузки
/var/log/cron           — задания cron
/var/log/mail.log       — почтовый сервер
/var/log/nginx/         — access.log, error.log
/var/log/apache2/       — access.log, error.log
/var/log/mysql/         — error.log
/var/log/dpkg.log       — установка пакетов (Debian)
/var/log/dnf.log        — установка пакетов (RHEL)
/var/log/wtmp           — история входов (last для чтения)
/var/log/btmp           — неудачные попытки входа (lastb)
/var/log/lastlog        — последний вход каждого пользователя`)

	utils.Println(utils.ColorBold + "Работа с логами:" + utils.ColorReset)
	utils.Command("tail -f /var/log/syslog", "следить за системным логом")
	utils.Command("tail -n 100 /var/log/auth.log", "последние 100 строк лога входов")
	utils.Command("grep 'ERROR' /var/log/nginx/error.log", "ошибки nginx")
	utils.Command("grep -i 'failed' /var/log/auth.log", "неудачные входы")
	utils.Command("zcat /var/log/syslog.1.gz", "читать сжатый архивный лог")
	utils.Command("zgrep 'error' /var/log/syslog.*.gz", "поиск в архивных логах")
	utils.Command("last", "история входов в систему")
	utils.Command("lastb", "неудачные попытки входа (root)")
	utils.Command("lastlog", "последний вход каждого пользователя")

	utils.Println(utils.ColorBold + "\nrsyslog — конфигурация:" + utils.ColorReset)
	utils.Code(`# Конфиг: /etc/rsyslog.conf и /etc/rsyslog.d/*.conf
# Формат правил: facility.priority  назначение

# Facility (источник):
auth, authpriv    — аутентификация
cron              — планировщик
daemon            — системные демоны
kern              — ядро
mail              — почта
user              — пользовательские программы
local0..local7    — зарезервированы для своего использования
*                 — все

# Priority (уровень, по возрастанию важности):
debug, info, notice, warning, err, crit, alert, emerg

# Примеры правил:
*.info;mail.none;authpriv.none  /var/log/messages  # всё кроме mail и auth
authpriv.*                      /var/log/secure     # всё от authpriv
mail.*                          /var/log/maillog    # почта
cron.*                          /var/log/cron       # cron
*.emerg                         :omusrmsg:*         # критичное — всем пользователям
local1.*                        /var/log/myapp.log  # своё приложение

# Перезапустить rsyslog:
sudo systemctl restart rsyslog`)

	utils.Println(utils.ColorBold + "logrotate — ротация логов:" + utils.ColorReset)
	utils.Code(`# Конфиг: /etc/logrotate.conf и /etc/logrotate.d/*
# Пример /etc/logrotate.d/nginx:
/var/log/nginx/*.log {
    daily              # каждый день
    missingok          # не ошибаться если файл отсутствует
    rotate 14          # хранить 14 архивов
    compress           # сжимать gzip
    delaycompress      # не сжимать текущий архив
    notifempty         # не ротировать пустые файлы
    create 0640 nginx adm  # создать новый файл с правами
    sharedscripts
    postrotate
        nginx -s reopen    # сообщить nginx открыть новый файл
    endscript
}

# Ручная ротация (тест):
sudo logrotate -d /etc/logrotate.d/nginx   # -d = dry run`)

	// ─── 37. Планировщики ─────────────────────────────────────────
	utils.Section("37. Планировщики задач: cron и at")

	utils.Println(utils.ColorBold + "cron — периодические задачи:" + utils.ColorReset)
	utils.Code(`# Редактировать crontab текущего пользователя:
crontab -e

# Посмотреть:
crontab -l

# Удалить все задачи:
crontab -r

# Для root:
sudo crontab -e

# Формат строки crontab:
# мин  час  день_месяца  месяц  день_недели  команда
# 0-59 0-23    1-31      1-12     0-7(0,7=воскресенье)

# Примеры:
* * * * *    /script.sh          # каждую минуту
0 * * * *    /script.sh          # каждый час в 0 минут
0 2 * * *    /backup.sh          # каждый день в 02:00
0 2 * * 0    /weekly.sh          # каждое воскресенье в 02:00
0 2 1 * *    /monthly.sh         # 1-го числа каждого месяца
*/5 * * * *  /check.sh           # каждые 5 минут
0 9-17 * * 1-5 /work.sh         # по будням с 9 до 17
0 2 * * * root /root/backup.sh  # в /etc/crontab с указанием пользователя

# Специальные строки:
@reboot     /script.sh           # при каждой загрузке
@daily      /script.sh           # раз в день (= 0 0 * * *)
@weekly     /script.sh           # раз в неделю
@monthly    /script.sh           # раз в месяц
@yearly     /script.sh           # раз в год`)

	utils.Println(utils.ColorBold + "Системные cron-директории:" + utils.ColorReset)
	utils.Code(`/etc/crontab          — системный crontab (с полем user)
/etc/cron.d/          — отдельные файлы crontab
/etc/cron.hourly/     — скрипты, запускаемые каждый час
/etc/cron.daily/      — каждый день
/etc/cron.weekly/     — каждую неделю
/etc/cron.monthly/    — каждый месяц

# Поместить скрипт в /etc/cron.daily/:
sudo cp backup.sh /etc/cron.daily/
sudo chmod +x /etc/cron.daily/backup.sh`)

	utils.Println(utils.ColorBold + "at — однократные задачи:" + utils.ColorReset)
	utils.Code(`# Выполнить команду однократно в указанное время:
at 14:30                         # в 14:30 сегодня
at 14:30 tomorrow                # завтра в 14:30
at 14:30 July 15                 # 15 июля
at now + 1 hour                  # через час
at now + 30 minutes              # через 30 минут

# Ввод команд (Ctrl+D для завершения):
at 02:00
> /usr/local/bin/backup.sh
> Ctrl+D

# Список задач:
atq
at -l

# Удалить задачу:
atrm 5          # удалить задачу №5

# Посмотреть содержимое задачи:
at -c 5`)

	utils.Footer()
}
