11 "import configparser\n",
12 "import xml.etree.ElementTree\n",
33 "output_type": "execute_result"
37 "config = configparser.ConfigParser()\n",
38 "config.read('dmarc.ini')"
51 "['imap', 'database']"
56 "output_type": "execute_result"
73 "['server', 'username', 'port', 'password']"
78 "output_type": "execute_result"
82 "[k for k in config['imap']]"
95 "['server', 'database', 'username', 'password']"
100 "output_type": "execute_result"
104 "[k for k in config['database']]"
109 "execution_count": 25,
115 "def walk(node, indent=0):\n",
116 " for child in node:\n",
118 " txt = child.text.strip()\n",
121 " print(' '*indent, child.tag, ':', txt)\n",
122 " walk(child, indent+2)"
127 "execution_count": 16,
134 "output_type": "stream",
136 "google.com!njae.me.uk!1458777600!1458863999.xml hotmail.com!njae.me.uk!1459011600!1459098000.xml yahoo.com!njae.me.uk!1459036800!1459123199.xml\r\n",
137 "google.com!njae.me.uk!1458950400!1459036799.xml yahoo.com!njae.me.uk!1458864000!1458950399.xml\r\n"
147 "execution_count": 17,
155 "['google.com!njae.me.uk!1458777600!1458863999.xml',\n",
156 " 'google.com!njae.me.uk!1458950400!1459036799.xml',\n",
157 " 'hotmail.com!njae.me.uk!1459011600!1459098000.xml',\n",
158 " 'yahoo.com!njae.me.uk!1458864000!1458950399.xml',\n",
159 " 'yahoo.com!njae.me.uk!1459036800!1459123199.xml']"
162 "execution_count": 17,
164 "output_type": "execute_result"
174 "execution_count": 19,
182 "{'google.com!njae.me.uk!1458777600!1458863999.xml': <Element 'feedback' at 0x7fa9a8169a98>,\n",
183 " 'google.com!njae.me.uk!1458950400!1459036799.xml': <Element 'feedback' at 0x7fa9a8170a48>,\n",
184 " 'hotmail.com!njae.me.uk!1459011600!1459098000.xml': <Element 'feedback' at 0x7fa9a80f4a48>,\n",
185 " 'yahoo.com!njae.me.uk!1458864000!1458950399.xml': <Element 'feedback' at 0x7fa9a80f74a8>,\n",
186 " 'yahoo.com!njae.me.uk!1459036800!1459123199.xml': <Element 'feedback' at 0x7fa9a80f7ea8>}"
189 "execution_count": 19,
191 "output_type": "execute_result"
195 "dmarc_reports = {f: xml.etree.ElementTree.fromstring(open(f).read()) for f in xmls}\n",
201 "execution_count": 26,
208 "output_type": "stream",
210 " report_metadata : \n",
211 " org_name : google.com\n",
212 " email : noreply-dmarc-support@google.com\n",
213 " extra_contact_info : https://support.google.com/a/answer/2466580\n",
214 " report_id : 2150510829392606201\n",
216 " begin : 1458950400\n",
217 " end : 1459036799\n",
218 " policy_published : \n",
219 " domain : njae.me.uk\n",
227 " source_ip : 82.109.184.9\n",
229 " policy_evaluated : \n",
230 " disposition : none\n",
234 " header_from : njae.me.uk\n",
235 " auth_results : \n",
237 " domain : clublloyds.com\n",
240 " domain : clublloyds.com\n",
244 " source_ip : 212.69.55.62\n",
246 " policy_evaluated : \n",
247 " disposition : none\n",
251 " header_from : njae.me.uk\n",
252 " auth_results : \n",
254 " domain : njae.me.uk\n",
257 " domain : njae.me.uk\n",
260 " report_metadata : \n",
261 " org_name : Yahoo! Inc.\n",
262 " email : postmaster@dmarc.yahoo.com\n",
263 " report_id : 1459129809.695034\n",
265 " begin : 1459036800\n",
266 " end : 1459123199\n",
267 " policy_published : \n",
268 " domain : njae.me.uk\n",
275 " source_ip : 65.20.0.12\n",
277 " policy_evaluated : \n",
278 " disposition : none\n",
282 " header_from : njae.me.uk\n",
283 " auth_results : \n",
285 " domain : njae.me.uk\n",
288 " domain : njae.me.uk\n",
289 " result : softfail\n",
291 " report_metadata : \n",
292 " org_name : Yahoo! Inc.\n",
293 " email : postmaster@dmarc.yahoo.com\n",
294 " report_id : 1458957186.548175\n",
296 " begin : 1458864000\n",
297 " end : 1458950399\n",
298 " policy_published : \n",
299 " domain : njae.me.uk\n",
306 " source_ip : 212.69.55.62\n",
308 " policy_evaluated : \n",
309 " disposition : none\n",
313 " header_from : njae.me.uk\n",
314 " auth_results : \n",
316 " domain : njae.me.uk\n",
319 " domain : njae.me.uk\n",
322 " report_metadata : \n",
323 " org_name : Microsoft Corp.\n",
324 " email : dmarcrep@microsoft.com\n",
325 " report_id : 68aad5080a774e2c997d159b546569b9@hotmail.com\n",
327 " begin : 1459011600\n",
328 " end : 1459098000\n",
329 " policy_published : \n",
330 " domain : njae.me.uk\n",
338 " source_ip : 212.69.55.62\n",
340 " policy_evaluated : \n",
341 " disposition : none\n",
345 " header_from : njae.me.uk\n",
346 " auth_results : \n",
348 " domain : njae.me.uk\n",
351 " domain : njae.me.uk\n",
354 " report_metadata : \n",
355 " org_name : google.com\n",
356 " email : noreply-dmarc-support@google.com\n",
357 " extra_contact_info : https://support.google.com/a/answer/2466580\n",
358 " report_id : 13032699446207263761\n",
360 " begin : 1458777600\n",
361 " end : 1458863999\n",
362 " policy_published : \n",
363 " domain : njae.me.uk\n",
371 " source_ip : 146.185.136.235\n",
373 " policy_evaluated : \n",
374 " disposition : none\n",
378 " header_from : njae.me.uk\n",
379 " auth_results : \n",
381 " domain : njae.me.uk\n",
384 " domain : njae.me.uk\n",
385 " result : softfail\n",
391 "for f in dmarc_reports:\n",
392 " walk(dmarc_reports[f])\n",
398 "execution_count": 15,
405 "output_type": "stream",
407 " report_metadata : \n",
408 " org_name : Yahoo! Inc.\n",
409 " email : postmaster@dmarc.yahoo.com\n",
410 " report_id : 1459129809.695034\n",
412 " begin : 1459036800\n",
413 " end : 1459123199\n",
414 " policy_published : \n",
415 " domain : njae.me.uk\n",
422 " source_ip : 65.20.0.12\n",
424 " policy_evaluated : \n",
425 " disposition : none\n",
429 " header_from : njae.me.uk\n",
430 " auth_results : \n",
432 " domain : njae.me.uk\n",
435 " domain : njae.me.uk\n",
436 " result : softfail\n"
441 "root2 = xml.etree.ElementTree.fromstring(open('yahoo.com!njae.me.uk!1459036800!1459123199.xml').read())\n",
447 "execution_count": 28,
453 "conn = psycopg2.connect(host=config['database']['server'],\n",
454 " database=config['database']['database'], \n",
455 " user=config['database']['username'], \n",
456 " password=config['database']['password'])"
461 "execution_count": 30,
469 "<cursor object at 0x7fa9a819b7c8; closed: 0>"
472 "execution_count": 30,
474 "output_type": "execute_result"
478 "cur = conn.cursor()\n",
484 "execution_count": 31,
492 "{'email': 'varchar', 'org_name': 'varchar', 'report_id': 'varchar'}"
495 "execution_count": 31,
497 "output_type": "execute_result"
501 "report_fields = {'date_range_begin': 'timestamp', 'date_range_end': 'timestamp'}\n",
502 "for child in root2:\n",
503 " if child.tag == 'report_metadata':\n",
504 " for c in child:\n",
505 " if c.tag != 'date_range':\n",
506 " report_fields[c.tag] = 'varchar'\n",
512 "execution_count": 65,
518 "def xpath_of(node, prefix=''):\n",
519 " if len(node) == 0:\n",
521 " nodes = {prefix + node.tag: node.text.strip()}\n",
523 " nodes = {prefix + node.tag: ''}\n",
527 " for child in node:\n",
528 " nodes.update(xpath_of(child, \n",
529 " prefix + node.tag + '/'))\n",
535 "execution_count": 66,
543 "{'feedback/policy_published/adkim': 'r',\n",
544 " 'feedback/policy_published/aspf': 'r',\n",
545 " 'feedback/policy_published/domain': 'njae.me.uk',\n",
546 " 'feedback/policy_published/p': 'none',\n",
547 " 'feedback/policy_published/pct': '100',\n",
548 " 'feedback/record/auth_results/dkim/domain': 'njae.me.uk',\n",
549 " 'feedback/record/auth_results/dkim/result': 'pass',\n",
550 " 'feedback/record/auth_results/spf/domain': 'njae.me.uk',\n",
551 " 'feedback/record/auth_results/spf/result': 'softfail',\n",
552 " 'feedback/record/identifiers/header_from': 'njae.me.uk',\n",
553 " 'feedback/record/row/count': '1',\n",
554 " 'feedback/record/row/policy_evaluated/disposition': 'none',\n",
555 " 'feedback/record/row/policy_evaluated/dkim': 'pass',\n",
556 " 'feedback/record/row/policy_evaluated/spf': 'fail',\n",
557 " 'feedback/record/row/source_ip': '65.20.0.12',\n",
558 " 'feedback/report_metadata/date_range/begin': '1459036800',\n",
559 " 'feedback/report_metadata/date_range/end': '1459123199',\n",
560 " 'feedback/report_metadata/email': 'postmaster@dmarc.yahoo.com',\n",
561 " 'feedback/report_metadata/org_name': 'Yahoo! Inc.',\n",
562 " 'feedback/report_metadata/report_id': '1459129809.695034'}"
565 "execution_count": 66,
567 "output_type": "execute_result"
576 "execution_count": 63,
587 "execution_count": 63,
589 "output_type": "execute_result"
593 "root2.find('./report_metadata/date_range/begin').text"
598 "execution_count": 77,
606 "'./report_metadata/date_range/begin'"
609 "execution_count": 77,
611 "output_type": "execute_result"
615 "re.sub(r'^\\w*(/.*)$', r'.\\1', 'feedback/report_metadata/date_range/begin')"
620 "execution_count": 82,
628 "'report_metadata_date_range_begin'"
631 "execution_count": 82,
633 "output_type": "execute_result"
637 "re.sub(r'/', r'_',\n",
638 " re.sub(r'^[^\\/]*/(.*)$', r'\\1', 'feedback/report_metadata/date_range/begin'))"
643 "execution_count": 156,
652 "{'./policy_published/adkim': {'pg_field_name': 'policy_published_adkim',\n",
653 " 'pg_table': 'reports',\n",
654 " 'pg_type': 'varchar'},\n",
655 " './policy_published/aspf': {'pg_field_name': 'policy_published_aspf',\n",
656 " 'pg_table': 'reports',\n",
657 " 'pg_type': 'varchar'},\n",
658 " './policy_published/domain': {'pg_field_name': 'policy_published_domain',\n",
659 " 'pg_table': 'reports',\n",
660 " 'pg_type': 'varchar'},\n",
661 " './policy_published/p': {'pg_field_name': 'policy_published_p',\n",
662 " 'pg_table': 'reports',\n",
663 " 'pg_type': 'varchar'},\n",
664 " './policy_published/pct': {'pg_field_name': 'policy_published_pct',\n",
665 " 'pg_table': 'reports',\n",
666 " 'pg_type': 'int'},\n",
667 " './record[{}]/auth_results/dkim/domain': {'pg_field_name': 'auth_results_dkim_domain',\n",
668 " 'pg_table': 'report_items',\n",
669 " 'pg_type': 'varchar'},\n",
670 " './record[{}]/auth_results/dkim/result': {'pg_field_name': 'auth_results_dkim_result',\n",
671 " 'pg_table': 'report_items',\n",
672 " 'pg_type': 'varchar'},\n",
673 " './record[{}]/auth_results/spf/domain': {'pg_field_name': 'auth_results_spf_domain',\n",
674 " 'pg_table': 'report_items',\n",
675 " 'pg_type': 'varchar'},\n",
676 " './record[{}]/auth_results/spf/result': {'pg_field_name': 'auth_results_spf_result',\n",
677 " 'pg_table': 'report_items',\n",
678 " 'pg_type': 'varchar'},\n",
679 " './record[{}]/identifiers/header_from': {'pg_field_name': 'identifiers_header_from',\n",
680 " 'pg_table': 'report_items',\n",
681 " 'pg_type': 'varchar'},\n",
682 " './record[{}]/row/count': {'pg_field_name': 'count',\n",
683 " 'pg_table': 'report_items',\n",
684 " 'pg_type': 'int'},\n",
685 " './record[{}]/row/policy_evaluated/disposition': {'pg_field_name': 'policy_evaluated_disposition',\n",
686 " 'pg_table': 'report_items',\n",
687 " 'pg_type': 'varchar'},\n",
688 " './record[{}]/row/policy_evaluated/dkim': {'pg_field_name': 'policy_evaluated_dkim',\n",
689 " 'pg_table': 'report_items',\n",
690 " 'pg_type': 'varchar'},\n",
691 " './record[{}]/row/policy_evaluated/spf': {'pg_field_name': 'policy_evaluated_spf',\n",
692 " 'pg_table': 'report_items',\n",
693 " 'pg_type': 'varchar'},\n",
694 " './record[{}]/row/source_ip': {'pg_field_name': 'source_ip',\n",
695 " 'pg_table': 'report_items',\n",
696 " 'pg_type': 'inet'},\n",
697 " './report_metadata/date_range/begin': {'pg_field_name': 'report_metadata_date_range_begin',\n",
698 " 'pg_table': 'reports',\n",
699 " 'pg_type': 'timestamp'},\n",
700 " './report_metadata/date_range/end': {'pg_field_name': 'report_metadata_date_range_end',\n",
701 " 'pg_table': 'reports',\n",
702 " 'pg_type': 'timestamp'},\n",
703 " './report_metadata/email': {'pg_field_name': 'report_metadata_email',\n",
704 " 'pg_table': 'reports',\n",
705 " 'pg_type': 'varchar'},\n",
706 " './report_metadata/org_name': {'pg_field_name': 'report_metadata_org_name',\n",
707 " 'pg_table': 'reports',\n",
708 " 'pg_type': 'varchar'},\n",
709 " './report_metadata/report_id': {'pg_field_name': 'report_metadata_report_id',\n",
710 " 'pg_table': 'reports',\n",
711 " 'pg_type': 'varchar'}}"
714 "execution_count": 156,
716 "output_type": "execute_result"
720 "field_maps = {re.sub(r'^\\w*(/.*)$', r'.\\1', name): \n",
721 " {'pg_field_name': re.sub(r'/', r'_', re.sub(r'^[^\\/]*/(.*)$', r'\\1', name)),\n",
722 " 'pg_table': 'reports',\n",
723 " 'pg_type': 'varchar'}\n",
724 " for name in xpath_of(root2)\n",
725 " if 'record' not in name}\n",
726 "field_maps.update({re.sub(r'^\\w*/record(/.*)$', r'./record[{}]\\1', name): \n",
727 " {'pg_field_name': re.sub(r'/', r'_', re.sub(r'^.*/record(/row)?/(.*)$', r'\\2', name)),\n",
728 " 'pg_table': 'report_items',\n",
729 " 'pg_type': 'varchar'}\n",
730 " for name in xpath_of(root2)\n",
731 " if 'record' in name})\n",
732 "field_maps['./report_metadata/date_range/begin']['pg_type'] = 'timestamp'\n",
733 "field_maps['./report_metadata/date_range/end']['pg_type'] = 'timestamp'\n",
734 "field_maps['./policy_published/pct']['pg_type'] = 'int'\n",
735 "field_maps['./record[{}]/row/count']['pg_type'] = 'int'\n",
736 "field_maps['./record[{}]/row/source_ip']['pg_type'] = 'inet'\n",
743 "execution_count": 95,
751 "datetime.datetime(2016, 3, 27, 23, 59, 59)"
754 "execution_count": 95,
756 "output_type": "execute_result"
760 "datetime.datetime.utcfromtimestamp(1459123199)"
765 "execution_count": 100,
776 "execution_count": 100,
778 "output_type": "execute_result"
782 "datetime.datetime.utcfromtimestamp(1459123199).timestamp()"
787 "execution_count": 157,
795 "'create table reports (id serial primary key, policy_published_p varchar, report_metadata_date_range_end timestamp, report_metadata_org_name varchar, policy_published_aspf varchar, policy_published_adkim varchar, policy_published_pct int, report_metadata_email varchar, report_metadata_date_range_begin timestamp, report_metadata_report_id varchar, policy_published_domain varchar);'"
798 "execution_count": 157,
800 "output_type": "execute_result"
804 "create_report_table_string = 'create table reports (id serial primary key, ' + \\\n",
805 "', '.join(field_maps[p]['pg_field_name'] + ' ' + field_maps[p]['pg_type'] \n",
806 " for p in field_maps if field_maps[p]['pg_table'] == 'reports') + \\\n",
808 "create_report_table_string"
813 "execution_count": 193,
821 "'create table report_items (id serial primary key, report_id integer references reports, auth_results_spf_domain varchar, auth_results_dkim_domain varchar, policy_evaluated_dkim varchar, auth_results_spf_result varchar, source_ip inet, policy_evaluated_spf varchar, count int, identifiers_header_from varchar, policy_evaluated_disposition varchar, auth_results_dkim_result varchar);'"
824 "execution_count": 193,
826 "output_type": "execute_result"
830 "create_report_item_table_string = 'create table report_items (id serial primary key, ' + \\\n",
831 " 'report_id integer references reports, ' + \\\n",
832 "', '.join(field_maps[p]['pg_field_name'] + ' ' + field_maps[p]['pg_type'] \n",
833 " for p in field_maps if field_maps[p]['pg_table'] == 'report_items') + \\\n",
835 "create_report_item_table_string"
840 "execution_count": 117,
848 "<cursor object at 0x7fa9a819b7c8; closed: 0>"
851 "execution_count": 117,
853 "output_type": "execute_result"
862 "execution_count": 194,
868 "cur.execute(create_report_table_string)"
873 "execution_count": 195,
879 "cur.execute(create_report_item_table_string)"
884 "execution_count": 196,
895 "execution_count": 128,
901 "rep = dmarc_reports['google.com!njae.me.uk!1458777600!1458863999.xml']"
906 "execution_count": 134,
917 "execution_count": 134,
919 "output_type": "execute_result"
923 "rep.find('./record/row/count').text"
928 "execution_count": 135,
936 "[('google.com!njae.me.uk!1458950400!1459036799.xml', '1'),\n",
937 " ('yahoo.com!njae.me.uk!1459036800!1459123199.xml', '1'),\n",
938 " ('yahoo.com!njae.me.uk!1458864000!1458950399.xml', '2'),\n",
939 " ('hotmail.com!njae.me.uk!1459011600!1459098000.xml', '2'),\n",
940 " ('google.com!njae.me.uk!1458777600!1458863999.xml', '1')]"
943 "execution_count": 135,
945 "output_type": "execute_result"
949 "[(r, dmarc_reports[r].find('./record/row/count').text) for r in dmarc_reports]"
954 "execution_count": 136,
961 "output_type": "stream",
963 " report_metadata : \n",
964 " org_name : Microsoft Corp.\n",
965 " email : dmarcrep@microsoft.com\n",
966 " report_id : 68aad5080a774e2c997d159b546569b9@hotmail.com\n",
968 " begin : 1459011600\n",
969 " end : 1459098000\n",
970 " policy_published : \n",
971 " domain : njae.me.uk\n",
979 " source_ip : 212.69.55.62\n",
981 " policy_evaluated : \n",
982 " disposition : none\n",
986 " header_from : njae.me.uk\n",
987 " auth_results : \n",
989 " domain : njae.me.uk\n",
992 " domain : njae.me.uk\n",
998 "walk(dmarc_reports['hotmail.com!njae.me.uk!1459011600!1459098000.xml'])"
1002 "cell_type": "code",
1003 "execution_count": 137,
1010 "output_type": "stream",
1012 " report_metadata : \n",
1013 " org_name : google.com\n",
1014 " email : noreply-dmarc-support@google.com\n",
1015 " extra_contact_info : https://support.google.com/a/answer/2466580\n",
1016 " report_id : 2150510829392606201\n",
1018 " begin : 1458950400\n",
1019 " end : 1459036799\n",
1020 " policy_published : \n",
1021 " domain : njae.me.uk\n",
1029 " source_ip : 82.109.184.9\n",
1031 " policy_evaluated : \n",
1032 " disposition : none\n",
1035 " identifiers : \n",
1036 " header_from : njae.me.uk\n",
1037 " auth_results : \n",
1039 " domain : clublloyds.com\n",
1042 " domain : clublloyds.com\n",
1046 " source_ip : 212.69.55.62\n",
1048 " policy_evaluated : \n",
1049 " disposition : none\n",
1052 " identifiers : \n",
1053 " header_from : njae.me.uk\n",
1054 " auth_results : \n",
1056 " domain : njae.me.uk\n",
1059 " domain : njae.me.uk\n",
1065 "walk(dmarc_reports['google.com!njae.me.uk!1458950400!1459036799.xml'])"
1069 "cell_type": "code",
1070 "execution_count": 159,
1078 "['./record[{}]/auth_results/spf/domain',\n",
1079 " './record[{}]/auth_results/dkim/domain',\n",
1080 " './record[{}]/row/policy_evaluated/dkim',\n",
1081 " './record[{}]/auth_results/spf/result',\n",
1082 " './record[{}]/row/source_ip',\n",
1083 " './record[{}]/row/policy_evaluated/spf',\n",
1084 " './record[{}]/row/count',\n",
1085 " './record[{}]/identifiers/header_from',\n",
1086 " './record[{}]/row/policy_evaluated/disposition',\n",
1087 " './record[{}]/auth_results/dkim/result']"
1090 "execution_count": 159,
1092 "output_type": "execute_result"
1096 "[p for p in field_maps if field_maps[p]['pg_table'] == 'report_items']"
1100 "cell_type": "code",
1101 "execution_count": 140,
1112 "execution_count": 140,
1114 "output_type": "execute_result"
1118 "len(dmarc_reports['google.com!njae.me.uk!1458950400!1459036799.xml'].findall('./record'))"
1122 "cell_type": "code",
1123 "execution_count": 144,
1134 "execution_count": 144,
1136 "output_type": "execute_result"
1140 "dmarc_reports['google.com!njae.me.uk!1458950400!1459036799.xml'].find('./record[2]/row/source_ip').text"
1144 "cell_type": "code",
1145 "execution_count": 153,
1156 "execution_count": 153,
1158 "output_type": "execute_result"
1162 "dmarc_reports['google.com!njae.me.uk!1458950400!1459036799.xml'].find('./record[{}]/row/source_ip'.format(1)).text"
1166 "cell_type": "code",
1167 "execution_count": 163,
1174 "output_type": "stream",
1176 "policy_published_p :> none\n",
1177 "report_metadata_date_range_end :> 1459036799\n",
1178 "report_metadata_org_name :> google.com\n",
1179 "policy_published_aspf :> r\n",
1180 "policy_published_adkim :> r\n",
1181 "policy_published_pct :> 100\n",
1182 "report_metadata_email :> noreply-dmarc-support@google.com\n",
1183 "report_metadata_date_range_begin :> 1458950400\n",
1184 "report_metadata_report_id :> 2150510829392606201\n",
1185 "policy_published_domain :> njae.me.uk\n"
1190 "rep = dmarc_reports['google.com!njae.me.uk!1458950400!1459036799.xml']\n",
1191 "for f in [f for f in field_maps if field_maps[f]['pg_table'] == 'reports']:\n",
1192 " print(field_maps[f]['pg_field_name'], ':>', rep.find(f).text)"
1196 "cell_type": "code",
1197 "execution_count": 165,
1204 "output_type": "stream",
1207 "auth_results_spf_domain :> clublloyds.com\n",
1208 "auth_results_dkim_domain :> clublloyds.com\n",
1209 "policy_evaluated_dkim :> fail\n",
1210 "auth_results_spf_result :> pass\n",
1211 "source_ip :> 82.109.184.9\n",
1212 "policy_evaluated_spf :> fail\n",
1214 "identifiers_header_from :> njae.me.uk\n",
1215 "policy_evaluated_disposition :> none\n",
1216 "auth_results_dkim_result :> pass\n",
1218 "auth_results_spf_domain :> njae.me.uk\n",
1219 "auth_results_dkim_domain :> njae.me.uk\n",
1220 "policy_evaluated_dkim :> pass\n",
1221 "auth_results_spf_result :> pass\n",
1222 "source_ip :> 212.69.55.62\n",
1223 "policy_evaluated_spf :> pass\n",
1225 "identifiers_header_from :> njae.me.uk\n",
1226 "policy_evaluated_disposition :> none\n",
1227 "auth_results_dkim_result :> pass\n"
1232 "rep = dmarc_reports['google.com!njae.me.uk!1458950400!1459036799.xml']\n",
1233 "for i in range(1, len(rep.findall('./record'))+1):\n",
1235 " for f in [f for f in field_maps if field_maps[f]['pg_table'] == 'report_items']:\n",
1236 " print(field_maps[f]['pg_field_name'], ':>', rep.find(f.format(i)).text)"
1240 "cell_type": "code",
1241 "execution_count": 166,
1247 "def maybe_strip(text):\n",
1249 " return text.strip()\n",
1255 "cell_type": "code",
1256 "execution_count": 197,
1264 "('insert into reports (policy_published_p, report_metadata_date_range_end, report_metadata_org_name, policy_published_aspf, policy_published_adkim, policy_published_pct, report_metadata_email, report_metadata_date_range_begin, report_metadata_report_id, policy_published_domain) values (%(policy_published_p)s, %(report_metadata_date_range_end)s, %(report_metadata_org_name)s, %(policy_published_aspf)s, %(policy_published_adkim)s, %(policy_published_pct)s, %(report_metadata_email)s, %(report_metadata_date_range_begin)s, %(report_metadata_report_id)s, %(policy_published_domain)s);',\n",
1265 " {'policy_published_adkim': 'r',\n",
1266 " 'policy_published_aspf': 'r',\n",
1267 " 'policy_published_domain': 'njae.me.uk',\n",
1268 " 'policy_published_p': 'none',\n",
1269 " 'policy_published_pct': 100,\n",
1270 " 'report_metadata_date_range_begin': datetime.datetime(2016, 3, 26, 0, 0),\n",
1271 " 'report_metadata_date_range_end': datetime.datetime(2016, 3, 26, 23, 59, 59),\n",
1272 " 'report_metadata_email': 'noreply-dmarc-support@google.com',\n",
1273 " 'report_metadata_org_name': 'google.com',\n",
1274 " 'report_metadata_report_id': '2150510829392606201'})"
1277 "execution_count": 197,
1279 "output_type": "execute_result"
1283 "rep = dmarc_reports['google.com!njae.me.uk!1458950400!1459036799.xml']\n",
1284 "field_names = []\n",
1286 "for f in [f for f in field_maps if field_maps[f]['pg_table'] == 'reports']:\n",
1287 " field_names += [field_maps[f]['pg_field_name']]\n",
1288 " if field_maps[f]['pg_type'] == 'int':\n",
1289 " values[field_maps[f]['pg_field_name']] = int(rep.find(f).text)\n",
1290 " elif field_maps[f]['pg_type'] == 'timestamp':\n",
1291 " values[field_maps[f]['pg_field_name']] = datetime.datetime.utcfromtimestamp(int(rep.find(f).text))\n",
1292 " elif field_maps[f]['pg_type'] == 'inet':\n",
1293 " values[field_maps[f]['pg_field_name']] = maybe_strip(rep.find(f).text)\n",
1295 " values[field_maps[f]['pg_field_name']] = maybe_strip(rep.find(f).text)\n",
1296 "insert_string = 'insert into reports (' + ', '.join(field_names) +') '\n",
1297 "insert_string += 'values (' + ', '.join('%({})s'.format(f) for f in field_names) + ');'\n",
1298 "insert_string, values"
1302 "cell_type": "code",
1303 "execution_count": 198,
1309 "cur.execute(insert_string, values)\n",
1314 "cell_type": "code",
1315 "execution_count": 201,
1326 "execution_count": 201,
1328 "output_type": "execute_result"
1332 "cur.execute('select id, report_metadata_report_id from reports where report_metadata_report_id = %s;', \n",
1333 " [rep.find('./report_metadata/report_id').text])\n",
1334 "cur.fetchall()[0][0]"
1338 "cell_type": "code",
1339 "execution_count": 203,
1346 "output_type": "stream",
1349 "insert into report_items (report_id, auth_results_spf_domain, auth_results_dkim_domain, policy_evaluated_dkim, auth_results_spf_result, source_ip, policy_evaluated_spf, count, identifiers_header_from, policy_evaluated_disposition, auth_results_dkim_result) values (%(report_id)s, %(auth_results_spf_domain)s, %(auth_results_dkim_domain)s, %(policy_evaluated_dkim)s, %(auth_results_spf_result)s, %(source_ip)s, %(policy_evaluated_spf)s, %(count)s, %(identifiers_header_from)s, %(policy_evaluated_disposition)s, %(auth_results_dkim_result)s); {'auth_results_spf_result': 'pass', 'count': 1, 'report_id': 1, 'identifiers_header_from': 'njae.me.uk', 'policy_evaluated_disposition': 'none', 'auth_results_dkim_result': 'pass', 'source_ip': '82.109.184.9', 'policy_evaluated_spf': 'fail', 'auth_results_dkim_domain': 'clublloyds.com', 'auth_results_spf_domain': 'clublloyds.com', 'policy_evaluated_dkim': 'fail'}\n",
1351 "insert into report_items (report_id, auth_results_spf_domain, auth_results_dkim_domain, policy_evaluated_dkim, auth_results_spf_result, source_ip, policy_evaluated_spf, count, identifiers_header_from, policy_evaluated_disposition, auth_results_dkim_result) values (%(report_id)s, %(auth_results_spf_domain)s, %(auth_results_dkim_domain)s, %(policy_evaluated_dkim)s, %(auth_results_spf_result)s, %(source_ip)s, %(policy_evaluated_spf)s, %(count)s, %(identifiers_header_from)s, %(policy_evaluated_disposition)s, %(auth_results_dkim_result)s); {'auth_results_spf_result': 'pass', 'count': 1, 'report_id': 1, 'identifiers_header_from': 'njae.me.uk', 'policy_evaluated_disposition': 'none', 'auth_results_dkim_result': 'pass', 'source_ip': '212.69.55.62', 'policy_evaluated_spf': 'pass', 'auth_results_dkim_domain': 'njae.me.uk', 'auth_results_spf_domain': 'njae.me.uk', 'policy_evaluated_dkim': 'pass'}\n"
1356 "rep = dmarc_reports['google.com!njae.me.uk!1458950400!1459036799.xml']\n",
1357 "for i in range(1, len(rep.findall('./record'))+1):\n",
1359 " field_names = []\n",
1360 " cur.execute('select id, report_metadata_report_id from reports where report_metadata_report_id = %s;', \n",
1361 " [rep.find('./report_metadata/report_id').text])\n",
1362 " results = cur.fetchall()\n",
1363 " if len(results) != 1:\n",
1366 " report_id = results[0][0]\n",
1367 " values = {'report_id': report_id}\n",
1368 " for f in [f for f in field_maps if field_maps[f]['pg_table'] == 'report_items']:\n",
1369 " field_names += [field_maps[f]['pg_field_name']]\n",
1370 " if field_maps[f]['pg_type'] == 'int':\n",
1371 " values[field_maps[f]['pg_field_name']] = int(rep.find(f.format(i)).text)\n",
1372 " elif field_maps[f]['pg_type'] == 'timestamp':\n",
1373 " values[field_maps[f]['pg_field_name']] = datetime.datetime.utcfromtimestamp(int(rep.find(f.format(i)).text))\n",
1374 " elif field_maps[f]['pg_type'] == 'inet':\n",
1375 " values[field_maps[f]['pg_field_name']] = maybe_strip(rep.find(f.format(i)).text)\n",
1377 " values[field_maps[f]['pg_field_name']] = maybe_strip(rep.find(f.format(i)).text)\n",
1378 " insert_string = 'insert into report_items (report_id, ' + ', '.join(field_names) +') '\n",
1379 " insert_string += 'values (%(report_id)s, ' + ', '.join('%({})s'.format(f) for f in field_names) + ');'\n",
1380 " print(insert_string, values)\n",
1381 " cur.execute(insert_string, values)\n",
1386 "cell_type": "code",
1387 "execution_count": 191,
1397 "cell_type": "code",
1398 "execution_count": 209,
1404 "def write_report(connection, cursor, report):\n",
1406 " field_names = []\n",
1408 " for f in [f for f in field_maps if field_maps[f]['pg_table'] == 'reports']:\n",
1409 " field_names += [field_maps[f]['pg_field_name']]\n",
1410 " if field_maps[f]['pg_type'] == 'int':\n",
1411 " values[field_maps[f]['pg_field_name']] = int(report.find(f).text)\n",
1412 " elif field_maps[f]['pg_type'] == 'timestamp':\n",
1413 " values[field_maps[f]['pg_field_name']] = datetime.datetime.utcfromtimestamp(int(report.find(f).text))\n",
1414 " elif field_maps[f]['pg_type'] == 'inet':\n",
1415 " values[field_maps[f]['pg_field_name']] = maybe_strip(report.find(f).text)\n",
1417 " values[field_maps[f]['pg_field_name']] = maybe_strip(report.find(f).text)\n",
1418 " insert_string = 'insert into reports (' + ', '.join(field_names) + ') '\n",
1419 " insert_string += 'values (' + ', '.join('%({})s'.format(f) for f in field_names) + ');'\n",
1420 " cursor.execute(insert_string, values)\n",
1422 " for i in range(1, len(report.findall('./record'))+1):\n",
1423 " field_names = []\n",
1424 " cursor.execute('select id, report_metadata_report_id from reports where report_metadata_report_id = %s;', \n",
1425 " [report.find('./report_metadata/report_id').text])\n",
1426 " results = cursor.fetchall()\n",
1427 " if len(results) != 1:\n",
1430 " report_id = results[0][0]\n",
1431 " values = {'report_id': report_id}\n",
1432 " for f in [f for f in field_maps if field_maps[f]['pg_table'] == 'report_items']:\n",
1433 " field_names += [field_maps[f]['pg_field_name']]\n",
1434 " if field_maps[f]['pg_type'] == 'int':\n",
1435 " values[field_maps[f]['pg_field_name']] = int(report.find(f.format(i)).text)\n",
1436 " elif field_maps[f]['pg_type'] == 'timestamp':\n",
1437 " values[field_maps[f]['pg_field_name']] = datetime.datetime.utcfromtimestamp(int(report.find(f.format(i)).text))\n",
1438 " elif field_maps[f]['pg_type'] == 'inet':\n",
1439 " values[field_maps[f]['pg_field_name']] = maybe_strip(report.find(f.format(i)).text)\n",
1441 " values[field_maps[f]['pg_field_name']] = maybe_strip(report.find(f.format(i)).text)\n",
1442 " insert_string = 'insert into report_items (report_id, ' + ', '.join(field_names) + ') '\n",
1443 " insert_string += 'values (%(report_id)s, ' + ', '.join('%({})s'.format(f) for f in field_names) + ');'\n",
1444 " cursor.execute(insert_string, values)\n",
1445 " connection.commit()"
1449 "cell_type": "code",
1450 "execution_count": 210,
1456 "for rep in dmarc_reports:\n",
1457 " write_report(conn, cur, dmarc_reports[rep])"
1461 "cell_type": "code",
1462 "execution_count": 211,
1472 "cell_type": "code",
1473 "execution_count": 208,
1483 "cell_type": "code",
1484 "execution_count": null,
1494 "display_name": "Python 3",
1495 "language": "python",
1499 "codemirror_mode": {
1503 "file_extension": ".py",
1504 "mimetype": "text/x-python",
1506 "nbconvert_exporter": "python",
1507 "pygments_lexer": "ipython3",