#!/usr/bin/env python '''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.itervalues(): if not isinstance(objdata, dict): continue for path, ifaces in objdata.iteritems(): 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