209 lines
6.3 KiB
Markdown
209 lines
6.3 KiB
Markdown
# LOGPile
|
||
|
||
LOGPile — standalone Go-приложение для анализа диагностических данных BMC.
|
||
|
||
Поддерживает два сценария:
|
||
1. Загрузка архивов/снапшотов и оффлайн-анализ в веб-интерфейсе.
|
||
2. Live-сбор через Redfish API с последующим экспортом и повторной загрузкой оффлайн.
|
||
|
||
## Что умеет
|
||
|
||
- Standalone бинарник с embedded UI (без внешних статических файлов).
|
||
- Парсинг vendor-архивов (Supermicro, Inspur/Kaytus, NVIDIA, fallback generic).
|
||
- Live-сбор по Redfish (`/api/collect`) с прогрессом и журналом шагов.
|
||
- Расширенный Redfish snapshot:
|
||
- нормализованные данные (CPU/RAM/Storage/GPU/PSU/NIC/PCIe/Firmware),
|
||
- сырой `redfish_tree` для будущего анализа.
|
||
- Загрузка JSON snapshot обратно через `/api/upload` для оффлайн-работы.
|
||
- Экспорт в CSV / JSON.
|
||
|
||
## Дополнительные источники данных (Inspur/Kaytus)
|
||
|
||
Для архивов Inspur/Kaytus парсер использует не только `asset.json` и `component.log`,
|
||
но и runtime-снимок `onekeylog/runningdata/redis-dump.rdb` (если файл присутствует).
|
||
|
||
Что это даёт:
|
||
- обогащение GPU: `serial_number`, `firmware` (VBIOS/FW), часть runtime telemetry;
|
||
- обогащение NIC: firmware/serial/part-number (когда в текстовых логах поля пустые).
|
||
|
||
## Внешний PCI IDs (без хардкода моделей)
|
||
|
||
Источник PCI IDs в проекте: официальный репозиторий
|
||
[`pciutils/pciids`](https://github.com/pciutils/pciids), подключён как git submodule:
|
||
`third_party/pciids`.
|
||
Локальная копия для встроенного lookup хранится в:
|
||
`internal/parser/vendors/pciids/pci.ids`.
|
||
|
||
Обновление локальной копии:
|
||
|
||
```bash
|
||
make update-pci-ids
|
||
```
|
||
|
||
Команда запускает `scripts/update-pci-ids.sh`, который скачивает актуальный
|
||
`pci.ids` из submodule (`git submodule update --init --remote third_party/pciids`)
|
||
и синхронизирует его в `internal/parser/vendors/pciids/pci.ids`.
|
||
|
||
Автообновление при сборке:
|
||
- `make build` и `make build-all` запускают `scripts/update-pci-ids.sh --best-effort`;
|
||
- если submodule уже инициализирован, `pci.ids` синхронизируется перед сборкой;
|
||
- если submodule не инициализирован/недоступен, используется текущая копия файла,
|
||
сборка не прерывается.
|
||
|
||
Отключить автообновление при сборке:
|
||
|
||
```bash
|
||
SKIP_PCI_IDS_UPDATE=1 make build
|
||
```
|
||
|
||
Если репозиторий клонирован без submodule:
|
||
|
||
```bash
|
||
git submodule update --init third_party/pciids
|
||
```
|
||
|
||
Парсер использует такой порядок lookup:
|
||
1. встроенный в бинарник `internal/parser/vendors/pciids/pci.ids`;
|
||
2. `./pci.ids`;
|
||
3. `/usr/share/hwdata/pci.ids`;
|
||
4. `/usr/share/misc/pci.ids`;
|
||
5. `/opt/homebrew/share/pciids/pci.ids`;
|
||
6. `LOGPILE_PCI_IDS_PATH` (можно передать несколько путей через `:`; имеет наивысший приоритет и переопределяет предыдущие значения).
|
||
|
||
Пример запуска:
|
||
|
||
```bash
|
||
LOGPILE_PCI_IDS_PATH=/path/to/pci.ids ./bin/logpile
|
||
```
|
||
|
||
## Требования
|
||
|
||
- Go 1.22+
|
||
|
||
## Сборка
|
||
|
||
```bash
|
||
make build
|
||
```
|
||
|
||
Бинарник будет в `bin/logpile`.
|
||
|
||
Для кросс-сборки:
|
||
|
||
```bash
|
||
make build-all
|
||
```
|
||
|
||
Артефакты:
|
||
- `bin/logpile-linux-amd64`
|
||
- `bin/logpile-linux-arm64`
|
||
- `bin/logpile-darwin-amd64`
|
||
- `bin/logpile-darwin-arm64`
|
||
- `bin/logpile-windows-amd64.exe`
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
./bin/logpile
|
||
./bin/logpile --port 8082
|
||
./bin/logpile --no-browser
|
||
./bin/logpile --version
|
||
```
|
||
|
||
Отладка падений (чтобы консоль не закрывалась):
|
||
|
||
```bash
|
||
./bin/logpile --hold-on-crash
|
||
```
|
||
|
||
> На Windows `--hold-on-crash` включён по умолчанию.
|
||
|
||
## Форматы загрузки
|
||
|
||
`POST /api/upload` принимает:
|
||
- архивы: `.tar`, `.tar.gz`, `.tgz`
|
||
- JSON snapshot (`AnalysisResult`)
|
||
|
||
## Live Redfish
|
||
|
||
Запуск live-сбора:
|
||
|
||
```http
|
||
POST /api/collect
|
||
```
|
||
|
||
Пример body:
|
||
|
||
```json
|
||
{
|
||
"host": "bmc01.example.local",
|
||
"protocol": "redfish",
|
||
"port": 443,
|
||
"username": "admin",
|
||
"auth_type": "password",
|
||
"password": "secret",
|
||
"tls_mode": "insecure"
|
||
}
|
||
```
|
||
|
||
Жизненный цикл задачи:
|
||
`queued -> running -> success|failed|canceled`
|
||
|
||
Статус и прогресс:
|
||
- `GET /api/collect/{id}`
|
||
- `POST /api/collect/{id}/cancel`
|
||
|
||
## Экспорт
|
||
|
||
- `GET /api/export/csv` — серийные номера
|
||
- `GET /api/export/json` — полный `AnalysisResult` (включая `raw_payloads`)
|
||
|
||
Имена экспортируемых файлов:
|
||
|
||
`YYYY-MM-DD (SERVER MODEL) - SERVER SN.<ext>`
|
||
|
||
Пример:
|
||
`2026-02-04 (SYS-421GE-TNHR2) - C8X123456789.json`
|
||
|
||
## API
|
||
|
||
```text
|
||
POST /api/upload
|
||
POST /api/collect
|
||
GET /api/collect/{id}
|
||
POST /api/collect/{id}/cancel
|
||
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
|
||
DELETE /api/clear
|
||
POST /api/shutdown
|
||
```
|
||
|
||
`/api/status` и `/api/config` содержат метаданные источника:
|
||
- `source_type`: `archive` | `api`
|
||
- `protocol`: `redfish` | `ipmi` (для архивов может быть пустым)
|
||
- `target_host`
|
||
- `collected_at`
|
||
|
||
## Структура
|
||
|
||
```text
|
||
cmd/logpile/main.go # entrypoint
|
||
internal/collector/ # live collectors (redfish, ipmi mock)
|
||
internal/parser/ # archive parsers
|
||
internal/server/ # HTTP handlers
|
||
internal/exporter/ # CSV/JSON export
|
||
internal/models/ # data contracts
|
||
web/ # embedded templates/static
|
||
```
|
||
|
||
## Лицензия
|
||
|
||
MIT — см. `LICENSE`.
|