Repository Structure
Every integration follows this directory layout. Consistency across integrations means operators and contributors know exactly where to find each component.
Standard layout
wazuh-{vendor}/
├── wodle/
│ ├── {vendor}.py ← Entry point, CLI, orchestration
│ ├── {vendor}_{module_a}.py ← Domain module (API surface A)
│ ├── {vendor}_{module_b}.py ← Domain module (API surface B, if needed)
│ ├── {vendor}_utils.py ← Shared utilities (auth, HTTP, state, emit, log)
│ ├── run.sh ← Runtime config wrapper (ossec.conf target)
│ └── .secrets.example ← Credentials template
├── rules/
│ ├── {vendor}_rules.xml ← Custom Wazuh rules
│ └── {vendor}_decoder.xml ← JSON decoder registration
├── artifacts/
│ ├── configs/
│ │ └── ossec_{vendor}.conf ← ossec.conf wodle stanza example
│ ├── guides/
│ │ ├── configuration.md ← All env vars, CLI flags, credential chain
│ │ ├── rules-reference.md ← Rule catalog, field reference, severity mapping
│ │ └── troubleshooting.md ← Test commands, common errors, state reset
│ ├── objects/ ← (Optional) Dashboard exports (.ndjson)
│ └── images/ ← Dashboard screenshots for README
├── .gitignore
└── README.md
File naming conventions
| File | Naming pattern | Example |
|---|---|---|
| Entry point | {vendor}.py |
proofpoint.py |
| Domain module | {vendor}_{surface}.py |
proofpoint_siem.py |
| Utils | {vendor}_utils.py |
proofpoint_utils.py |
| Shell wrapper | run.sh |
run.sh (always) |
| Secrets template | .secrets.example |
.secrets.example (always) |
| Decoder | {vendor}_decoder.xml |
proofpoint_decoder.xml |
| Rules | {vendor}_rules.xml |
proofpoint_rules.xml |
| ossec.conf example | ossec_{vendor}.conf |
ossec_proofpoint.conf |
The vendor name in filenames should be lowercase, using underscores for multi-word names (e.g., cortex_xdr).
.gitignore
# Credentials — never commit
.secrets
*.secrets
tenants.json
# Runtime state — host-specific
state.json
*.state
# Python
__pycache__/
*.pyc
*.pyo
# OS
.DS_Store
Thumbs.db
# IDE
.vscode/
.idea/
*.swp
*.swo
What goes where
wodle/ — executable code only
Everything the Wazuh manager needs to execute the integration. No documentation, no configuration examples, no dashboards. If the file runs, it goes in wodle/.
rules/ — Wazuh decoder and rules only
The two XML files that configure Wazuh’s parsing and alerting pipeline. These are copied to /var/ossec/etc/decoders/ and /var/ossec/etc/rules/ during installation.
artifacts/ — everything else
Configuration examples, documentation guides, dashboard exports, screenshots. Organized into subdirectories by purpose. The artifacts/ directory is a reference library — nothing in it is required for the integration to function.
Root — repo-level files
README, .gitignore, LICENSE. These are standard open-source repo files. Use GitHub Releases for version history.