def _fetch_ipmi_sensors_section(self, connection): self._logger.debug("Fetching sensor data via UDP from %s:623" % (self._ipaddress)) try: sdr = ipmi_sdr.SDR(connection) except NotImplementedError as e: self._logger.verbose("Failed to fetch sensor data: %r" % e) self._logger.debug("Exception", exc_info=e) return "" sensors = [] for number in sdr.get_sensor_numbers(): rsp = connection.raw_command(command=0x2d, netfn=4, data=(number, )) if 'error' in rsp: continue reading = sdr.sensors[number].decode_sensor_reading(rsp['data']) if reading is not None: sensors.append(self._parse_sensor_reading(number, reading)) output = "<<<mgmt_ipmi_sensors:sep(124)>>>\n" \ + "".join([ "|".join(sensor) + "\n" for sensor in sensors ]) return output
def _sensors_section(self) -> AgentRawData: if self._command is None: raise MKFetcherError("Not connected") self._logger.debug("Fetching sensor data via UDP from %s:623", self._command.bmc) try: sdr = ipmi_sdr.SDR(self._command) except NotImplementedError as e: self._logger.log(VERBOSE, "Failed to fetch sensor data: %r", e) self._logger.debug("Exception", exc_info=True) return b"" sensors = [] has_no_gpu = not self._has_gpu() for ident in sdr.get_sensor_numbers(): sensor = sdr.sensors[ident] rsp = self._command.raw_command(command=0x2d, netfn=4, rslun=sensor.sensor_lun, data=(sensor.sensor_number,)) if 'error' in rsp: continue reading = sensor.decode_sensor_reading(rsp['data']) if reading is not None: # sometimes (wrong) data for GPU sensors is reported, even if # not installed if "GPU" in reading.name and has_no_gpu: continue sensors.append(IPMIFetcher._parse_sensor_reading(sensor.sensor_number, reading)) return b"<<<mgmt_ipmi_sensors:sep(124)>>>\n" + b"".join( [b"|".join(sensor) + b"\n" for sensor in sensors])
def _fetch_ipmi_sensors_section(self, connection): # type: (ipmi_cmd.Command) -> RawAgentData self._logger.debug("Fetching sensor data via UDP from %s:623" % (self._ipaddress)) try: sdr = ipmi_sdr.SDR(connection) except NotImplementedError as e: self._logger.log(VERBOSE, "Failed to fetch sensor data: %r", e) self._logger.debug("Exception", exc_info=True) return b"" sensors = [] has_no_gpu = not self._has_gpu(connection) for number in sdr.get_sensor_numbers(): rsp = connection.raw_command(command=0x2d, netfn=4, data=(number, )) if 'error' in rsp: continue reading = sdr.sensors[number].decode_sensor_reading(rsp['data']) if reading is not None: # sometimes (wrong) data for GPU sensors is reported, even if # not installed if "GPU" in reading.name and has_no_gpu: continue sensors.append(self._parse_sensor_reading(number, reading)) return b"<<<mgmt_ipmi_sensors:sep(124)>>>\n" + b"".join( [b"|".join(sensor) + b"\n" for sensor in sensors])
def _fetch_ipmi_sensors_section(self, connection): self._logger.debug("Fetching sensor data via UDP from %s:623" % (self._ipaddress)) try: sdr = ipmi_sdr.SDR(connection) except NotImplementedError as e: self._logger.verbose("Failed to fetch sensor data: %r" % e) self._logger.debug("Exception", exc_info=e) return "" sensors = [] for number in sdr.get_sensor_numbers(): rsp = connection.raw_command(command=0x2d, netfn=4, data=(number, )) if 'error' in rsp: continue reading = sdr.sensors[number].decode_sensor_reading(rsp['data']) if reading is None: continue # {'states': [], 'health': 0, 'name': 'CPU1 Temp', 'imprecision': 0.5, # 'units': '\xc2\xb0C', 'state_ids': [], 'type': 'Temperature', # 'value': 25.0, 'unavailable': 0}]] health_txt = "N/A" if reading.health >= ipmi_const.Health.Failed: health_txt = "FAILED" elif reading.health >= ipmi_const.Health.Critical: health_txt = "CRITICAL" elif reading.health >= ipmi_const.Health.Warning: health_txt = "WARNING" # workaround for pyghmi bug: https://bugs.launchpad.net/pyghmi/+bug/1790120 health_txt = _handle_false_positive_warnings(reading) elif reading.health == ipmi_const.Health.Ok: health_txt = "OK" parts = [ "%d" % number, reading.name, reading.type, ("%0.2f" % reading.value) if reading.value else "N/A", reading.units if reading.units != "\xc2\xb0C" else "C", health_txt, ] sensors.append(parts) output = "<<<mgmt_ipmi_sensors:sep(124)>>>\n" \ + "".join([ "|".join(sensor) + "\n" for sensor in sensors ]) return output
def get_sensor_descriptions(self): """Get available sensor names Iterates over the available sensor descriptions :returns: Iterator of dicts describing each sensor """ if self._sdr is None: self._sdr = sdr.SDR(self) for sensor in self._sdr.get_sensor_numbers(): yield { 'name': self._sdr.sensors[sensor].name, 'type': self._sdr.sensors[sensor].sensor_type }
def get_sensor_data(self): """Get sensor reading objects Iterates sensor reading objects pertaining to the currently managed BMC. :returns: Iterator of sdr.SensorReading objects """ if self._sdr is None: self._sdr = sdr.SDR(self) for sensor in self._sdr.get_sensor_numbers(): rsp = self.raw_command(command=0x2d, netfn=4, data=(sensor, )) if 'error' in rsp: if rsp['code'] == 203: # Sensor does not exist, optional dev continue raise exc.IpmiException(rsp['error'], code=rsp['code']) yield self._sdr.sensors[sensor].decode_sensor_reading(rsp['data'])
def get_sensor_reading(self, sensorname): """Get a sensor reading by name Returns a single decoded sensor reading per the name passed in :param sensorname: Name of the desired sensor :returns: sdr.SensorReading object """ if self._sdr is None: self._sdr = sdr.SDR(self) for sensor in self._sdr.get_sensor_numbers(): if self._sdr.sensors[sensor].name == sensorname: rsp = self.raw_command(command=0x2d, netfn=4, data=(sensor, )) if 'error' in rsp: raise exc.IpmiException(rsp['error'], rsp['code']) return self._sdr.sensors[sensor].decode_sensor_reading( rsp['data']) raise Exception('Sensor not found: ' + sensorname)