prebuilt-rules-scripts/create-json-from-docs.py (79 lines of code) (raw):

import json from pathlib import Path # Creates a JSON file from the existing prebuilt rules documentation and saves # it in the diff-files folder. releaseVersion = "7.11.0" # Security app release version - update as required ROOT = Path(__file__).resolve().parent.parent def sort_by_name(rule): """Helper to sort rule by name""" return rule['name'] docSourcePath = ROOT.joinpath('docs', 'detections', 'prebuilt-rules', 'rule-details') rule_dict = [] files = docSourcePath.glob("*.asciidoc") name = "" description = "" falsePos = "" notes = "" isDesc = False isFalsePos = False isNotes = False counter = 0 for file in files: with open(file, "r") as docFile: text = docFile.readlines() for count, line in enumerate(text): if count == 1: name = line.split("=== ")[1].replace("\n", "") isDesc = True if isDesc: description = description + line if "*Rule type*" in text[count + 1]: isDesc = False if "==== Potential false positives" in line: isFalsePos = True continue if isFalsePos: falsePos = falsePos + line if ("==== Rule query" in text[count]) or ("==== Investigation guide" in text[count]) or \ ("==== Rule version history" in text[count]): isFalsePos = False if "==== Investigation guide" in line: isNotes = True continue if isNotes: notes = notes + line isNotes = False isFalsePos = False description = description.split("\n\n", 1)[1].replace("\n\n", "\n").rstrip() if "[[" in notes: notes = notes.split("[[")[0] if "\n==== Rule query\n" in notes: notes = notes.split("\n==== Rule query\n")[0] if "==== Rule query\n" in falsePos: falsePos = falsePos.split("\n\n==== Rule query\n")[0] if "==== Investigation guide\n" in falsePos: falsePos = falsePos.split("\n\n==== Investigation guide\n")[0] if "[[" in falsePos: falsePos = falsePos.split("[[")[0] falsePos = falsePos.rstrip() if falsePos != "" and notes == "": falsePos = falsePos.split("\n", 1)[1] rule_text = {"name": name, "description": description, "false_positives": [falsePos]} if falsePos == "" and notes == "": rule_text = {"name": name, "description": description} if falsePos == "" and notes != "": notes = notes.rstrip() notes = notes.split("\n", 1)[1] rule_text = {"name": name, "description": description, "note": notes} if falsePos != "" and notes != "": notes = notes.rstrip() notes = notes.split("\n", 1)[1] falsePos = falsePos.split("\n", 1)[1] rule_text = {"name": name, "description": description, "false_positives": [falsePos], "note": notes} rule_dict.append(rule_text) name = "" description = "" type = "" falsePos = "" notes = "" # Update the file name below to indicate this JSON file is the currently # existing docs rule_dict = sorted(rule_dict, key=sort_by_name) diff_file = ROOT.joinpath("prebuilt-rules-scripts/diff-files/gen-files/json-from-docs-" + releaseVersion + ".json") with open(diff_file, "w") as fp: json.dump(rule_dict, fp, indent=2)