From a5e813318a6a9d8b7d16a4bd2bc5e6d3089badf6 Mon Sep 17 00:00:00 2001 From: Duncan Laurie Date: Tue, 6 Jan 2004 01:43:10 +0000 Subject: [PATCH] add support for verbose sdr output in CSV mode and add some fields, fix sdr_convert_sensor_reading to properly handle signed values --from Fredrik Ohrn --- ipmitool/include/ipmitool/ipmi_sdr.h | 13 ++ ipmitool/lib/ipmi_sdr.c | 191 ++++++++++++++++++--------- 2 files changed, 139 insertions(+), 65 deletions(-) diff --git a/ipmitool/include/ipmitool/ipmi_sdr.h b/ipmitool/include/ipmitool/ipmi_sdr.h index 08f0684..dc89c5f 100644 --- a/ipmitool/include/ipmitool/ipmi_sdr.h +++ b/ipmitool/include/ipmitool/ipmi_sdr.h @@ -368,6 +368,19 @@ static const char * unit_desc[] __attribute__((unused)) = { "error", "correctable error", "uncorrectable error", }; +/* sensor type codes (IPMI v1.5 table 36.3) */ +#define SENSOR_TYPE_MAX 0x29 +static const char * sensor_type_desc[] __attribute__((unused)) = { + "reserved", + "Temperature", "Voltage", "Current", "Fan", "Physical Security", "Platform Security Violation Attempt", + "Processor", "Power Supply", "Power Unit", "Cooling Device", "Other", "Memory", "Drive Slot / Bay", + "POST Memory Resize", "System Firmware Progress", "Event Logging Disabled", "Watchdog", "System Event", + "Critical Interrupt", "Button", "Module / Board", "Microcontroller / Coprocessor", "Add-in Card", + "Chassis", "Chip Set", "Other FRU", "Cable / Interconnect", "Terminator", "System Boot Initiated", + "Boot Error", "OS Boot", "OS Critical Stop", "Slot / Connector", "System ACPI Power State", "Watchdog", + "Platform Alert", "Entity Presence", "Monitor ASIC / IC", "LAN", "Management Subsystem Health", "Battery" +}; + struct ipmi_sdr_iterator * ipmi_sdr_start(struct ipmi_intf * intf); struct sdr_get_rs * ipmi_sdr_get_next_header(struct ipmi_intf * intf, struct ipmi_sdr_iterator * i); unsigned char * ipmi_sdr_get_record(struct ipmi_intf * intf, struct sdr_get_rs * header, struct ipmi_sdr_iterator * i); diff --git a/ipmitool/lib/ipmi_sdr.c b/ipmitool/lib/ipmi_sdr.c index 81d7c4b..ae9812c 100644 --- a/ipmitool/lib/ipmi_sdr.c +++ b/ipmitool/lib/ipmi_sdr.c @@ -65,7 +65,19 @@ sdr_convert_sensor_reading(struct sdr_record_full_sensor * sensor, unsigned char k1 = __TO_B_EXP(sensor->bacc); k2 = __TO_R_EXP(sensor->bacc); - return (float)(((m * val) + (b * pow(10, k1))) * pow(10, k2)); + switch (sensor->unit.analog) + { + case 0: + return (float)(((m * val) + (b * pow(10, k1))) * pow(10, k2)); + case 1: + if (val & 0x80) val ++; + /* Deliberately fall through to case 2. */ + case 2: + return (float)(((m * (signed char)val) + (b * pow(10, k1))) * pow(10, k2)); + default: + /* Ops! This isn't an analog sensor. */ + return 0; + } } #define READING_UNAVAILABLE 0x20 @@ -93,6 +105,18 @@ ipmi_sdr_get_sensor_reading(struct ipmi_intf * intf, unsigned char sensor) return rsp; } +static const char * +ipmi_sdr_get_sensor_type_desc(const unsigned char type) +{ + if (type <= SENSOR_TYPE_MAX) + return sensor_type_desc[type]; + + if (type < 0xc0) + return "reserved"; + + return "OEM reserved"; +} + static const char * ipmi_sdr_get_status(unsigned char stat) { @@ -249,84 +273,121 @@ ipmi_sdr_print_sensor_full(struct ipmi_intf * intf, } } - if (!verbose) { + if (csv_output) + { /* - * print sensor name, reading, state + * print sensor name, reading, unit, state */ - if (csv_output) - printf("%s,", - sensor->id_code ? desc : NULL); + printf("%s,", sensor->id_code ? desc : NULL); + + if (validread) + printf("%.*f,", (val==(int)val) ? 0 : 3, val); else + printf(","); + + printf("%s,%s", + do_unit ? unitstr : "", + ipmi_sdr_get_status(rsp->data[2])); + + if (verbose) + { + printf(",%d.%d,%s,%s,", + sensor->entity.id, sensor->entity.instance, + val2str(sensor->entity.id, entity_id_vals), + ipmi_sdr_get_sensor_type_desc(sensor->sensor.type)); + +#define CSV_PRINT_HELPER(flag,value) \ + if(flag) printf("%.3f,", sdr_convert_sensor_reading(sensor, value)); else printf(","); + + CSV_PRINT_HELPER(sensor->analog_flag.nominal_read, sensor->nominal_read); + CSV_PRINT_HELPER(sensor->analog_flag.normal_min, sensor->normal_min); + CSV_PRINT_HELPER(sensor->analog_flag.normal_max, sensor->normal_max); + CSV_PRINT_HELPER(sensor->mask.threshold.set & 0x20, sensor->threshold.upper.non_recover); + CSV_PRINT_HELPER(sensor->mask.threshold.set & 0x10, sensor->threshold.upper.critical); + CSV_PRINT_HELPER(sensor->mask.threshold.set & 0x08, sensor->threshold.upper.non_critical); + CSV_PRINT_HELPER(sensor->mask.threshold.set & 0x04, sensor->threshold.lower.non_recover); + CSV_PRINT_HELPER(sensor->mask.threshold.set & 0x02, sensor->threshold.lower.critical); + CSV_PRINT_HELPER(sensor->mask.threshold.set & 0x01, sensor->threshold.lower.non_critical); + + printf ("%.3f,%.3f", + sdr_convert_sensor_reading(sensor, sensor->sensor_min), + sdr_convert_sensor_reading(sensor, sensor->sensor_max)); + } + printf("\n"); + } + else + { + if (!verbose) + { + /* + * print sensor name, reading, state + */ printf("%-16s | ", sensor->id_code ? desc : NULL); - memset(sval, 0, sizeof(sval)); - if (validread) { - i += snprintf(sval, sizeof(sval), "%.*f", - (val==(int)val) ? 0 : 3, val); - } else { - i += snprintf(sval, sizeof(sval), "no reading"); + i = 0; + memset(sval, 0, sizeof(sval)); + if (validread) { + i += snprintf(sval, sizeof(sval), "%.*f %s", + (val==(int)val) ? 0 : 3, val, + do_unit ? unitstr : ""); + } else { + i += snprintf(sval, sizeof(sval), "no reading "); + } + printf("%s", sval); + i--; - } - printf("%s", sval); - - if (csv_output) - printf(","); - - if (validread) { - if (!csv_output) - printf(" "); - if (do_unit) - printf("%s", unitstr); - } - - if (csv_output) - printf(","); - else { for (; idata[2])); + printf("\n"); } - - printf("%s", ipmi_sdr_get_status(rsp->data[2])); - printf("\n"); - } - else { - printf("Sensor ID : %s (0x%x)\n", - sensor->id_code ? desc : NULL, sensor->keys.sensor_num); - printf("Entity ID : %d.%d (%s)\n", - sensor->entity.id, sensor->entity.instance, - val2str(sensor->entity.id, entity_id_vals)); - - printf("Sensor Reading : "); - if (validread) - printf("%.*f %s\n", (val==(int)val) ? 0 : 3, val, unitstr); else - printf("not present\n"); + { + printf("Sensor ID : %s (0x%x)\n", + sensor->id_code ? desc : NULL, sensor->keys.sensor_num); + printf("Entity ID : %d.%d (%s)\n", + sensor->entity.id, sensor->entity.instance, + val2str(sensor->entity.id, entity_id_vals)); - printf("Status : %s\n", - ipmi_sdr_get_status(rsp->data[2])); + printf("Sensor Type : %s\n", ipmi_sdr_get_sensor_type_desc(sensor->sensor.type)); - printf("Nominal Reading : %.3f\n", - sdr_convert_sensor_reading(sensor, sensor->nominal_read)); - printf("Normal Minimum : %.3f\n", - sdr_convert_sensor_reading(sensor, sensor->normal_min)); - printf("Normal Maximum : %.3f\n", - sdr_convert_sensor_reading(sensor, sensor->normal_max)); + printf("Sensor Reading : "); + if (validread) + printf("%.*f %s\n", (val==(int)val) ? 0 : 3, val, unitstr); + else + printf("not present\n"); - printf("Upper non-recoverable : %.3f\n", - sdr_convert_sensor_reading(sensor, sensor->threshold.upper.non_recover)); - printf("Upper critical : %.3f\n", - sdr_convert_sensor_reading(sensor, sensor->threshold.upper.critical)); - printf("Upper non-critical : %.3f\n", - sdr_convert_sensor_reading(sensor, sensor->threshold.upper.non_critical)); - printf("Lower non-recoverable : %.3f\n", - sdr_convert_sensor_reading(sensor, sensor->threshold.lower.non_recover)); - printf("Lower critical : %.3f\n", - sdr_convert_sensor_reading(sensor, sensor->threshold.lower.critical)); - printf("Lower non-critical : %.3f\n", - sdr_convert_sensor_reading(sensor, sensor->threshold.lower.non_critical)); - printf("\n"); + printf("Status : %s\n", + ipmi_sdr_get_status(rsp->data[2])); + + printf("Nominal Reading : %.3f\n", + sdr_convert_sensor_reading(sensor, sensor->nominal_read)); + printf("Normal Minimum : %.3f\n", + sdr_convert_sensor_reading(sensor, sensor->normal_min)); + printf("Normal Maximum : %.3f\n", + sdr_convert_sensor_reading(sensor, sensor->normal_max)); + + printf("Upper non-recoverable : %.3f\n", + sdr_convert_sensor_reading(sensor, sensor->threshold.upper.non_recover)); + printf("Upper critical : %.3f\n", + sdr_convert_sensor_reading(sensor, sensor->threshold.upper.critical)); + printf("Upper non-critical : %.3f\n", + sdr_convert_sensor_reading(sensor, sensor->threshold.upper.non_critical)); + printf("Lower non-recoverable : %.3f\n", + sdr_convert_sensor_reading(sensor, sensor->threshold.lower.non_recover)); + printf("Lower critical : %.3f\n", + sdr_convert_sensor_reading(sensor, sensor->threshold.lower.critical)); + printf("Lower non-critical : %.3f\n", + sdr_convert_sensor_reading(sensor, sensor->threshold.lower.non_critical)); + printf("Minimum sensor range : %.3f\n", + sdr_convert_sensor_reading(sensor, sensor->sensor_min)); + printf("Maximum sensor range : %.3f\n", + sdr_convert_sensor_reading(sensor, sensor->sensor_max)); + printf("\n"); + } } } @@ -360,8 +421,8 @@ ipmi_sdr_print_sensor_compact(struct ipmi_intf * intf, printf("Entity ID : %d.%d (%s)\n", sensor->entity.id, sensor->entity.instance, val2str(sensor->entity.id, entity_id_vals)); + printf("Sensor Type : %s\n", ipmi_sdr_get_sensor_type_desc(sensor->sensor.type)); if (verbose > 1) { - printf("Sensor Type Code : 0x%02x\n", sensor->sensor.type); printf("Event Type Code : 0x%02x\n", sensor->event_type); printbuf(rsp->data, rsp->data_len, "COMPACT SENSOR READING"); }