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