| #!/usr/bin/env python |
| |
| r""" |
| This script will parse the input error log yaml file and generate |
| a header file which will then be used by the error logging client and |
| server to collect and validate the error information generated by the |
| openbmc software components. |
| |
| This code uses a mako template to provide the basic template of the header |
| file we're going to generate. We then call it with information from the |
| yaml to generate the header file. |
| |
| """ |
| |
| from mako.template import Template |
| from optparse import OptionParser |
| import yaml |
| import sys |
| import os |
| |
| |
| def gen_elog_hpp(i_rootdir, i_elog_yaml, i_input_mako, i_output_hpp): |
| r""" |
| Read the input yaml file, grab the relevant data and call the mako |
| template to generate the header file. |
| |
| Description of arguments: |
| i_rootdir base directory to search for yaml files |
| i_elog_yaml yaml file describing the error logs |
| i_input_mako input mako template file to use |
| i_output_hpp header file to output the generated code to |
| """ |
| |
| # Input parameters to mako template |
| errors = dict() # Main error codes |
| error_msg = dict() # Error msg that corresponds to error code |
| error_lvl = dict() # Error code log level (debug, info, error, ...) |
| meta = list() # The meta data names associated (ERRNO, FILE_NAME, ...) |
| meta_data = dict() # The meta data info (type, format) |
| |
| # see elog.yaml for reference |
| ifile = yaml.safe_load(open("/".join((i_rootdir,i_elog_yaml)))) |
| err_count = 0 |
| for i in ifile: |
| # Grab the main error and it's info |
| errors[err_count] = i['name'] |
| error_msg[i['name']] = i['description'] |
| error_lvl[i['name']] = i['level'] |
| tmp_meta = [] |
| # grab all the meta data fields and info |
| for j in i['meta']: |
| str_short = j['str'].split('=')[0] |
| tmp_meta.append(str_short) |
| meta_data[str_short] = {} |
| meta_data[str_short]['str'] = j['str'] |
| meta_data[str_short]['str_short'] = str_short |
| meta_data[str_short]['type'] = j['type'] |
| meta.append(tmp_meta) |
| err_count += 1 |
| |
| # Debug |
| # for i in errors: |
| # print "ERROR: " + errors[i] |
| # print " MSG: " + error_msg[errors[i]] |
| # print " LVL: " + error_lvl[errors[i]] |
| # print " META: " |
| # print meta[i] |
| |
| # Load the mako template and call it with the required data |
| mytemplate = Template(filename=i_input_mako) |
| f = open(i_output_hpp, 'w') |
| f.write(mytemplate.render(errors=errors, error_msg=error_msg, |
| error_lvl=error_lvl, meta=meta, |
| meta_data=meta_data,elog_yaml=i_elog_yaml)) |
| f.close() |
| |
| |
| def main(i_args): |
| parser = OptionParser() |
| |
| parser.add_option("-e", "--elog", dest="elog_yaml", |
| default="xyz/openbmc_project/Example/Elog.errors.yaml", |
| help="input error yaml file to parse") |
| |
| parser.add_option("-m", "--mako", dest="elog_mako", |
| default="elog-gen-template.mako.hpp", |
| help="input mako template file to use") |
| |
| parser.add_option("-o", "--output", dest="output_hpp", |
| default="elog-gen.hpp", |
| help="output hpp to generate, elog-gen.hpp is default") |
| |
| parser.add_option("-r", "--rootdir", dest="rootdir", |
| default="example", |
| help="Base directory of yaml files to process") |
| |
| parser.add_option("-t", "--templatedir", dest="templatedir", |
| default="phosphor-logging/templates/", |
| help="Base directory of files to process") |
| |
| (options, args) = parser.parse_args(i_args) |
| |
| # Verify the input yaml file |
| yaml_path = "/".join((options.rootdir,options.elog_yaml)) |
| if (not (os.path.isfile(yaml_path))): |
| print "Can not find input yaml file " + yaml_path |
| exit(1) |
| |
| # Verify the input mako file |
| template_path = "/".join((options.templatedir,options.elog_mako)) |
| if (not (os.path.isfile(template_path))): |
| print "Can not find input template file " + template_path |
| exit(1) |
| |
| gen_elog_hpp(options.rootdir, |
| options.elog_yaml, |
| template_path, |
| options.output_hpp) |
| |
| # Only run if it's a script |
| if __name__ == '__main__': |
| main(sys.argv[1:]) |