xref: /openbmc/ipmi-fru-parser/scripts/fru_gen.py (revision 0b0e148717825d685bbb918812fce7ffa64d1025)
10968237bSPatrick Williams#!/usr/bin/env python3
20f2e7fe1SRatan Gupta
3c5c1737cSPatrick Williamsimport argparse
40f2e7fe1SRatan Guptaimport os
50f2e7fe1SRatan Guptaimport sys
6c5c1737cSPatrick Williams
70f2e7fe1SRatan Guptaimport yaml
80f2e7fe1SRatan Guptafrom mako.template import Template
90f2e7fe1SRatan Gupta
100f2e7fe1SRatan Gupta
116eed4032SRatan Guptadef generate_cpp(inventory_yaml, output_dir):
12545a5d33SPatrick Williams    with open(inventory_yaml, "r") as f:
130f2e7fe1SRatan Gupta        ifile = yaml.safe_load(f)
143d0ce84bSBrad Bishop        if not isinstance(ifile, dict):
153d0ce84bSBrad Bishop            ifile = {}
160f2e7fe1SRatan Gupta
170f2e7fe1SRatan Gupta        # Render the mako template
180f2e7fe1SRatan Gupta
19*0b0e1487SJayanth Othayoth        t = Template(filename=os.path.join(script_dir, "writefru.cpp.mako"))
200f2e7fe1SRatan Gupta
216eed4032SRatan Gupta        output_hpp = os.path.join(output_dir, "fru-gen.cpp")
22c5c1737cSPatrick Williams        with open(output_hpp, "w") as fd:
230f2e7fe1SRatan Gupta            fd.write(t.render(fruDict=ifile))
240f2e7fe1SRatan Gupta
250f2e7fe1SRatan Gupta
260f2e7fe1SRatan Guptadef main():
27c5c1737cSPatrick Williams    valid_commands = {"generate-cpp": generate_cpp}
280f2e7fe1SRatan Gupta    parser = argparse.ArgumentParser(
29c5c1737cSPatrick Williams        description="IPMI FRU parser and code generator"
30c5c1737cSPatrick Williams    )
310f2e7fe1SRatan Gupta
320f2e7fe1SRatan Gupta    parser.add_argument(
33c5c1737cSPatrick Williams        "-i",
34c5c1737cSPatrick Williams        "--inventory_yaml",
35c5c1737cSPatrick Williams        dest="inventory_yaml",
36c5c1737cSPatrick Williams        default="example.yaml",
37c5c1737cSPatrick Williams        help="input inventory yaml file to parse",
38c5c1737cSPatrick Williams    )
390f2e7fe1SRatan Gupta
400f2e7fe1SRatan Gupta    parser.add_argument(
41c5c1737cSPatrick Williams        "-o",
42c5c1737cSPatrick Williams        "--output-dir",
43c5c1737cSPatrick Williams        dest="outputdir",
440f2e7fe1SRatan Gupta        default=".",
45c5c1737cSPatrick Williams        help="output directory",
46c5c1737cSPatrick Williams    )
470f2e7fe1SRatan Gupta
480f2e7fe1SRatan Gupta    parser.add_argument(
49c5c1737cSPatrick Williams        "command",
50c5c1737cSPatrick Williams        metavar="COMMAND",
51c5c1737cSPatrick Williams        type=str,
520968237bSPatrick Williams        choices=list(valid_commands.keys()),
53c5c1737cSPatrick Williams        help="Command to run.",
54c5c1737cSPatrick Williams    )
550f2e7fe1SRatan Gupta
560f2e7fe1SRatan Gupta    args = parser.parse_args()
570f2e7fe1SRatan Gupta
58545a5d33SPatrick Williams    if not (os.path.isfile(args.inventory_yaml)):
590f2e7fe1SRatan Gupta        sys.exit("Can not find input yaml file " + args.inventory_yaml)
600f2e7fe1SRatan Gupta
610f2e7fe1SRatan Gupta    function = valid_commands[args.command]
620f2e7fe1SRatan Gupta    function(args.inventory_yaml, args.outputdir)
630f2e7fe1SRatan Gupta
64c5c1737cSPatrick Williams
65c5c1737cSPatrick Williamsif __name__ == "__main__":
660f2e7fe1SRatan Gupta    script_dir = os.path.dirname(os.path.realpath(__file__))
670f2e7fe1SRatan Gupta    main()
68