# LOGPile - Инструкции для Claude Code ## Что это за проект LOGPile - standalone Go-приложение для анализа BMC/IPMI диагностических архивов с веб-интерфейсом. Приложение запускает локальный HTTP-сервер, парсит архив, автоматически выбирает подходящий parser по vendor и показывает результат в UI + экспортирует данные. ## Актуальная архитектура - Язык: Go 1.22+ - HTTP: стандартный `net/http` + `http.ServeMux` - UI: embedded (`//go:embed`) HTML/CSS/Vanilla JS - Бинарник: один executable, без внешних зависимостей на runtime - Порт по умолчанию: `8082` (а не 8080) ## Реальная структура репозитория ``` logpile/ ├── cmd/logpile/main.go ├── internal/ │ ├── analyzer/ │ ├── exporter/ │ ├── models/ │ ├── parser/ │ │ └── vendors/ │ │ ├── generic/ │ │ ├── inspur/ │ │ ├── nvidia/ │ │ ├── nvidia_bug_report/ │ │ └── supermicro/ │ └── server/ ├── web/ │ ├── static/ │ └── templates/ ├── Makefile └── go.mod ``` ## CLI и запуск (актуально) ```bash # Сборка make build # Запуск (авто-открытие браузера включено) ./bin/logpile # Явный порт ./bin/logpile --port 8082 # Не открывать браузер автоматически ./bin/logpile --no-browser # Версия ./bin/logpile --version ``` Важно: сейчас **нет** subcommand `serve`, запуск идёт напрямую через флаги. ## Основной runtime-flow 1. `main.go` регистрирует embedded web FS и запускает сервер. 2. `POST /api/upload` принимает архив и передаёт его в `parser.BMCParser`. 3. `DetectFormat()` выбирает parser с максимальным confidence. 4. Результат сохраняется в памяти (`Server.result`) и отдаётся через API. 5. UI строит вкладки: конфигурация, прошивки, сенсоры, серийники, события. ## Поддерживаемые parser modules - `supermicro` - Supermicro parser - `inspur` - Inspur/Kaytus parser - `nvidia` - NVIDIA Field Diagnostics parser - `nvidia_bug_report` - parser для `nvidia-bug-report.sh` - `generic` - fallback parser Реестр parser-ов: `internal/parser/registry.go`, подключение модулей: `internal/parser/vendors/vendors.go`. ## API (фактически в коде) ``` POST /api/upload GET /api/status GET /api/parsers GET /api/events GET /api/sensors GET /api/config GET /api/serials GET /api/firmware GET /api/export/csv GET /api/export/json GET /api/export/txt DELETE /api/clear POST /api/shutdown ``` ## Форматы данных и экспорт - `AnalysisResult` агрегирует: events, sensors, FRU, hardware. - Экспорт реализован в `internal/exporter/exporter.go`: - CSV: серийные номера компонентов - JSON: полный `AnalysisResult` - TXT: человекочитаемый отчёт ## Важные текущие ограничения (чтобы не ошибаться в задачах) - Upload через `/api/upload` использует `ParseFromReader()`, где сейчас поддержаны `.tar`, `.tar.gz`, `.tgz`. - Код распаковки `.zip` есть, но в текущем upload-пути `zip` не обрабатывается. - Флаг `--file` присутствует в CLI-конфиге, но preload в `Server.Run()` сейчас не выполняется. - Данные хранятся только в памяти процесса; перезапуск очищает состояние. ## Практические рекомендации для доработок - Если меняется parser-логика, обновляй `Version()` соответствующего parser-модуля. - Новые vendor-парсеры регистрируй через import в `internal/parser/vendors/vendors.go`. - Для API/контрактов проверяй согласованность `handlers.go` и `web/static/js/app.js`. - Для UI-изменений не забывай, что ассеты embedded через `web/embed.go`. ## Приоритетные следующие шаги 1. Довести поддержку `zip` в upload path (`ParseFromReader`). 2. Реализовать preload из `--file`. 3. Добавить/актуализировать автотесты для parser и HTTP handlers. 4. Расширить vendor coverage (Dell/HPE/Lenovo) по реальным дампам.