xref: /openbmc/openbmc-build-scripts/scripts/generate-html-index.py (revision 69560bf665aa5a908a959bdaac3181b89ce58021)
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:])