| #!/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 |