コード例 #1
0
    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
コード例 #2
0
    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])
コード例 #3
0
    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])
コード例 #4
0
    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
コード例 #5
0
    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
            }
コード例 #6
0
    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'])
コード例 #7
0
    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)