|
|
|
|
@@ -8,7 +8,7 @@
|
|
|
|
|
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
|
|
|
|
|
|
<title>parsedmarc — parsedmarc 6.5.0 documentation</title>
|
|
|
|
|
<title>parsedmarc — parsedmarc 6.5.1 documentation</title>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -58,7 +58,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="version">
|
|
|
|
|
6.5.0
|
|
|
|
|
6.5.1
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -178,7 +178,7 @@
|
|
|
|
|
<span class="kn">from</span> <span class="nn">parsedmarc.utils</span> <span class="k">import</span> <span class="n">timestamp_to_human</span><span class="p">,</span> <span class="n">human_timestamp_to_datetime</span>
|
|
|
|
|
<span class="kn">from</span> <span class="nn">parsedmarc.utils</span> <span class="k">import</span> <span class="n">parse_email</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">__version__</span> <span class="o">=</span> <span class="s2">"6.5.0"</span>
|
|
|
|
|
<span class="n">__version__</span> <span class="o">=</span> <span class="s2">"6.5.1"</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span>
|
|
|
|
|
<span class="nb">format</span><span class="o">=</span><span class="s1">'</span><span class="si">%(levelname)8s</span><span class="s1">:</span><span class="si">%(filename)s</span><span class="s1">:</span><span class="si">%(lineno)d</span><span class="s1">:'</span>
|
|
|
|
|
@@ -548,38 +548,27 @@
|
|
|
|
|
<span class="n">parallel</span><span class="o">=</span><span class="n">parallel</span><span class="p">)</span></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="parsed_aggregate_reports_to_csv"><a class="viewcode-back" href="../index.html#parsedmarc.parsed_aggregate_reports_to_csv">[docs]</a><span class="k">def</span> <span class="nf">parsed_aggregate_reports_to_csv</span><span class="p">(</span><span class="n">reports</span><span class="p">):</span>
|
|
|
|
|
<div class="viewcode-block" id="parsed_aggregate_reports_to_csv_rows"><a class="viewcode-back" href="../index.html#parsedmarc.parsed_aggregate_reports_to_csv_rows">[docs]</a><span class="k">def</span> <span class="nf">parsed_aggregate_reports_to_csv_rows</span><span class="p">(</span><span class="n">reports</span><span class="p">):</span>
|
|
|
|
|
<span class="sd">"""</span>
|
|
|
|
|
<span class="sd"> Converts one or more parsed aggregate reports to flat CSV format, including</span>
|
|
|
|
|
<span class="sd"> headers</span>
|
|
|
|
|
<span class="sd"> Converts one or more parsed aggregate reports to list of dicts in flat CSV</span>
|
|
|
|
|
<span class="sd"> format</span>
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
|
<span class="sd"> reports: A parsed aggregate report or list of parsed aggregate reports</span>
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Returns:</span>
|
|
|
|
|
<span class="sd"> str: Parsed aggregate report data in flat CSV format, including headers</span>
|
|
|
|
|
<span class="sd"> list: Parsed aggregate report data as a list of dicts in flat CSV</span>
|
|
|
|
|
<span class="sd"> format</span>
|
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">to_str</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
|
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"xml_schema"</span><span class="p">,</span> <span class="s2">"org_name"</span><span class="p">,</span> <span class="s2">"org_email"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"org_extra_contact_info"</span><span class="p">,</span> <span class="s2">"report_id"</span><span class="p">,</span> <span class="s2">"begin_date"</span><span class="p">,</span> <span class="s2">"end_date"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"errors"</span><span class="p">,</span> <span class="s2">"domain"</span><span class="p">,</span> <span class="s2">"adkim"</span><span class="p">,</span> <span class="s2">"aspf"</span><span class="p">,</span> <span class="s2">"p"</span><span class="p">,</span> <span class="s2">"sp"</span><span class="p">,</span> <span class="s2">"pct"</span><span class="p">,</span> <span class="s2">"fo"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"source_ip_address"</span><span class="p">,</span> <span class="s2">"source_country"</span><span class="p">,</span> <span class="s2">"source_reverse_dns"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"source_base_domain"</span><span class="p">,</span> <span class="s2">"count"</span><span class="p">,</span> <span class="s2">"disposition"</span><span class="p">,</span> <span class="s2">"dkim_alignment"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"spf_alignment"</span><span class="p">,</span> <span class="s2">"policy_override_reasons"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"policy_override_comments"</span><span class="p">,</span> <span class="s2">"envelope_from"</span><span class="p">,</span> <span class="s2">"header_from"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"envelope_to"</span><span class="p">,</span> <span class="s2">"dkim_domains"</span><span class="p">,</span> <span class="s2">"dkim_selectors"</span><span class="p">,</span> <span class="s2">"dkim_results"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"spf_domains"</span><span class="p">,</span> <span class="s2">"spf_scopes"</span><span class="p">,</span> <span class="s2">"spf_results"</span><span class="p">]</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">csv_file_object</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">(</span><span class="n">newline</span><span class="o">=</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
|
<span class="n">writer</span> <span class="o">=</span> <span class="n">DictWriter</span><span class="p">(</span><span class="n">csv_file_object</span><span class="p">,</span> <span class="n">fields</span><span class="p">)</span>
|
|
|
|
|
<span class="n">writer</span><span class="o">.</span><span class="n">writeheader</span><span class="p">()</span>
|
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">reports</span><span class="p">)</span> <span class="o">==</span> <span class="n">OrderedDict</span><span class="p">:</span>
|
|
|
|
|
<span class="n">reports</span> <span class="o">=</span> <span class="p">[</span><span class="n">reports</span><span class="p">]</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">rows</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
|
|
|
|
|
|
<span class="k">for</span> <span class="n">report</span> <span class="ow">in</span> <span class="n">reports</span><span class="p">:</span>
|
|
|
|
|
<span class="n">xml_schema</span> <span class="o">=</span> <span class="n">report</span><span class="p">[</span><span class="s2">"xml_schema"</span><span class="p">]</span>
|
|
|
|
|
<span class="n">org_name</span> <span class="o">=</span> <span class="n">report</span><span class="p">[</span><span class="s2">"report_metadata"</span><span class="p">][</span><span class="s2">"org_name"</span><span class="p">]</span>
|
|
|
|
|
@@ -651,9 +640,42 @@
|
|
|
|
|
<span class="n">row</span><span class="p">[</span><span class="s2">"spf_domains"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">","</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">to_str</span><span class="p">,</span> <span class="n">spf_domains</span><span class="p">))</span>
|
|
|
|
|
<span class="n">row</span><span class="p">[</span><span class="s2">"spf_scopes"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">","</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">to_str</span><span class="p">,</span> <span class="n">spf_scopes</span><span class="p">))</span>
|
|
|
|
|
<span class="n">row</span><span class="p">[</span><span class="s2">"spf_results"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">","</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">to_str</span><span class="p">,</span> <span class="n">dkim_results</span><span class="p">))</span>
|
|
|
|
|
<span class="n">rows</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
|
|
|
|
<span class="n">csv_file_object</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
|
|
|
|
<span class="k">return</span> <span class="n">rows</span></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="parsed_aggregate_reports_to_csv"><a class="viewcode-back" href="../index.html#parsedmarc.parsed_aggregate_reports_to_csv">[docs]</a><span class="k">def</span> <span class="nf">parsed_aggregate_reports_to_csv</span><span class="p">(</span><span class="n">reports</span><span class="p">):</span>
|
|
|
|
|
<span class="sd">"""</span>
|
|
|
|
|
<span class="sd"> Converts one or more parsed aggregate reports to flat CSV format, including</span>
|
|
|
|
|
<span class="sd"> headers</span>
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
|
<span class="sd"> reports: A parsed aggregate report or list of parsed aggregate reports</span>
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Returns:</span>
|
|
|
|
|
<span class="sd"> str: Parsed aggregate report data in flat CSV format, including headers</span>
|
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"xml_schema"</span><span class="p">,</span> <span class="s2">"org_name"</span><span class="p">,</span> <span class="s2">"org_email"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"org_extra_contact_info"</span><span class="p">,</span> <span class="s2">"report_id"</span><span class="p">,</span> <span class="s2">"begin_date"</span><span class="p">,</span> <span class="s2">"end_date"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"errors"</span><span class="p">,</span> <span class="s2">"domain"</span><span class="p">,</span> <span class="s2">"adkim"</span><span class="p">,</span> <span class="s2">"aspf"</span><span class="p">,</span> <span class="s2">"p"</span><span class="p">,</span> <span class="s2">"sp"</span><span class="p">,</span> <span class="s2">"pct"</span><span class="p">,</span> <span class="s2">"fo"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"source_ip_address"</span><span class="p">,</span> <span class="s2">"source_country"</span><span class="p">,</span> <span class="s2">"source_reverse_dns"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"source_base_domain"</span><span class="p">,</span> <span class="s2">"count"</span><span class="p">,</span> <span class="s2">"disposition"</span><span class="p">,</span> <span class="s2">"dkim_alignment"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"spf_alignment"</span><span class="p">,</span> <span class="s2">"policy_override_reasons"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"policy_override_comments"</span><span class="p">,</span> <span class="s2">"envelope_from"</span><span class="p">,</span> <span class="s2">"header_from"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"envelope_to"</span><span class="p">,</span> <span class="s2">"dkim_domains"</span><span class="p">,</span> <span class="s2">"dkim_selectors"</span><span class="p">,</span> <span class="s2">"dkim_results"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"spf_domains"</span><span class="p">,</span> <span class="s2">"spf_scopes"</span><span class="p">,</span> <span class="s2">"spf_results"</span><span class="p">]</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">csv_file_object</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">(</span><span class="n">newline</span><span class="o">=</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
|
<span class="n">writer</span> <span class="o">=</span> <span class="n">DictWriter</span><span class="p">(</span><span class="n">csv_file_object</span><span class="p">,</span> <span class="n">fields</span><span class="p">)</span>
|
|
|
|
|
<span class="n">writer</span><span class="o">.</span><span class="n">writeheader</span><span class="p">()</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">rows</span> <span class="o">=</span> <span class="n">parsed_aggregate_reports_to_csv_rows</span><span class="p">(</span><span class="n">reports</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
<span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span><span class="p">:</span>
|
|
|
|
|
<span class="n">writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
|
|
|
|
<span class="n">csv_file_object</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
|
|
|
|
|
|
|
|
|
<span class="k">return</span> <span class="n">csv_file_object</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span></div>
|
|
|
|
|
|
|
|
|
|
@@ -777,30 +799,22 @@
|
|
|
|
|
<span class="s2">"Unexpected error: </span><span class="si">{0}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">.</span><span class="fm">__str__</span><span class="p">()))</span></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="parsed_forensic_reports_to_csv"><a class="viewcode-back" href="../index.html#parsedmarc.parsed_forensic_reports_to_csv">[docs]</a><span class="k">def</span> <span class="nf">parsed_forensic_reports_to_csv</span><span class="p">(</span><span class="n">reports</span><span class="p">):</span>
|
|
|
|
|
<div class="viewcode-block" id="parsed_forensic_reports_to_csv_rows"><a class="viewcode-back" href="../index.html#parsedmarc.parsed_forensic_reports_to_csv_rows">[docs]</a><span class="k">def</span> <span class="nf">parsed_forensic_reports_to_csv_rows</span><span class="p">(</span><span class="n">reports</span><span class="p">):</span>
|
|
|
|
|
<span class="sd">"""</span>
|
|
|
|
|
<span class="sd"> Converts one or more parsed forensic reports to flat CSV format, including</span>
|
|
|
|
|
<span class="sd"> headers</span>
|
|
|
|
|
<span class="sd"> Converts one or more parsed forensic reports to a list of dicts in flat CSV</span>
|
|
|
|
|
<span class="sd"> format</span>
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
|
<span class="sd"> reports: A parsed forensic report or list of parsed forensic reports</span>
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Returns:</span>
|
|
|
|
|
<span class="sd"> str: Parsed forensic report data in flat CSV format, including headers</span>
|
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
|
<span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"feedback_type"</span><span class="p">,</span> <span class="s2">"user_agent"</span><span class="p">,</span> <span class="s2">"version"</span><span class="p">,</span> <span class="s2">"original_envelope_id"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"original_mail_from"</span><span class="p">,</span> <span class="s2">"original_rcpt_to"</span><span class="p">,</span> <span class="s2">"arrival_date"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"arrival_date_utc"</span><span class="p">,</span> <span class="s2">"subject"</span><span class="p">,</span> <span class="s2">"message_id"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"authentication_results"</span><span class="p">,</span> <span class="s2">"dkim_domain"</span><span class="p">,</span> <span class="s2">"source_ip_address"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"source_country"</span><span class="p">,</span> <span class="s2">"source_reverse_dns"</span><span class="p">,</span> <span class="s2">"source_base_domain"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"delivery_result"</span><span class="p">,</span> <span class="s2">"auth_failure"</span><span class="p">,</span> <span class="s2">"reported_domain"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"authentication_mechanisms"</span><span class="p">,</span> <span class="s2">"sample_headers_only"</span><span class="p">]</span>
|
|
|
|
|
|
|
|
|
|
<span class="sd"> list: Parsed forensic report data as a list of dicts in flat CSV format</span>
|
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">reports</span><span class="p">)</span> <span class="o">==</span> <span class="n">OrderedDict</span><span class="p">:</span>
|
|
|
|
|
<span class="n">reports</span> <span class="o">=</span> <span class="p">[</span><span class="n">reports</span><span class="p">]</span>
|
|
|
|
|
<span class="n">csv_file</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">()</span>
|
|
|
|
|
<span class="n">csv_writer</span> <span class="o">=</span> <span class="n">DictWriter</span><span class="p">(</span><span class="n">csv_file</span><span class="p">,</span> <span class="n">fieldnames</span><span class="o">=</span><span class="n">fields</span><span class="p">)</span>
|
|
|
|
|
<span class="n">csv_writer</span><span class="o">.</span><span class="n">writeheader</span><span class="p">()</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">rows</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
|
|
|
|
|
|
<span class="k">for</span> <span class="n">report</span> <span class="ow">in</span> <span class="n">reports</span><span class="p">:</span>
|
|
|
|
|
<span class="n">row</span> <span class="o">=</span> <span class="n">report</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
|
<span class="n">row</span><span class="p">[</span><span class="s2">"source_ip_address"</span><span class="p">]</span> <span class="o">=</span> <span class="n">report</span><span class="p">[</span><span class="s2">"source"</span><span class="p">][</span><span class="s2">"ip_address"</span><span class="p">]</span>
|
|
|
|
|
@@ -815,6 +829,37 @@
|
|
|
|
|
<span class="n">authentication_mechanisms</span><span class="p">)</span>
|
|
|
|
|
<span class="k">del</span> <span class="n">row</span><span class="p">[</span><span class="s2">"sample"</span><span class="p">]</span>
|
|
|
|
|
<span class="k">del</span> <span class="n">row</span><span class="p">[</span><span class="s2">"parsed_sample"</span><span class="p">]</span>
|
|
|
|
|
<span class="n">rows</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
<span class="k">return</span> <span class="n">rows</span></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="parsed_forensic_reports_to_csv"><a class="viewcode-back" href="../index.html#parsedmarc.parsed_forensic_reports_to_csv">[docs]</a><span class="k">def</span> <span class="nf">parsed_forensic_reports_to_csv</span><span class="p">(</span><span class="n">reports</span><span class="p">):</span>
|
|
|
|
|
<span class="sd">"""</span>
|
|
|
|
|
<span class="sd"> Converts one or more parsed forensic reports to flat CSV format, including</span>
|
|
|
|
|
<span class="sd"> headers</span>
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
|
<span class="sd"> reports: A parsed forensic report or list of parsed forensic reports</span>
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Returns:</span>
|
|
|
|
|
<span class="sd"> str: Parsed forensic report data in flat CSV format, including headers</span>
|
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
|
<span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"feedback_type"</span><span class="p">,</span> <span class="s2">"user_agent"</span><span class="p">,</span> <span class="s2">"version"</span><span class="p">,</span> <span class="s2">"original_envelope_id"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"original_mail_from"</span><span class="p">,</span> <span class="s2">"original_rcpt_to"</span><span class="p">,</span> <span class="s2">"arrival_date"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"arrival_date_utc"</span><span class="p">,</span> <span class="s2">"subject"</span><span class="p">,</span> <span class="s2">"message_id"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"authentication_results"</span><span class="p">,</span> <span class="s2">"dkim_domain"</span><span class="p">,</span> <span class="s2">"source_ip_address"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"source_country"</span><span class="p">,</span> <span class="s2">"source_reverse_dns"</span><span class="p">,</span> <span class="s2">"source_base_domain"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"delivery_result"</span><span class="p">,</span> <span class="s2">"auth_failure"</span><span class="p">,</span> <span class="s2">"reported_domain"</span><span class="p">,</span>
|
|
|
|
|
<span class="s2">"authentication_mechanisms"</span><span class="p">,</span> <span class="s2">"sample_headers_only"</span><span class="p">]</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">csv_file</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">()</span>
|
|
|
|
|
<span class="n">csv_writer</span> <span class="o">=</span> <span class="n">DictWriter</span><span class="p">(</span><span class="n">csv_file</span><span class="p">,</span> <span class="n">fieldnames</span><span class="o">=</span><span class="n">fields</span><span class="p">)</span>
|
|
|
|
|
<span class="n">csv_writer</span><span class="o">.</span><span class="n">writeheader</span><span class="p">()</span>
|
|
|
|
|
|
|
|
|
|
<span class="n">rows</span> <span class="o">=</span> <span class="n">parsed_forensic_reports_to_csv_rows</span><span class="p">(</span><span class="n">reports</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
<span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span><span class="p">:</span>
|
|
|
|
|
<span class="n">csv_writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
<span class="k">return</span> <span class="n">csv_file</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span></div>
|
|
|
|
|
|