tools/parse_manifest.py (79 lines of code) (raw):

#!/usr/bin/env python3 import sys import os import inspect import datetime def hyperlink_to_this_file(): filename= os.path.basename( inspect.getfile(inspect.currentframe() ) ) return "[{0}](../tools/{0})".format(filename) # The markdown increases the width of the table with each entry and it is difficult to find the scrollbars. # This is hack to make it fit def return_line_with_breaks(text_line): col_width = 85 insertion=col_width while insertion < len(text_line): text_line = "{0}<br>{1}".format(text_line[0:insertion],text_line[insertion:]) if not use_verbosity is None: print(text_line) insertion+=col_width return text_line """ This scripts creates two doc files by different pivots """ manifest_folder = "../manifests" documentation_folder = "../docs" if len(sys.argv) > 1: documentation_folder = sys.argv[1] use_verbosity = os.environ.get('PARSE_SCRIPT_VERBOSITY') print("Output folder: {0}".format(documentation_folder) ) manifest_doc_file = "manifest_content.md" manifest_doc_file_path = os.path.join(documentation_folder,manifest_doc_file) by_content_doc_file = "manifest_by_file.md" by_content_doc_file_path = os.path.join(documentation_folder,by_content_doc_file) with open( file=manifest_doc_file_path, mode="w", newline="\r\n") as manifestDocFile: with open( file=by_content_doc_file_path, mode="w", newline="\r\n") as contentDocFile: template = "This file documents {0} disk inspection manifests used by Microsoft Azure support. Any data collected by Microsoft using this tooling is done according to the policy outlined in the [Azure Trust Center](https://azure.microsoft.com/en-us/support/trust-center/).\n\n" manifestDocFile.write(template.format("the various files collected, or directory listed or registry key queried by") ) contentDocFile.write(template.format("files collected in")) for root, dirs, files in os.walk(manifest_folder): dirs.sort() if root is manifest_folder: # create an initial list for dirname in dirs: manifestDocFile.write("* [{0}](#{0})\n".format(dirname) ) contentDocFile.write("* [{0}](#{0})\n".format(dirname) ) else: listing={} current_os = os.path.basename(root) manifestDocFile.write("## {0} \n".format(current_os) ) manifestDocFile.write(" Manifest | Operation | File Path \n") manifestDocFile.write(" ------------- | ------------- | ------------- \n") contentDocFile.write("## {0} \n".format(current_os) ) contentDocFile.write("File Path | Manifest \n") contentDocFile.write("------------- | ------------- \n") files.sort() for filename in files: filepath = os.path.join(root, filename) current_manifest = filename if not use_verbosity is None: print(filepath) with open(file=filepath, mode="r") as manifestFile: for line in manifestFile: line = line.strip() if ( len(line)>0 and line != "\n" and not line.lower().startswith("echo") ): splitline = line.split(',') if (splitline[0].strip() == "ll"): splitline[0] = "list" elif (splitline[0].strip() == "reg"): splitline[0] = "registry query" manifestDocFile.write("{0} | {1} | {2}\n".format(current_manifest, splitline[0], return_line_with_breaks(splitline[1].replace("*","\*")) ) ) if (splitline[0].strip() == "copy"): filename = splitline[1].replace("*","\*") if not use_verbosity is None: print("{0} - {1}".format(filename,current_manifest) ) if ( filename in listing ): # Add to existing listing[filename].append(current_manifest) else: # create a new item listing[filename]=[current_manifest] for copiedFile in sorted(listing): contentDocFile.write("{0} | {1} \n".format(return_line_with_breaks(copiedFile), ', '.join(listing[copiedFile]) ) ) footer = "\n*File was created by running " + hyperlink_to_this_file() + " on `" + str(datetime.datetime.now())+ "`*" manifestDocFile.write( footer ) manifestDocFile.flush() contentDocFile.write( footer ) contentDocFile.flush() for f in [manifest_doc_file_path,by_content_doc_file_path]: print("'{0}' was created, file size={1}".format(f, os.path.getsize(f)) )