| #!/usr/bin/env python |
| |
| r""" |
| Create index files that can be displayed as web pages in a given directory |
| and all its sub-directories. There are options to exclude certain files and |
| sub-directories. |
| """ |
| |
| import argparse |
| import os |
| import sys |
| |
| |
| def main(i_raw_args): |
| l_args = parse_args(i_raw_args) |
| create_index_file(l_args.logs_dir_path, "/", l_args.exclude) |
| |
| |
| def create_index_file(i_dir_path, i_pretty_dir_path, i_exclude_list): |
| r""" |
| Create HTML index files for a given directory and all its sub-directories. |
| |
| Description of argument(s): |
| i_dir_path The directory to generate an index file for. |
| i_pretty_dir_path A pretty version of i_dir_path that can be shown to |
| readers of the HTML page. For example, if i_dir_path |
| is set to '/home/johndoe/logs/`, the caller may wish |
| to only show '/logs/' in the HTML index pages. |
| i_exclude_list A Python list of files and directories to exclude from |
| """ |
| |
| l_index_file_path = os.path.join(i_dir_path, "index.html") |
| l_sub_dir_list = os.listdir(i_dir_path) |
| |
| # Created a sorted list of sub-directories in this directory |
| l_dirs = sorted( |
| [ |
| d |
| for d in l_sub_dir_list |
| if os.path.isdir(os.path.join(i_dir_path, d)) |
| and d not in i_exclude_list |
| ] |
| ) |
| |
| # Create a sorted list of files in this directory |
| l_files = sorted( |
| [ |
| f |
| for f in l_sub_dir_list |
| if not os.path.isdir(os.path.join(i_dir_path, f)) |
| and f not in i_exclude_list |
| ] |
| ) |
| |
| # Open up the index file we're going to write to. |
| with open(l_index_file_path, "w+") as l_index_file: |
| l_index_file.write( |
| "<html>\n<head><title>" |
| + i_pretty_dir_path |
| + "</title></head>\n<body>\n<h2>OpenBMC Logs</h2>\n<h3>" |
| + i_pretty_dir_path |
| + "</h3>\n" |
| ) |
| |
| # Only show the link to go up a directory if this is not the root. |
| if not i_pretty_dir_path == "/": |
| l_index_file.write( |
| '<a href=".."><img src="/dir.png"> ..</a><br>\n' |
| ) |
| |
| # List directories first. |
| for l_dir in l_dirs: |
| l_index_file.write( |
| '<a href="%s"><img src="/dir.png"> %s</a><br>\n' |
| % (l_dir, l_dir) |
| ) |
| create_index_file( |
| os.path.join(i_dir_path, l_dir), |
| i_pretty_dir_path + l_dir + "/", |
| i_exclude_list, |
| ) |
| |
| # List files second. |
| for l_file in l_files: |
| l_index_file.write( |
| '<a href="%s"><img src="/file.png"> %s</a><br>\n' |
| % (l_file, l_file) |
| ) |
| |
| l_index_file.write("</body>\n</html>") |
| |
| |
| def parse_args(i_raw_args): |
| r""" |
| Parse the given list as command-line arguments and return an object with |
| the argument values. |
| |
| Description of argument(s): |
| i_raw_args A list of command-line arguments, usually taken from |
| sys.argv[1:]. |
| """ |
| |
| parser = argparse.ArgumentParser( |
| description=( |
| "%(prog)s will create index files that can be displayed " |
| "as web pages in a given directory and all its " |
| "sub-directories." |
| ), |
| formatter_class=argparse.ArgumentDefaultsHelpFormatter, |
| ) |
| parser.add_argument( |
| "logs_dir_path", |
| help="Directory containing the logs that should be uploaded.", |
| ) |
| parser.add_argument( |
| "--exclude", |
| nargs="+", |
| default=[".git", "index.html"], |
| help="A space-delimited list of files to exclude from the index.", |
| ) |
| return parser.parse_args(i_raw_args) |
| |
| |
| if __name__ == "__main__": |
| main(sys.argv[1:]) |