Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | |
| 3 | r""" |
| 4 | This script will parse the input error log yaml file and generate |
| 5 | a header file which will then be used by the error logging client and |
| 6 | server to collect and validate the error information generated by the |
| 7 | openbmc software components. |
| 8 | |
| 9 | This code uses a mako template to provide the basic template of the header |
| 10 | file we're going to generate. We then call it with information from the |
| 11 | yaml to generate the header file. |
| 12 | |
| 13 | """ |
| 14 | |
| 15 | from mako.template import Template |
| 16 | from optparse import OptionParser |
| 17 | import yaml |
| 18 | import sys |
| 19 | import os |
| 20 | |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 21 | |
| 22 | def gen_elog_hpp(i_elog_yaml, i_input_mako, i_output_hpp): |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 23 | r""" |
| 24 | Read the input yaml file, grab the relevant data and call the mako |
| 25 | template to generate the header file. |
| 26 | |
| 27 | Description of arguments: |
| 28 | i_elog_yaml yaml file describing the error logs |
| 29 | i_output_hpp header file to output the generated code to |
| 30 | """ |
| 31 | |
| 32 | # Input parameters to mako template |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 33 | errors = dict() # Main error codes |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 34 | error_msg = dict() # Error msg that corresponds to error code |
| 35 | error_lvl = dict() # Error code log level (debug, info, error, ...) |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 36 | meta = list() # The meta data names associated (ERRNO, FILE_NAME, ...) |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 37 | meta_data = dict() # The meta data info (type, format) |
| 38 | |
| 39 | # see elog.yaml for reference |
| 40 | ifile = yaml.safe_load(open(i_elog_yaml)) |
Andrew Geissler | df048c1 | 2016-11-10 16:50:35 -0600 | [diff] [blame] | 41 | err_count = 0 |
Andrew Geissler | 5e81bfb | 2016-11-21 12:49:01 -0600 | [diff] [blame] | 42 | for i in ifile: |
Andrew Geissler | df048c1 | 2016-11-10 16:50:35 -0600 | [diff] [blame] | 43 | # Grab the main error and it's info |
| 44 | errors[err_count] = i['name'] |
Andrew Geissler | 5e81bfb | 2016-11-21 12:49:01 -0600 | [diff] [blame] | 45 | error_msg[i['name']] = i['description'] |
Andrew Geissler | df048c1 | 2016-11-10 16:50:35 -0600 | [diff] [blame] | 46 | error_lvl[i['name']] = i['level'] |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 47 | tmp_meta = [] |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 48 | # grab all the meta data fields and info |
Andrew Geissler | df048c1 | 2016-11-10 16:50:35 -0600 | [diff] [blame] | 49 | for j in i['meta']: |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 50 | str_short = j['str'].split('=')[0] |
| 51 | tmp_meta.append(str_short) |
| 52 | meta_data[str_short] = {} |
| 53 | meta_data[str_short]['str'] = j['str'] |
| 54 | meta_data[str_short]['str_short'] = str_short |
| 55 | meta_data[str_short]['type'] = j['type'] |
| 56 | meta.append(tmp_meta) |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 57 | err_count += 1 |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 58 | |
| 59 | # Debug |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 60 | # for i in errors: |
Andrew Geissler | df048c1 | 2016-11-10 16:50:35 -0600 | [diff] [blame] | 61 | # print "ERROR: " + errors[i] |
| 62 | # print " MSG: " + error_msg[errors[i]] |
| 63 | # print " LVL: " + error_lvl[errors[i]] |
| 64 | # print " META: " |
| 65 | # print meta[i] |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 66 | |
| 67 | # Load the mako template and call it with the required data |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 68 | mytemplate = Template(filename=i_input_mako) |
| 69 | f = open(i_output_hpp, 'w') |
| 70 | f.write(mytemplate.render(errors=errors, error_msg=error_msg, |
| 71 | error_lvl=error_lvl, meta=meta, |
| 72 | meta_data=meta_data)) |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 73 | f.close() |
| 74 | |
| 75 | |
| 76 | def main(i_args): |
| 77 | parser = OptionParser() |
| 78 | |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 79 | parser.add_option("-e", "--elog", dest="elog_yaml", default="elog.yaml", |
Andrew Geissler | df048c1 | 2016-11-10 16:50:35 -0600 | [diff] [blame] | 80 | help="input error yaml file to parse") |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 81 | |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 82 | parser.add_option("-m", "--mako", dest="elog_mako", |
| 83 | default="elog-gen-template.mako.hpp", |
Andrew Geissler | df048c1 | 2016-11-10 16:50:35 -0600 | [diff] [blame] | 84 | help="input mako template file to use") |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 85 | |
| 86 | parser.add_option("-o", "--output", dest="output_hpp", |
| 87 | default="elog-gen.hpp", |
Andrew Geissler | df048c1 | 2016-11-10 16:50:35 -0600 | [diff] [blame] | 88 | help="output hpp to generate, elog-gen.hpp is default") |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 89 | |
| 90 | (options, args) = parser.parse_args(i_args) |
| 91 | |
| 92 | if (not (os.path.isfile(options.elog_yaml))): |
| 93 | print "Can not find input yaml file " + options.elog_yaml |
Andrew Geissler | df048c1 | 2016-11-10 16:50:35 -0600 | [diff] [blame] | 94 | exit(1) |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 95 | |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 96 | gen_elog_hpp(options.elog_yaml, options.elog_mako, |
| 97 | options.output_hpp) |
Andrew Geissler | c830e0f | 2016-10-18 12:51:29 -0500 | [diff] [blame] | 98 | |
| 99 | # Only run if it's a script |
| 100 | if __name__ == '__main__': |
Andrew Geissler | 184690d | 2016-11-03 08:06:31 -0500 | [diff] [blame] | 101 | main(sys.argv[1:]) |