Sean Whalen 265bf64240 Align Grafana dashboard with OpenSearch Dashboards source-of-truth (#738)
* Align Grafana dashboard with OpenSearch Dashboards source-of-truth

Adds the two aggregate-DMARC panels that exist on the OSD dashboard but
were missing from the bundled Grafana dashboard:

- "Message sources by name and type" — buckets by source_name + source_type,
  sums message_count per (name, type) tuple. Mirrors the OSD viz from 9.4.x.
- "Message sources by Autonomous System" — buckets by source_asn +
  source_as_name + source_as_domain, sums message_count per ASN. Mirrors
  the OSD viz added in 9.9.0 with the IPinfo Lite ASN integration.

Both panels are patterned on the existing "Reporting Organisations" panel
(same datasource $datasourceag, same sum(message_count) metric, same
gradient-gauge "Messages" column with rename transforms). They sit at
the bottom of the existing layout (gridPos y=129 and y=140) so the
existing panel positions are unchanged.

Verified against the bundled grafana/grafana:12.3.0: dashboard import
returns status=success, both panels render with real data from the
sample-corpus indexes, and the ES aggregations (terms on source_name
+ source_type, numeric terms on source_asn) return the expected results.

Out of scope:
- Extras in the Grafana dashboard that aren't on OSD (SPF/DKIM Results
  Over Time, Alignment Over Time, Stat overview, Published Policies,
  Forensic IP / country tables) are left in place. They were
  community-contributed and likely valued by some users.
- Migrating the deprecated `graph` and `grafana-worldmap-panel` panel
  types to modern timeseries / geomap is a separate, larger task.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Grafana: migrate deprecated graph and worldmap panels

Replaces the 6 legacy `graph` panels with `timeseries` panels and the
2 legacy `grafana-worldmap-panel` panels with `geomap` panels. Both
deprecated plugins still rendered in Grafana 12 via auto-migration but
were flagged for removal; this ships the modern saved shape.

graph -> timeseries (6 panels):
  SPF Results Over Time, DKIM Results Over Time, SPF Alignment Over Time,
  DKIM Alignment Over Time, DMARC Passage Over Time, Message Disposition
  Over Time. Panel `aliasColors` (e.g. {true: dark-green, false: dark-red})
  are translated into per-series `fieldConfig.overrides` so the green/red
  by-pass-fail colorings carry forward; legacy graph fields (lines, fill,
  yaxes, tooltip etc.) are dropped in favor of the new
  `fieldConfig.defaults.custom` block and `options.legend` / `options.tooltip`.

worldmap -> geomap (2 panels):
  Map of Message Source Countries (aggregate), Forensic Sample Sources
  by Country (forensic). The legacy `locationData=countries` lookup-by-ISO
  becomes a geomap markers layer with `location.mode=lookup`,
  `gazetteer=public/gazetteer/countries.json`, and `lookup=source_country.keyword`
  — same input data, modern renderer. Drops the date_histogram bucket
  from the geomap targets since the map is a snapshot over the panel
  time range, not a time series.

Verified against the bundled grafana/grafana:12.3.0: dashboard imports
with status=success and `version=19`, live panel types now report
`{timeseries: 6, geomap: 2, table: 14, grafana-piechart-panel: 3,
stat: 1, row: 3}` — no more `graph` or `grafana-worldmap-panel` entries.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Sean Whalen <seanthegeek@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 01:32:29 -04:00
2026-04-19 21:20:41 -04:00
2025-12-12 15:56:52 -05:00
2026-03-09 18:16:47 -04:00
2026-03-23 17:08:26 -04:00
2018-02-05 20:23:07 -05:00
2022-10-04 18:45:57 -04:00
2026-03-09 18:24:16 -04:00

parsedmarc

Build
Status Code
Coverage PyPI
Package PyPI - Downloads

A screenshot of DMARC summary charts in Kibana

parsedmarc is a Python module and CLI utility for parsing DMARC reports. When used with Elasticsearch and Kibana (or Splunk), it works as a self-hosted open-source alternative to commercial DMARC report processing services such as Agari Brand Protection, Dmarcian, OnDMARC, ProofPoint Email Fraud Defense, and Valimail.

Note

Domain-based Message Authentication, Reporting, and Conformance (DMARC) is an email authentication protocol.

Sponsors

This is a project is maintained by one developer. Please consider sponsoring my work if you or your organization benefit from it.

Features

  • Parses draft and 1.0 standard aggregate/rua DMARC reports
  • Parses forensic/failure/ruf DMARC reports
  • Parses reports from SMTP TLS Reporting
  • Can parse reports from an inbox over IMAP, Microsoft Graph, or Gmail API
  • Transparently handles gzip or zip compressed reports
  • Consistent data structures
  • Simple JSON and/or CSV output
  • Optionally email the results
  • Optionally send the results to Elasticsearch, Opensearch, and/or Splunk, for use with premade dashboards
  • Optionally send reports to Apache Kafka

Python Compatibility

This project supports the following Python versions, which are either actively maintained or are the default versions for RHEL or Debian.

Version Supported Reason
< 3.6 End of Life (EOL)
3.6 Used in RHEL 8, but not supported by project dependencies
3.7 End of Life (EOL)
3.8 End of Life (EOL)
3.9 Used in Debian 11 and RHEL 9, but not supported by project dependencies
3.10 Actively maintained
3.11 Actively maintained; supported until June 2028 (Debian 12)
3.12 Actively maintained; supported until May 2035 (RHEL 10)
3.13 Actively maintained; supported until June 2030 (Debian 13)
3.14 Supported (requires imapclient>=3.1.0)
S
Description
No description provided
Readme Apache-2.0 160 MiB
Languages
Python 98.2%
Shell 1.7%