summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/gen_pimrules.py183
1 files changed, 183 insertions, 0 deletions
diff --git a/scripts/gen_pimrules.py b/scripts/gen_pimrules.py
new file mode 100755
index 0000000..729f095
--- /dev/null
+++ b/scripts/gen_pimrules.py
@@ -0,0 +1,183 @@
+#!/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='/org/openbmc/sensors/BootProgress',
+ on_iface='org.openbmc.SensorValue',
+ on_property='value',
+ on_value='FW Progress, Starting OS',
+ 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
OpenPOWER on IntegriCloud