Charles Paul Hofer | 69560bf | 2018-08-21 14:04:35 -0500 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | |
| 3 | r""" |
| 4 | Create index files that can be displayed as web pages in a given directory |
| 5 | and all its sub-directories. There are options to exclude certain files and |
| 6 | sub-directories. |
| 7 | """ |
| 8 | |
| 9 | import argparse |
| 10 | import os |
| 11 | import sys |
| 12 | |
| 13 | |
| 14 | def main(i_raw_args): |
| 15 | l_args = parse_args(i_raw_args) |
| 16 | create_index_file(l_args.logs_dir_path, '/', l_args.exclude) |
| 17 | |
| 18 | |
| 19 | def create_index_file(i_dir_path, i_pretty_dir_path, i_exclude_list): |
| 20 | r""" |
| 21 | Create HTML index files for a given directory and all its sub-directories. |
| 22 | |
| 23 | Description of argument(s): |
| 24 | i_dir_path The directory to generate an index file for. |
| 25 | i_pretty_dir_path A pretty version of i_dir_path that can be shown to |
| 26 | readers of the HTML page. For example, if i_dir_path |
| 27 | is set to '/home/johndoe/logs/`, the caller may wish |
| 28 | to only show '/logs/' in the HTML index pages. |
| 29 | i_exclude_list A Python list of files and directories to exclude from |
| 30 | """ |
| 31 | |
| 32 | l_index_file_path = os.path.join(i_dir_path, 'index.html') |
| 33 | l_sub_dir_list = os.listdir(i_dir_path) |
| 34 | |
| 35 | # Created a sorted list of sub-directories in this directory |
| 36 | l_dirs = sorted( |
| 37 | [d for d |
| 38 | in l_sub_dir_list |
| 39 | if os.path.isdir(os.path.join(i_dir_path, d)) |
| 40 | and d not in i_exclude_list]) |
| 41 | |
| 42 | # Create a sorted list of files in this directory |
| 43 | l_files = sorted( |
| 44 | [f for f |
| 45 | in l_sub_dir_list |
| 46 | if not os.path.isdir(os.path.join(i_dir_path, f)) |
| 47 | and f not in i_exclude_list]) |
| 48 | |
| 49 | # Open up the index file we're going to write to. |
| 50 | with open(l_index_file_path, 'w+') as l_index_file: |
| 51 | l_index_file.write( |
| 52 | '<html>\n' |
| 53 | '<head><title>' + i_pretty_dir_path + '</title></head>\n' |
| 54 | '<body>\n' |
| 55 | '<h2>OpenBMC Logs</h2>\n' |
| 56 | '<h3>' + i_pretty_dir_path + '</h3>\n') |
| 57 | |
| 58 | # Only show the link to go up a directory if this is not the root. |
| 59 | if not i_pretty_dir_path == '/': |
| 60 | l_index_file.write('<a href=".."><img src="/dir.png"> ..</a><br>\n') |
| 61 | |
| 62 | # List directories first. |
| 63 | for l_dir in l_dirs: |
| 64 | l_index_file.write( |
| 65 | '<a href="%s"><img src="/dir.png"> %s</a><br>\n' |
| 66 | % (l_dir, l_dir)) |
| 67 | create_index_file( |
| 68 | os.path.join(i_dir_path, l_dir), |
| 69 | i_pretty_dir_path + l_dir + '/', |
| 70 | i_exclude_list) |
| 71 | |
| 72 | # List files second. |
| 73 | for l_file in l_files: |
| 74 | l_index_file.write('<a href="%s"><img src="/file.png"> %s</a><br>\n' |
| 75 | % (l_file, l_file)) |
| 76 | |
| 77 | l_index_file.write('</body>\n</html>') |
| 78 | |
| 79 | |
| 80 | def parse_args(i_raw_args): |
| 81 | r""" |
| 82 | Parse the given list as command-line arguments and return an object with |
| 83 | the argument values. |
| 84 | |
| 85 | Description of argument(s): |
| 86 | i_raw_args A list of command-line arguments, usually taken from |
| 87 | sys.argv[1:]. |
| 88 | """ |
| 89 | |
| 90 | parser = argparse.ArgumentParser( |
| 91 | description="%(prog)s will create index files that can be displayed " |
| 92 | "as web pages in a given directory and all its " |
| 93 | "sub-directories.", |
| 94 | formatter_class=argparse.ArgumentDefaultsHelpFormatter) |
| 95 | parser.add_argument( |
| 96 | 'logs_dir_path', |
| 97 | help='Directory containing the logs that should be uploaded.') |
| 98 | parser.add_argument( |
| 99 | '--exclude', |
| 100 | nargs='+', |
| 101 | default=['.git', 'index.html'], |
| 102 | help='A space-delimited list of files to exclude from the index.' |
| 103 | ) |
| 104 | return parser.parse_args(i_raw_args) |
| 105 | |
| 106 | |
| 107 | if __name__ == '__main__': |
| 108 | main(sys.argv[1:]) |