import csv import os import sys import yaml import json NORESOURCE = False def parseRow(row): try: userid = parse(row.get("useridentity", "null")) arn = userid["sessioncontext"]["sessionissuer"]["arn"] if not arn or arn == "null": arn = userid["arn"] except Exception as e: arn = "null" api = row.get('eventsource', 'null') action = row.get('eventname', 'null') resources = row.get('resources', 'null') if NORESOURCE: resources = [] if type(resources) == list: resources = "[{}]".format(", ".join(resources)) identifier = "{}:{}:{}".format(api, action, resources) actions.setdefault(arn, set()).add(identifier) def parse(obj): try: s = obj.replace('=', ': ') # CLoader requires libyaml-cpp-dev to work. Using yaml.FullLoader is about 20x slower. return yaml.load(s, Loader=yaml.CLoader) except Exception: return obj if __name__ == "__main__": actions = {} if os.getenv("noresource"): NORESOURCE = True with open(sys.argv[1]) as f: reader = csv.DictReader(f) for i, row in enumerate(reader): parseRow(row) # json parser cannot handle set type print(json.dumps({key: list(value) for key, value in actions.items()}))