blob: 7a0e4791f389fd9f881d1d2df7f6704f0f72a779 [file] [log] [blame]
#!/usr/bin/env python3
'''Generate PIM rules for ipmi-fru-parser.
'''
import argparse
import os
import sys
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