DARP(1) General Commands Manual DARP(1) NAME darp - DMARC Aggregate Report Processor SYNOPSIS darp [-c] [-f input-file] [-m] [-n report-name] [-p print-file] [-r archive-root] [-t input-type] [-x] [input-file] DESCRIPTION darp processes DMARC aggregate reports in some way. Options which may be given are as follows: -c Says that the input xml document should be archived according to the cataloging method described here. -f input-file Gives the name of the input file. -m Says that the input file contains an email message, to which the xml report is attached. This is an idea which is unlikely to be implemented, so we won't mention it here. -n report-name Gives the name of the report, formatted in the way that the name of a report attached to an email message is formatted per the ag- gregate reporting RFC. The name is built of certain components separated by "!" characters. It is used in cataloging the report (e.g. for archiving). It doesn't matter where the name comes from. It could simply be invented from the report parameters, or taken verbatim from the attachment name in an email that contains the report. -p print-file Where to print a summary of the aggregate report. print-file may be specified as "-" to print to stdout. -r archive-root Specifies an alternative to the path where summary reports are catalogued and archived. The archive-root is prefix rather than a directory. If the archive-root is "/tmp" then a report file named "report" would be filed as /tmpreport and not /tmp/report. That is, for a directory name the archive-root should be given with a directory syntax (e.g. on *nix systems, terminated with a "/") if it's intended to be a directory. A file would not be catalogued as "report" -- the archive name is built from parameters about the report, taken from the report- name. -t input-type Says what type the input report is. Types are: zip,tar,... a file recognized by libarchive as containing file members. It's expected that the archive will contain exactly one file, with a filename (in the archive) that is formatted according to the method referred to along with "report-name." For this type of input, the report-name is taken from the filename in the archive, and should not be given with a separate "-n" option. gzip The input is a gzipped .xml file. If needed (e.g. for cataloging), a "report-name" should be given with "-n" option. -x Increment debugging level The input-file may be given via the -f flag or as an optional command line argument. If this is omitted, input is taken from stdin. The in- put-file may also be given as "-" (a single hyphen) to indicate stdin. OPERATION darp reads and parses the DMARC aggregate report (an xml file) given to it and does one or more of these things with it, depending on the invo- cation: report print a summary report to a file or to stdout. This is the default oper- ation if no other thing is requested. A report file may be specified with the "-p" option. If none has been specified and a report is being printed, it is printed to stdout. catalog store a copy of the xml report file into a proper place in a hierarchy of reports. This cataloging is requested by using the "-c" command line option. Reports are filed relative to an archive root prefix (also known as a catalog root). A default prefix is built into the darp pro- gram, but an alternate may be set with the "-r" command line option. Note again that since it's just a prefix, you need to indicate syntacti- cally (e.g. with trailing "/") that it's a directory if you intend it to be interpreted as a root directory. The report files are stored accord- ing to a hierarchy like: sender/receiver/yyyy which string is appended to the archive root, and where sender is the sending domain, receiver is the receiving domain, and yyyy is the year the report started. Each file itself is stored into this hierarchy with a name of the form start-end.xml where start and end are dates representing the range covered by the re- port. Both the start and the end dates in this filename use a yyyym- mdd.hhmmss form (year, month, day, hour, minute, second). darp can of course be used to print a report from a file in the catalog. You just have to tell it where that xml file is, using this classifica- tion scheme. store into database File the report into a SQL database. (Minor note: this is an unimple- mented idea for future enhancement.) FILING INCOMING DMARC AGGREGATE REPORTS The intent of the "-c" option, which says to catalog xml reports, is to process incoming mail messages containing such reports. Here's an exam- ple shell script that uses the mvmda mail delivery agent to deliver a report to darp for that purpose. #!/bin/bash if [ $# -ne 0 ]; then echo "extra stuff on command line" exit 1 fi /usr/local/bin/mvmda <(cat <<'EOF' sieve { require "fileinto"; } string reproot = "/some/place/DMARC/aggregate-reports/"; string repcmd = "|/usr/local/bin/darp -c -r " + reproot; unsigned char searchingF = 1; unsigned char doneF = 0; unsigned char attemptedF = 0; string name; string subtype; int w() { $msgpart_go_top(); while ( searchingF ) { if ( $msgpart_mime_type() == "application" ) { subtype = $msgpart_mime_subtype(); if ( subtype == "zip" ) { doneF = sieve { fileinto :part :body [repcmd + " -t zip"]; }; } else if ( subtype == "gzip" ) { name = $msgpart_mime_filename(); if ( ( name == "" ) || ( name !=? "*.xml.gz" ) ) continue; name = $str_match(1) + ".xml"; doneF = sieve { fileinto :part :body [repcmd + " -t gzip -n " + name]; }; } else { } attemptedF = 1; break; } // Iterative step to next in messagepart tree. // child first, sibling next, then parent* sibling. if ( ! $msgpart_go_child() ) { while ( searchingF && !$msgpart_go_next() ) searchingF = $msgpart_go_parent(); } } return doneF; }; w(); reproot = "DMARC/aggregate-reports/"; if ( attemptedF ) sieve { fileinto [ reproot + "handled" ]; } else { doneF = sieve { fileinto [ reproot + "unhandled" ]; }; if ( !doneF ) sieve { fileinto [ reproot + "failed" ]; } } EOF ) exit 0 SEE ALSO http://www.mvmf.org/ -- the mvmf web site. CREDITS TO M. Mallett (mem@mvmf.org) 2024-2025 BUGS You tell me.. DARP(1)