2 Commits
v1.22 ... v1.23

Author SHA1 Message Date
Mikhail Chusavitin
e2c81758b5 fix(parser): raise file size limit for .ahs to 1 GB
AHS files can exceed 100 MB; the previous 10 MB universal cap silently
truncated them and caused incomplete event parsing. Per-extension limits
are now used: .ahs gets 1 GB, all other single-file types keep 10 MB.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 15:20:57 +03:00
Mikhail Chusavitin
6b52a1876f docs: release notes for v1.22
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 15:13:42 +03:00
2 changed files with 73 additions and 11 deletions

View File

@@ -15,9 +15,11 @@ import (
)
const maxSingleFileSize = 10 * 1024 * 1024
const maxSingleFileSizeLarge = 1024 * 1024 * 1024
const maxZipArchiveSize = 50 * 1024 * 1024
const maxGzipDecompressedSize = 50 * 1024 * 1024
var supportedArchiveExt = map[string]struct{}{
".ahs": {},
".gz": {},
@@ -47,7 +49,7 @@ func ExtractArchive(archivePath string) ([]ExtractedFile, error) {
switch ext {
case ".ahs":
return extractSingleFile(archivePath)
return extractSingleFileWithLimit(archivePath, maxSingleFileSizeLarge)
case ".gz", ".tgz":
return extractTarGz(archivePath)
case ".tar", ".sds":
@@ -55,7 +57,7 @@ func ExtractArchive(archivePath string) ([]ExtractedFile, error) {
case ".zip":
return extractZip(archivePath)
case ".txt", ".log":
return extractSingleFile(archivePath)
return extractSingleFileWithLimit(archivePath, maxSingleFileSize)
default:
return nil, fmt.Errorf("unsupported archive format: %s", ext)
}
@@ -70,7 +72,7 @@ func ExtractArchiveFromReader(r io.Reader, filename string) ([]ExtractedFile, er
switch ext {
case ".ahs":
return extractSingleFileFromReader(r, filename)
return extractSingleFileFromReaderWithLimit(r, filename, maxSingleFileSizeLarge)
case ".gz", ".tgz":
return extractTarGzFromReader(r, filename)
case ".tar", ".sds":
@@ -78,7 +80,7 @@ func ExtractArchiveFromReader(r io.Reader, filename string) ([]ExtractedFile, er
case ".zip":
return extractZipFromReader(r)
case ".txt", ".log":
return extractSingleFileFromReader(r, filename)
return extractSingleFileFromReaderWithLimit(r, filename, maxSingleFileSize)
default:
return nil, fmt.Errorf("unsupported archive format: %s", ext)
}
@@ -337,7 +339,7 @@ func extractZipFromReader(r io.Reader) ([]ExtractedFile, error) {
return files, nil
}
func extractSingleFile(path string) ([]ExtractedFile, error) {
func extractSingleFileWithLimit(path string, limit int64) ([]ExtractedFile, error) {
info, err := os.Stat(path)
if err != nil {
return nil, fmt.Errorf("stat file: %w", err)
@@ -348,7 +350,7 @@ func extractSingleFile(path string) ([]ExtractedFile, error) {
}
defer f.Close()
files, err := extractSingleFileFromReader(f, filepath.Base(path))
files, err := extractSingleFileFromReaderWithLimit(f, filepath.Base(path), limit)
if err != nil {
return nil, err
}
@@ -358,14 +360,14 @@ func extractSingleFile(path string) ([]ExtractedFile, error) {
return files, nil
}
func extractSingleFileFromReader(r io.Reader, filename string) ([]ExtractedFile, error) {
content, err := io.ReadAll(io.LimitReader(r, maxSingleFileSize+1))
func extractSingleFileFromReaderWithLimit(r io.Reader, filename string, limit int64) ([]ExtractedFile, error) {
content, err := io.ReadAll(io.LimitReader(r, limit+1))
if err != nil {
return nil, fmt.Errorf("read file content: %w", err)
}
truncated := len(content) > maxSingleFileSize
truncated := int64(len(content)) > limit
if truncated {
content = content[:maxSingleFileSize]
content = content[:limit]
}
file := ExtractedFile{
@@ -376,7 +378,7 @@ func extractSingleFileFromReader(r io.Reader, filename string) ([]ExtractedFile,
file.Truncated = true
file.TruncatedMessage = fmt.Sprintf(
"file exceeded %d bytes and was truncated",
maxSingleFileSize,
limit,
)
}

View File

@@ -0,0 +1,60 @@
# logpile v1.22
Дата релиза: 2026-06-19
Тег: `v1.22`
## Что нового
### HPE iLO AHS — новый парсер
Добавлена поддержка файлов `*.ahs` (Active Health System), экспортируемых
из веб-интерфейса iLO. Парсер извлекает:
- **Инвентарь оборудования**: плата, процессоры, память, диски, сетевые
адаптеры, блоки питания, backplane, RAID-контроллеры.
- **Прошивки**: iLO, System ROM, SPS, TPM, SPLD, контроллеры, NIC, backplane —
из основного бинарного контейнера и XML-сертификата `bcert.pkg`.
- **События**: разбор `.zbb`-файлов с журналом iLO; определение типа и
серьёзности по тексту сообщения; очистка однобайтовых frame-сепараторов
из концов строк.
- **Устойчивость к битым файлам**: если последняя запись в AHS-контейнере
обрезана (объявленный размер выходит за границу файла), парсер обрабатывает
данные частично вместо возврата ошибки.
- Добавлено распознавание модельного ряда **Alletra Storage Server** (ранее
`ProductName` оставался пустым).
### Экспорт логов в CSV («Logs Export»)
Новая кнопка «**Logs Export**» в шапке интерфейса выгружает все
распознанные события (без какой-либо фильтрации) в CSV-файл:
- Разделитель — точка с запятой (`;`), кодировка — UTF-8 с BOM.
- Файл открывается в Excel без дополнительных настроек импорта.
- Колонки: `timestamp`, `source`, `severity`, `sensor_type`, `sensor_name`,
`event_type`, `id`, `description`, `raw_data`.
Кнопка «PDF» удалена.
### Исправления в Reanimator-экспорте
- `event_logs` в JSON-экспорте Reanimator больше не оказывается пустым для
HPE iLO AHS: источник `"HPE iLO"` теперь корректно нормализуется в `"bmc"`.
### Исправления chart viewer
- JavaScript `view.js` не загружался в LOGPile из-за отсутствия перезаписи
пути `/static/view.js``/chart/static/view.js`. Исправлено; фильтры
по колонкам в таблицах теперь работают.
- Субмодуль chart обновлён до **v2.7**: фильтры вынесены в отдельную строку
под заголовком, исправлена минимальная ширина колонок.
### Обновления зависимостей
- **pci.ids** (база PCI-устройств) обновлена. Коллектор скорректирован под
переименование `0x8086:0x28c0`: `"Volume Management Device NVMe RAID
Controller"``"Volume Management Device (VMD)"`.
## Запуск на macOS
Снимите карантинный атрибут через терминал: `xattr -d com.apple.quarantine /path/to/logpile-darwin-arm64`
После этого бинарник запустится без предупреждения Gatekeeper.