Add Fii-oem-ipmi command
Signed-off-by: Mohaimen Alsamarai <mohaimen.alsamarai@fii-na.com>
Change-Id: I6026b28564ad9c689347aac19d41234c150ebb67
diff --git a/generate-whitelist.py b/generate-whitelist.py
new file mode 100755
index 0000000..c732726
--- /dev/null
+++ b/generate-whitelist.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python3
+
+import re, sys, os.path
+
+def usage():
+ sys.stderr.write("Usage: $0 whitelist-config-in whitelist-header-out\n")
+ sys.stderr.write(" Reads in whitelist config, sorting the contents\n")
+ sys.stderr.write(" and outputs a header file\n")
+ sys.exit(-1)
+
+class Error(Exception):
+ pass
+
+class DuplicateEntry(Error):
+ def __init__(self, e):
+ super(Error, self).__init__(
+ "Multiple entries with matching netfn/cmd found ({})".format(e))
+
+class ParseError(Error):
+ def __init__(self, d):
+ super(Error, self).__init__("Parse error at: '{}'".format(d))
+
+class entry:
+ linere = re.compile(
+ r'(0x[0-9a-f]{2}):(0x[0-9a-f]{2})((:(0x[0-9a-f]{4}))?)\s*((//\s*(.*))?)',
+ re.I
+ )
+ def __init__(self, data):
+ # parse data line into values:
+ # type 1, two values: netfn, cmd
+ # type 2, three values: netfn, cmd, channels
+ try:
+ m = self.linere.fullmatch(data).groups()
+ except:
+ raise ParseError(data)
+ self.netfn = int(m[0], 16)
+ self.cmd = int(m[1], 16)
+ if m[4] is not None:
+ self.channels = int(m[4], 16)
+ else:
+ # if no channel was provided, default to previous behavior, which
+ # is allow all interfaces, including the system interface (ch 15)
+ self.channels = 0xffff
+ if m[6] is not None:
+ self.comment = "// " + m[7]
+ else:
+ self.comment = "//"
+ def __str__(self):
+ return " ".join([ '{',
+ "0x{0.netfn:02x},".format(self),
+ "0x{0.cmd:02x},".format(self),
+ "0x{0.channels:04x}".format(self),
+ "},",
+ "{0.comment}".format(self),
+ ])
+ def __lt__(self, other):
+ if self.netfn == other.netfn:
+ return self.cmd < other.cmd
+ return self.netfn < other.netfn
+ def match(self, other):
+ return (self.netfn == other.netfn) and (self.cmd == other.cmd)
+
+def parse(config):
+ entries = []
+ with open(config) as f:
+ for line in f:
+ line = line.strip()
+ if len(line) == 0 or line[0] == '#':
+ continue
+ e = entry(line)
+ if any([e.match(item) for item in entries]):
+ d = DuplicateEntry(e)
+ sys.stderr.write("WARNING: {}\n".format(d))
+ else:
+ entries.append(e)
+ entries.sort()
+ return entries
+
+def output(entries, hppfile):
+ lines = [
+ "#pragma once",
+ "",
+ "// AUTOGENERATED FILE; DO NOT MODIFY",
+ "",
+ "#include <array>",
+ "#include <tuple>",
+ "",
+ "using netfncmd_tuple = std::tuple<unsigned char, unsigned char, unsigned short>;",
+ "",
+ "constexpr const std::array<netfncmd_tuple, {}> whitelist = ".format(
+ len(entries)),
+ "{{"
+ ]
+ lines.extend([' {}'.format(e) for e in entries])
+ lines.append("}};\n");
+
+ with open(hppfile, "w") as hpp:
+ hpp.write("\n".join(lines))
+
+
+if __name__ == "__main__":
+ if len(sys.argv) != 3:
+ usage()
+ config = sys.argv[1]
+ header = sys.argv[2]
+ entries = parse(config)
+ output(entries, header)