Beispiel #1
0
def _parse_output(output, template):
    """Parse the return value of IPMI command into dict

    :param output: output of the execution of IPMI command
    :param template: a dict that contains the expected items of
                         IPMI command and its length.
    """
    ret = {}
    index = 0
    if not (output and template):
        return ret

    if "translate" in template:
        ret = _translate_output(output)
    else:
        output_list = output.strip().split(' ')
        if sum(template.values()) != len(output_list):
            raise ipmiexcept.IPMIException(
                _("ipmitool output "
                  "length mismatch"))
        for item in template.items():
            index_end = index + item[1]
            update_value = output_list[index:index_end]
            ret[item[0]] = update_value
            index = index_end
    return ret
Beispiel #2
0
def _translate_output(output):
    """Translate the return value into JSON dict

    :param output: output of the execution of IPMI command(sensor reading)
    """
    sensors_data_dict = {}

    sensors_data_array = output.split('\n\n')
    for sensor_data in sensors_data_array:
        sensor_data_dict = _process_sensor(sensor_data)
        if not sensor_data_dict:
            continue

        sensor_type = _get_sensor_type(sensor_data_dict)

        # ignore the sensors which have no current 'Sensor Reading' data
        sensor_id = sensor_data_dict['Sensor ID']
        if 'Sensor Reading' in sensor_data_dict:
            sensors_data_dict.setdefault(sensor_type,
                                         {})[sensor_id] = sensor_data_dict

    # get nothing, no valid sensor data
    if not sensors_data_dict:
        raise ipmiexcept.IPMIException(
            _("parse IPMI sensor data failed,"
              "No data retrieved from given input"))
    return sensors_data_dict
Beispiel #3
0
 def _execute(self, **kwargs):
     args = ['ipmitool']
     command = f(self, **kwargs)
     args.extend(command.split(" "))
     try:
         (out, __) = utils.execute(*args, run_as_root=True)
     except processutils.ProcessExecutionError:
         raise ipmiexcept.IPMIException(_("running ipmitool failure"))
     return _parse_output(out, template)
Beispiel #4
0
def _get_sensor_type(sensor_data_dict):
    # Have only three sensor type name IDs: 'Sensor Type (Analog)'
    # 'Sensor Type (Discrete)' and 'Sensor Type (Threshold)'

    for key in ('Sensor Type (Analog)', 'Sensor Type (Discrete)',
                'Sensor Type (Threshold)'):
        try:
            return sensor_data_dict[key].split(' ', 1)[0]
        except KeyError:
            continue

    raise ipmiexcept.IPMIException(_("parse IPMI sensor data failed,"
                                     "unknown sensor type"))
Beispiel #5
0
    def read_sensor_any(self, sensor_type=''):
        """Get the sensor data for type."""
        if not self.ipmi_support:
            return {}

        mapping = {
            '': self._read_sensor_all,
            'Temperature': self._read_sensor_temperature,
            'Fan': self._read_sensor_fan,
            'Voltage': self._read_sensor_voltage,
            'Current': self._read_sensor_current
        }

        try:
            return mapping[sensor_type]()
        except KeyError:
            raise ipmiexcept.IPMIException(_('Wrong sensor type'))