| #!/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:]) |