Adds internal/sanitize: rewrites the customer-identifying spans that internal/privacy detects (domain/FQDN/e-mail/AD/public-IP/timezone) with same-length neutral fillers, in place, without changing the file format. - Fillers keep byte length: "sigma.sbrf.ru" -> "xxxxx.xxxx.xx", IP -> "00.000.000.00", "Europe/Moscow" -> "Etc/Universal" (same-length valid neutral IANA zone), offset "180" -> "000". Timestamps are not recomputed. - Lossless recursive archive walk (tar/.sds/gz/tgz/zip): entry names, modes, and all embedded timestamps preserved; untouched zip entries copied raw; member payload length unchanged so tar headers stay byte-identical; only the .gz/.zip compression layer is rebuilt. 0 redactions -> byte-identical output. - privacy.FindSpans is the one matcher shared by detection and redaction; fillers are recognised by isRedactionFiller so a re-scan / second pass is a no-op. New privacy FPs fixed along the way: syslog selectors (local7.info), "MEVersion" firmware quads, *.conf_bak vendor templates, bundled viewer domains. - Binary members (FRU.bin, localtime, redis-dump.rdb, SOL captures) and unreadable nested archives are reported in Result.SkippedBinary, never edited. - Surfaces: POST /api/sanitize (+ GET /api/sanitize/download), the "Обезличить и скачать копию" button in the Customer-data panel, and logpile -sanitize <file> (restores mtime/atime). Verified: re-parsing a sanitized Dell TSR / xFusion / Inspur onekeylog / H3C .sds yields the identical hardware inventory; re-scan is clean. ADL-067, bible-local/docs/log-sanitization.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
5.9 KiB
07 — Exporters
Export surfaces
| Endpoint | Output | Purpose |
|---|---|---|
GET /api/export/csv |
CSV | Serial-number export |
GET /api/export/json |
raw-export ZIP bundle | Reopen and re-analyze later |
GET /api/export/reanimator |
JSON | Reanimator hardware payload |
GET /chart/current?print=true |
HTML (auto-print) | Print/PDF version of the report — opens in new tab, calls window.print() |
POST /api/convert |
async ZIP artifact | Batch archive-to-Reanimator conversion |
POST /api/sanitize + GET /api/sanitize/download |
same-format file | De-identified copy of the upload (docs/log-sanitization.md) |
Raw export
Raw export is not a final report dump. It is a replayable artifact that preserves enough source data for future parser improvements.
Current bundle contents:
raw_export.jsoncollect.logparser_fields.jsonprivacy_report.json(only when the customer-data scan produced findings; seedocs/privacy-scan.md)
Design rules:
- raw source is authoritative
- uploads of raw export must replay from raw source
- parsed snapshots inside the bundle are diagnostic only
Reanimator export
Implementation files:
internal/exporter/reanimator_models.gointernal/exporter/reanimator_converter.gointernal/server/handlers.gobible-local/docs/hardware-ingest-contract.md
Conversion rules:
- canonical source is merged canonical inventory derived from
hardware.devicesplus legacy hardware slices - output must conform to the strict Reanimator ingest contract in
docs/hardware-ingest-contract.md - local mirror currently tracks upstream contract
v2.7 - timestamps are RFC3339
- status is normalized to Reanimator-friendly values
- missing component serial numbers must stay absent; LOGPile must not synthesize fake serials for Reanimator export
- CPU
firmwarefield means CPU microcode, not generic processor firmware inventory NULL-style board manufacturer/product values are treated as absent- optional component telemetry/health fields are exported when LOGPile already has the data
- partial
hardware.devicesmust not suppress components still present only in legacy parser/collector fields presentis not serialized for exported components; presence is expressed by the existence of the component record itself- Reanimator ingest may apply its own server-side fallback serial rules for CPU and PCIe when LOGPile leaves serials absent
Inclusion rules
Included:
- PCIe-class devices when the component itself is present, even if serial number is missing
- contract
v2.7component telemetry and health fields when source data exists - hardware sensors grouped into
fans,power,temperatures,otheronly when the sensor has a real numeric reading - sensor
locationis not exported; LOGPile keeps only sensornameplus measured values and status - Redfish linked metric docs that carry component telemetry:
ProcessorMetrics,MemoryMetrics,DriveMetrics,EnvironmentMetrics,Metrics pcie_devices.slotis treated as the canonical PCIe address;bdfis used only as an internal fallback/dedupe key and is not serialized in the payloadevent_logsare exported only from normalized parser/collector events that can be mapped to contract sourceshost/bmc/redfishwithout synthesizing contentmanufactured_year_weekis exported only as a reliable passthrough when the parser/collector already extracted a validYYYY-Wwwvalue
Excluded:
- storage endpoints from
pcie_devices; disks and NVMe drives export only throughhardware.storage - fake serial numbers for PCIe-class devices; any fallback serial generation belongs to Reanimator ingest, not LOGPile
- sensors without a real numeric reading
- events with internal-only or unmappable sources such as LOGPile internal warnings
- memory with missing serial number
- memory with
present=falseorstatus=Empty - CPUs with
present=false - storage without
serial_number - storage with
present=false - power supplies without
serial_number - power supplies with
present=false - non-present network adapters
- non-present PCIe / GPU devices
- device-bound firmware duplicated at top-level firmware list
- any field not present in the strict ingest contract
Batch convert
POST /api/convert accepts multiple supported files and produces a ZIP with:
- one
*.reanimator.jsonfile per successful input convert-summary.txt
Behavior:
- unsupported filenames are skipped
- each file is parsed independently
- one bad file must not fail the whole batch if at least one conversion succeeds
- result artifact is temporary and deleted after download
CSV export
GET /api/export/csv uses the same merged canonical inventory as Reanimator export,
with legacy network-card fallback kept only for records that still have no canonical device match.
CPU identity audit CLI
go run ./cmd/logpile-cpu-audit -input <dump-or-directory> -output <directory> recursively parses
supported dump files and writes one *.cpu-audit.json report per input plus _summary.json.
Reports contain only parser provenance and CPU identity fields needed to audit the PPIN-to-serial
fallback. Parse failures are isolated per input and recorded in both the file report and summary.
Directory scans exclude standalone .txt and .log files by default so unpacked dump contents are
not treated as separate dumps. Use -include-plain when the input tree intentionally contains whole
single-file diagnostic logs. -workers controls bounded concurrent parsing and defaults to at most
four workers.
For direct Reanimator ingest, add -reanimator -prefix <dataset>. This mode writes a flat set of
*.reanimator.json files and skips inputs without CPUs or without the required board identity. Each
payload keeps the required top-level collected_at, filename, and hardware.board, while
hardware contains no component section except cpus. No audit/summary JSON is written into that
directory, so every JSON file there is an ingest payload.