scripts/sort_checklist.py (60 lines of code) (raw):

################################################################################# # # This script sorts a specific checklist and saves it. # # Last updated: January 2023 # ################################################################################# import json import argparse import sys import requests # Get input arguments parser = argparse.ArgumentParser(description='Update a checklist spreadsheet with JSON-formatted Azure Resource Graph results') parser.add_argument('--input-file', dest='input_file', action='store', help='You need to supply the name of the JSON file with the checklist to be filtered') parser.add_argument('--output-file', dest='output_file', action='store', help='You can optionally supply the name of a new JSON file that will be used to save the output. Otherwise the sorted checklist will replace the unused one') parser.add_argument('--dry-run', dest='dry_run', action='store_true', default=False, help='do not save anything, only output to console (default: False)') parser.add_argument('--verbose', dest='verbose', action='store_true', default=False, help='run in verbose mode (default: False)') args = parser.parse_args() if not args.input_file: print("ERROR: no input file specified, not doing anything") # Verifies that all dictionary items in the provided array have a non-empty "id" key def all_items_have_id(items): for item in items: if 'id' not in item: return False return True # Verifies that all dictionary items in the provided array have a non-empty "id" key def all_items_have_categories(items): for item in items: if ('category' not in item) or ('subcategory' not in item): return False return True # Load the checklist try: with open(args.input_file) as f: checklist = json.load(f) except Exception as e: print("ERROR: Error when processing JSON file, nothing changed", args.input_file, "-", str(e)) # Sort the items per ID, or per category/subcategory if ID is missing items = checklist['items'] if all_items_have_id(checklist['items']): if args.verbose: print("DEBUG: Ordering list by ID") items = sorted(items, key=lambda k: (k['id'])) checklist['items'] = items elif all_items_have_categories(checklist['items']): if args.verbose: print("DEBUG: Ordering list by category and subcategory, as some items do not have an ID") items = sorted(items, key=lambda k: (k['category'],k["subcategory"])) checklist['items'] = items else: if args.verbose: print("DEBUG: Some items in the checklist do not have a valid ID or category/subcategory, nothing changed") # If dry-run, show on screen if args.dry_run: print(json.dumps(checklist, indent=4)) # Saving output file if specified in the argument if not args.dry_run: if args.output_file: output_file = args.output_file else: output_file = args.input_file if args.verbose: print("DEBUG: saving output file to", output_file) checklist_string = json.dumps(checklist, indent=4) with open(output_file, 'w', encoding='utf-8') as f: f.write(checklist_string) f.close()