Product Requirements Document: cee-exporter¶
Version: 2.0.0 Date: 2026-03-03 Status: v1.0 Implemented — v2.0 In Progress
Problem Statement¶
Dell PowerStore file-system audit events use the CEPA/CEE protocol, which was designed for Windows CEE agents. Organizations running Linux-based SIEMs (Graylog, Elasticsearch, Splunk) or unable to deploy Windows infrastructure have no native way to consume these events.
cee-exporter bridges this gap: it receives CEPA events over HTTP, maps them to Windows
Event Log semantics, and forwards them to any GELF-capable SIEM, Logstash via Beats,
syslog receivers, native Windows Event Log, or standalone .evtx files on Linux.
Goals¶
- Any SIEM can ingest Dell PowerStore file-system audit events without a Windows host
- Zero runtime dependencies — a single statically-linked Go binary runs on Linux or Windows
- CEPA protocol-compliant listener handles the RegisterRequest handshake and heartbeat timing requirements (3-second response window)
- Operator can configure and run the daemon using only the README (no source code required)
- Native platform service integration (systemd on Linux, SCM on Windows)
- Observable via Prometheus
/metricsendpoint
Protocol Constraint (critical)¶
The Dell PowerStore CEPA client sends events over plain HTTP only. The CEPA endpoint URL must always use
http://. TLS on the cee-exporter listener port 12228 does not encrypt the PowerStore-to-exporter path — it is only useful when a reverse proxy sits in front. See ADR-011.
Non-Goals (v1.0 — now delivered)¶
- ~~Binary .evtx file generation on Linux~~ (implemented in v2 — see ADR-009)
- ~~Prometheus /metrics endpoint~~ (implemented in v2)
- ~~Windows Service installer / systemd unit file~~ (implemented in v2)
Non-Goals (v2.0)¶
- High-availability load-balancer configuration (operational concern)
- CAVA antivirus event processing (out of scope)
- RPC/MSRPC transport (Windows-only, significant complexity)
- BinaryEvtxWriter cross-event template sharing (OUT-F01 — future minor release)
- EVTX rolling/chunked streaming mid-chunk (flush-on-close is the v2 approach)
- DNS-01 ACME challenge via go-acme/lego (deferred; self-signed covers air-gapped)
User Personas¶
Linux sysadmin (primary)
- Runs Graylog on Linux; needs PowerStore NAS file-system audit events without Windows
- Configures cee-exporter with
type = "gelf"and directs it at their Graylog GELF input - Uses systemd unit for lifecycle management; scrapes
/metricswith Prometheus
SOC analyst / SIEM engineer
- Needs PowerStore events in Logstash/Elastic SIEM via Beats protocol
- Configures
type = "beats"for Lumberjack v2 transport with TLS - Alternatively uses
type = "syslog"for RFC 5424 forwarding to rsyslog or syslog-ng
Windows sysadmin (secondary)
- Uses native Windows Event Viewer or Winlogbeat
- Installs cee-exporter.exe as a Windows service:
cee-exporter.exe install - Win32 EventLog writer activates automatically on Windows
- Linux-generated
.evtxfiles can be opened in Event Viewer (via BinaryEvtxWriter)
Functional Requirements¶
Full requirement list: see REQUIREMENTS.md
v1.0 (delivered)¶
- CEPA protocol: CEPA-01 through CEPA-05
- Semantic mapping: MAP-01 through MAP-06
- GELF output: GELF-01 through GELF-04
- Win32 output: WIN-01, WIN-02
- Multi-backend: MULTI-01
- TLS: TLS-01, TLS-02 (manual cert)
- Observability: OBS-01 through OBS-03 (health endpoint, structured logs)
- Quality: QUAL-01 through QUAL-06
- Build: BUILD-01, BUILD-02
- Documentation: DOC-01 through DOC-04
v2.0 (in progress)¶
| ID | Requirement | Phase | ADR |
|---|---|---|---|
| OBS-04 | Prometheus /metrics endpoint on port 9228 |
04 | ADR-006 |
| DEPLOY-01 | systemd unit file (Linux) | 04 | — |
| DEPLOY-02 | /health and /metrics survive service restart |
04 | — |
| DEPLOY-03 | cee-exporter.exe install registers with Windows SCM |
05 | ADR-010 |
| DEPLOY-04 | cee-exporter.exe uninstall removes SCM registration |
05 | ADR-010 |
| DEPLOY-05 | Windows Service auto-restarts after crash | 05 | ADR-010 |
| OUT-01 | BeatsWriter: Lumberjack v2 to Logstash / Graylog | 06 | — |
| OUT-02 | BeatsWriter supports TLS | 06 | — |
| OUT-03 | SyslogWriter: RFC 5424 over UDP | 06 | ADR-008 |
| OUT-04 | SyslogWriter: RFC 5424 over TCP (octet-counting) | 06 | ADR-008 |
| OUT-05 | BinaryEvtxWriter: native .evtx on Linux |
07 | ADR-009 |
| OUT-06 | Generated .evtx opens in Windows Event Viewer |
07 | ADR-009 |
| TLS-03 | tls_mode="acme" auto-provisions via Let's Encrypt |
08 | ADR-011 |
| TLS-04 | tls_mode="self-signed" for air-gapped deployments |
08 | ADR-011 |
Non-Functional Requirements¶
- Latency: HTTP handler must ACK within 3 seconds (CEPA heartbeat constraint)
- Throughput: Queue capacity 100,000 events default; handles VCAPS batches of thousands per PUT
- Portability: Single binary; CGO_ENABLED=0; compiles for linux/amd64 and windows/amd64
- Reliability: TCP GELF/Beats reconnects automatically; failed backend does not block others (MultiWriter)
- Observability: Health endpoint, Prometheus metrics, and structured logs on every received batch
- Security: All new writer transport supports TLS; CEPA listener TLS documented with protocol caveat
Architecture Summary¶
CEPA HTTP PUT → pkg/server → pkg/parser → pkg/mapper → pkg/queue → pkg/evtx (writers)
↓
pkg/metrics → /metrics (Prometheus)
- server: HTTP handler; ACKs immediately; enqueues events
- parser: CEE XML → []CEPAEvent
- mapper: CEPAEvent → WindowsEvent (CEPA type → Windows EventID + access mask)
- queue: Async worker pool; drops events on overflow with WARN log
- evtx writers:
GELFWriter— GELF 1.1 UDP/TCP (all platforms)Win32EventLogWriter— Win32 ReportEvent (Windows only)SyslogWriter— RFC 5424 UDP/TCP (all platforms) [v2]BeatsWriter— Lumberjack v2 TCP/TLS (all platforms) [v2]BinaryEvtxWriter— native .evtx files (non-Windows) [v2]MultiWriter— fan-out to multiple backends- platform service: systemd unit (Linux) / Windows SCM via kardianos/service [v2]
For architectural decisions, see docs/adr/.
v2.0 Dependency Changes¶
| Package | Version | Purpose | Notes |
|---|---|---|---|
github.com/kardianos/service |
v1.2.4 | Windows SCM integration | Supersedes x/sys direct (ADR-010) |
github.com/crewjam/rfc5424 |
v0.1.0 | SyslogWriter RFC 5424 messages | CGO-free (ADR-008) |
github.com/elastic/go-lumber |
v0.1.1 | BeatsWriter Lumberjack v2 | CGO-free |
github.com/prometheus/client_golang |
v1.23.2 | Prometheus /metrics | CGO-free (ADR-006) |
golang.org/x/crypto (promoted) |
v0.48.0 | ACME autocert (TLS-ALPN-01) | Was indirect dep (ADR-011) |
No new dependencies for: BinaryEvtxWriter (stdlib only), systemd unit (text artifact).
Success Metrics¶
go test ./...passes with zero failures on Linux and Windowsmake buildandmake build-windowsproduce runnable binaries- An operator can follow the README quickstart and see events in Graylog within 15 minutes
cee-exporter.exe installregisters a service that survives reboot and restarts on failure.evtxfiles generated on Linux open correctly in Windows Event Viewercurl :9228/metricsreturns Prometheus-formatted counters