blob: 7099b46e2956ede5a8b02e14a98ebc6aaa4ead8d [file] [log] [blame]
#!/usr/bin/env python3
"""Generate PIM rules for ipmi-fru-parser.
"""
import argparse
import os
import yaml
from mako.template import Template
tmpl = """
description: >
PIM rules for ipmi-fru-parser inventory objects.
events:
- name: Host off at startup
description: >
Mark ipmi-fru-parser inventory items as cached when
the host is off at startup.
type: startup
actions:
- name: setProperty
interface: ${cacheable_iface}
property: ${cacheable_property}
paths:
%for i in cacheable:
- ${i}
%endfor
value:
type: ${cacheable_type}
value: ${cacheable_cached}
- name: Host off event
description: >
Mark ipmi-fru-parser inventory items as cached when
the host goes away.
type: match
signatures:
- type: signal
interface: org.freedesktop.DBus.Properties
path: ${off_path}
member: PropertiesChanged
filters:
- name: propertyChangedTo
interface: ${off_iface}
property: ${off_property}
value:
value: ${off_value}
type: ${off_type}
actions:
- name: setProperty
interface: ${cacheable_iface}
property: ${cacheable_property}
paths:
%for i in cacheable:
- ${i}
%endfor
value:
type: ${cacheable_type}
value: ${cacheable_cached}
- name: Host on at startup
description: >
Remove ipmi-fru-parser inventory items when the host is finished
sending inventory items and the item is still marked as cached.
type: startup
filters:
- name: propertyIs
path: ${on_path}
interface: ${on_iface}
property: ${on_property}
value:
value: ${on_value}
type: ${on_type}
actions:
- name: destroyObjects
paths:
%for i in cacheable:
- ${i}
%endfor
conditions:
- name: propertyIs
interface: ${cacheable_iface}
property: ${cacheable_property}
value:
type: ${cacheable_type}
value: ${cacheable_cached}
- name: Host on event
description: >
Remove ipmi-fru-parser inventory items when the host is finished
sending inventory items and the item is still marked as cached.
type: match
signatures:
- type: signal
interface: org.freedesktop.DBus.Properties
path: ${on_path}
member: PropertiesChanged
filters:
- name: propertyChangedTo
interface: ${on_iface}
property: ${on_property}
value:
value: ${on_value}
type: ${on_type}
actions:
- name: destroyObjects
paths:
%for i in cacheable:
- ${i}
%endfor
conditions:
- name: propertyIs
interface: ${cacheable_iface}
property: ${cacheable_property}
value:
type: ${cacheable_type}
value: ${cacheable_cached}
"""
def get_cacheable_objs(yaml):
cacheable = []
for objdata in data.values():
if not isinstance(objdata, dict):
continue
for path, ifaces in objdata.items():
if not isinstance(ifaces, dict):
continue
if cacheable_iface_name in ifaces.keys():
cacheable.append(path)
return cacheable
if __name__ == "__main__":
script_dir = os.path.dirname(os.path.realpath(__file__))
parser = argparse.ArgumentParser(
description="ipmi-fru-parser PIM rule generator."
)
parser.add_argument(
"-o",
"--output-dir",
dest="outputdir",
default=".",
help="Output directory.",
)
parser.add_argument(
"inventory",
metavar="INVENTORY",
type=str,
help="Path to inventory YAML.",
)
args = parser.parse_args()
with open(args.inventory, "r") as fd:
data = yaml.safe_load(fd.read())
cacheable_iface_name = "xyz.openbmc_project.Inventory.Decorator.Cacheable"
target_file = os.path.join(args.outputdir, "ipmi-fru-rules.yaml")
cacheable = []
if isinstance(data, dict):
cacheable = get_cacheable_objs(data)
if cacheable:
with open(target_file, "w") as out:
out.write(
Template(tmpl).render(
cacheable_iface=cacheable_iface_name,
cacheable_property="Cached",
cacheable_cached="true",
cacheable_type="boolean",
on_path="/xyz/openbmc_project/state/host0",
on_iface="xyz.openbmc_project.State.Boot.Progress",
on_property="BootProgress",
on_value="xyz.openbmc_project.State.Boot.Progress.ProgressStages.OSStart",
on_type="string",
off_path="/xyz/openbmc_project/state/host0",
off_iface="xyz.openbmc_project.State.Host",
off_property="CurrentHostState",
off_value="xyz.openbmc_project.State.Host.Off",
off_type="string",
cacheable=cacheable,
)
)
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4