## Прожарка: **mlogtail**
**Оценка: 4/10**

### Критично
- [✓ ФАКТ: Код-Рентген] **main.go:123** – `uint32`‑приведение к `int` без проверки знака (semgrep). При больших значениях может получиться отрицательное число и сбой подсчётов.
- [⚠ МНЕНИЕ] **main.go:71** – `fmt.Printf("Cannot open %s: %s\n", cfg.listen, err)` – выводит `cfg.listen`, которое всегда пусто; реальный адрес хранится в `cfg.lnAddress`. Пользователь получит вводящий в заблуждение лог.
- [⚠ МНЕНИЕ] **main.go:84‑90** – парсинг `socketMode` через `fmt.Sprintf("0%d", cfg.socketMode)` формирует строку вида `0123`, а `ParseInt` интерпретирует её как десятичную, а не как восьмеричную. В результате права сокета могут быть заданы неверно.
- [⚠ МНЕНИЕ] **main.go:27‑33** – импортированы `runtime`, `regexp`, `syscall`, но нигде не используются → лишний код, мешает статическому анализу и увеличивает размер бинарника.
- [⚠ МНЕНИЕ] **main.go:44‑58** – блок с `pprof` полностью закомментирован, но оставлен в репозитории. Если включить, то в продакшн‑бинарник попадёт отладочный код без защиты.

### Надо переделать
- [⚠ МНЕНИЕ] Удалить неиспользуемые импорты и закомментированный `pprof`‑блок; добавить `go.mod` и `go.sum` для управления зависимостями.
- [⚠ МНЕНИЕ] Переписать вывод ошибок в `createListener` так, чтобы использовалась `cfg.lnAddress`. Сейчас сообщение «Cannot open : …» не помогает.
- [⚠ МНЕНИЕ] Заменить парсинг прав сокета на `mode, _ := strconv.ParseUint(fmt.Sprintf("%03o", cfg.socketMode), 8, 32)` либо принять режим уже в восьмеричном виде.
- [⚠ МНЕНИЕ] Добавить обработку сигналов (`os/signal.Notify`) и корректное закрытие listener через `defer closeListener(ln, cfg)`.
- [⚠ МНЕНИЕ] Переместить парсинг флагов в отдельный файл (`flags.go`) и вынести бизнес‑логику из `main.go` в пакет (`parser`), чтобы тестировать её отдельно.

### Мелочи
- [⚠ МНЕНИЕ] Имена полей `Config` (например, `lnNetworkType`) используют «ln», а не «listener», что снижает читаемость.
- [⚠ МНЕНИЕ] В строке `fmt.Printf("Canot open logfile: %s\n", err)` опечатка «Canot».
- [⚠ МНЕНИЕ] В `README` и `README_ru` дублируется информация, а `LICENSE` содержит текст FSF, не совпадающий с автором – подозрение на копипаст.
- [⚠ МНЕНИЕ] Нет `go.mod`, `gitignore` и CI‑конфигураций – проект трудно собрать в чистой среде.
- [⚠ МНЕНИЕ] Отсутствует тестовый пакет, хотя файл `postfix_test.go` пустой.

### Что хорошо
- [⚠ МНЕНИЕ] Приложение действительно умеет «tail‑ить» postfix‑лог и выдавать статистику через UNIX‑socket – полезно для мониторинга.
- [⚠ МНЕНИЕ] Используется проверенный пакет `github.com/hpcloud/tail`, что упрощает работу с «живыми» файлами.
- [⚠ МНЕНИЕ] В репозитории есть `mlogtail.service` – готовый systemd‑юнит, позволяющий запускать демона как сервис.
- [⚠ МНЕНИЕ] Версия хранится в отдельном файле `version.go`, что упрощает bump‑версий.
- [⚠ МНЕНИЕ] Присутствует конфигурация Zabbix‑шаблонов, что сразу делает интеграцию в систему мониторинга.
- [⚠ МНЕНИЕ] Код компилируется в один статический бинарник (`bin/mlogtail-linux_amd64`), удобно развёртывать.

### Вердикт
**Рабочий, но копипаст‑потрошенный проект: без тестов, с «мусором» в коде и минимумом оригинальности.**

---

*Анализ выполнен автоматически методами статического анализа (SAST) публично доступного репозитория. Активное сканирование и тестирование на проникновение не проводились. Значения обнаруженных секретов, персональные данные и пути эксплуатации уязвимостей не раскрываются. Цитирование кода — в соответствии со ст. 1274 ГК РФ. Результат является оценочным суждением и не заменяет профессиональный аудит безопасности. Пункты помечены: ✓ факт (линтер), ⚠ мнение (AI), ✗ неверно (опровергнуто).*
