Created
January 9, 2018 04:11
-
-
Save ropnop/baf859e61fbad6df1623fb206786731a to your computer and use it in GitHub Desktop.
A Python script for SANS Holiday Hack 2017
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python2 | |
# load the infraction json data | |
import json | |
with open('infractions.json', 'r') as fp: | |
data = json.loads(fp.read()) | |
infractions = data['infractions'] | |
# get all the names and generate the naughty list from the CSV | |
names = [] | |
naughty_list = [] | |
with open('list.csv', 'r') as fp: | |
header = fp.readline() | |
for line in fp: | |
name = line.split(',')[0] | |
names.append(name) | |
if 'Naughty' in line.split(',')[1]: | |
naughty_list.append(name) | |
# flatten the coals in to a sum for each infraction | |
for infraction in infractions: | |
infraction['coals'] = sum(infraction['coals']) | |
# generate a dictionary with each name as a key, with status, sum of infractions and coals | |
all_data = {} | |
for name in names: | |
person_data = {} | |
person_data['status'] = 'Naughty' if name in naughty_list else 'Nice' | |
person_data['infractions'] = [] | |
person_data['total_infractions'] = 0 | |
person_data['total_coal'] = 0 | |
for infraction in infractions: | |
if infraction['name'] == name: | |
person_data['infractions'].append(infraction) | |
person_data['total_infractions'] += 1 | |
person_data['total_coal'] += infraction['coals'] | |
all_data[name] = person_data | |
# Example: | |
# all_data['Abdullah Lindsey'] = {'status': 'Nice', 'infractions': [{u'status': u'pending', u'severity': 3.0, 'nn': 'Nice', u'title': u'Throwing rocks (non-person target)', u'coals': 3, u'date': u'2017-03-09T10:19:28', u'name': u'Abdullah Lindsey'}, {u'status': u'closed', u'severity': 5.0, 'nn': 'Nice', u'title': u'Naughty words', u'coals': 5, u'date': u'2017-06-28T12:04:04', u'name': u'Abdullah Lindsey'}], 'total_infractions': 2, 'total_coal': 8} | |
# Iterate over naughty and nice and keep track of total # of infractions | |
naughty_infraction_totals = set() | |
nice_infraction_totals = set() | |
for name in all_data: | |
if all_data[name]['status'] == 'Naughty': | |
naughty_infraction_totals.add(all_data[name]['total_infractions']) | |
else: | |
nice_infraction_totals.add(all_data[name]['total_infractions']) | |
# Print the minimum infractions for naughty people, and max infractions for nice | |
print "Max infractions for nice people: {}".format(max(nice_infraction_totals)) | |
print "Min infractions for naughty people: {}".format(min(naughty_infraction_totals)) | |
# Find moles by iterating and finding people who have *both* throwing rocks and pulling hair infractions | |
moles = [] | |
for name in all_data: | |
infraction_titles = [] | |
for infraction in all_data[name]['infractions']: | |
infraction_titles.append(infraction['title']) | |
if any('Throwing rocks' in title for title in infraction_titles): | |
if any('pulling of hair' in title for title in infraction_titles): | |
moles.append(name) | |
print "Found {} potential moles:".format(len(moles)) | |
for name in moles: | |
print "\t{}".format(name) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment