diff --git a/README.md b/README.md index c1aba22..57b0347 100644 --- a/README.md +++ b/README.md @@ -201,6 +201,41 @@ $ xe host-call-plugin host-uuid= plugin=hyperthreading.py fn=get_hyperthre true ``` +## Ipmitool + +A xapi plugin that uses `ipmitool` to get information about sensors and the ipmi server. + +### get sensor data + +Returns a JSON containing all sensor data repository entries and readings. +``` +$ xe host-call-plugin host-uuid= plugin=ipmitool.py fn=get_all_sensors +[ + {"name": "Fan1A", "value": "10920 RPM", "event": "ok"}, + {"name": "Fan2A", "value": "10800 RPM", "event": "ok"}, + {"name": "Inlet Temp", "value": "23 degrees C", "event": "ok"}, + {"name": "Exhaust Temp", "value": "28 degrees C", "event": "ok"}, + {"name": "Temp", "value": "38 degrees C", "event": "ok"} +] +``` + +### get sensor details + +Returns a JSON containing detailed information about sensor passed as paramaters. The name of the sensor can be found +by running the `get_all_sensors` before. +``` +$ xe host-call-plugin host-uuid= plugin=ipmitool.py fn=get_sensor args:sensors="Fan1A,Inlet Temp" +...TODO... +``` + +### get the IP address of the IPMI server + +Returns a string with the IP of the IPMI server or an empty string if it is not found. +``` +$ xe host-call-plugin host-uuid= plugin=ipmitool.py fn=get_ipmi_ip +1.2.3.4 +``` + ## Tests To run the plugins' unit tests you'll need to install `pytest`, `pyfakefs` and `mock`. diff --git a/SOURCES/etc/xapi.d/plugins/ipmitool.py b/SOURCES/etc/xapi.d/plugins/ipmitool.py new file mode 100755 index 0000000..1c2791d --- /dev/null +++ b/SOURCES/etc/xapi.d/plugins/ipmitool.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import json +import sys +import XenAPIPlugin + +sys.path.append('.') +from xcpngutils import configure_logging, run_command, error_wrapped + +@error_wrapped +def sensor_data(session, args): + sensor_data = [] + output = run_command(["ipmitool", "sdr", "list"]) + + for line in output['stdout'].splitlines(): + sensor_fields = line.split('|') + sensor = { + 'name': sensor_fields[0].strip(), + 'value': sensor_fields[1].strip(), + 'event': sensor_fields[2].strip(), + } + sensor_data.append(sensor) + + return json.dumps(sensor_data) + +@error_wrapped +def sensor_info(session, args): + sensors = args.get('sensors') + if not sensors: + return '{}' + + return "Not yet implemented" + +@error_wrapped +def ipmi_ip(session, args): + ip_addr = "" + output = run_command(["ipmitool", "lan", "print"]) + + for line in output['stdout'].splitlines(): + if "IP Address" in line and "Source" not in line: + ip_addr = line.split(":")[1].strip() + break + + return ip_addr + +_LOGGER = configure_logging('ipmitool-xapi-plugin') +if __name__ == "__main__": + XenAPIPlugin.dispatch({ + 'get_all_sensors': sensor_data, + 'get_sensor': sensor_info, + 'get_ipmi_ip': ipmi_ip, + })