diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2022-10-30 18:12:02 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2022-10-30 18:12:02 +0100 |
commit | 1f3c9b4ae26ce1d46d954d509b83b8684ada5625 (patch) | |
tree | 260b922ec4d5d153cc6db745e27931cfd464472f /lib/ipmi_sensor.c | |
parent | 8fcf0ba6f182918bd584bb80bf0b8998acad26a8 (diff) | |
parent | 8b758ee941f4c1ffea0532caa74b1fcd8101d1d8 (diff) |
Merge branch 'release/debian/1.8.19-1'debian/1.8.19-1
Diffstat (limited to 'lib/ipmi_sensor.c')
-rw-r--r-- | lib/ipmi_sensor.c | 390 |
1 files changed, 233 insertions, 157 deletions
diff --git a/lib/ipmi_sensor.c b/lib/ipmi_sensor.c index a0b7eb8..45d6d6d 100644 --- a/lib/ipmi_sensor.c +++ b/lib/ipmi_sensor.c @@ -62,7 +62,7 @@ ipmi_sensor_get_sensor_reading_factors( char id[17]; - if (intf == NULL || sensor == NULL) + if (!intf || !sensor) return -1; memset(id, 0, sizeof(id)); @@ -80,7 +80,7 @@ ipmi_sensor_get_sensor_reading_factors( rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error updating reading factor for sensor %s (#%02x)", id, sensor->cmn.keys.sensor_num); return -1; @@ -164,12 +164,30 @@ ipmi_sensor_print_fc_discrete(struct ipmi_intf *intf, sr = ipmi_sdr_read_sensor_value(intf, sensor, sdr_record_type, 3); - if (sr == NULL) { + if (!sr) { return -1; } if (csv_output) { - /* NOT IMPLEMENTED */ + printf("%s", sr->s_id); + if (sr->s_reading_valid) { + if (sr->s_has_analog_value) { + /* don't show discrete component */ + printf(",%s,%s,%s", + sr->s_a_str, sr->s_a_units, "ok"); + } else { + printf(",0x%x,%s,0x%02x%02x", + sr->s_reading, "discrete", + sr->s_data2, sr->s_data3); + } + } else { + printf(",%s,%s,%s", + "na", "discrete", "na"); + } + printf(",%s,%s,%s,%s,%s,%s", + "na", "na", "na", "na", "na", "na"); + + printf("\n"); } else { if (verbose == 0) { /* output format @@ -242,6 +260,184 @@ print_thresh_setting(struct sdr_record_full_sensor *full, } } +static void +dump_sensor_fc_thredshold_csv( + int thresh_available, + const char *thresh_status, + struct ipmi_rs *rsp, + struct sensor_reading *sr) +{ + printf("%s", sr->s_id); + if (sr->s_reading_valid) { + if (sr->s_has_analog_value) + printf(",%.3f,%s,%s", + sr->s_a_val, sr->s_a_units, thresh_status); + else + printf(",0x%x,%s,%s", + sr->s_reading, sr->s_a_units, thresh_status); + } else { + printf(",%s,%s,%s", + "na", sr->s_a_units, "na"); + } + if (thresh_available && sr->full) { +#define PTS(bit, dataidx) { \ +print_thresh_setting(sr->full, rsp->data[0] & (bit), \ +rsp->data[(dataidx)], ",", "%.3f", "0x%x", "%s"); \ +} + PTS(LOWER_NON_RECOV_SPECIFIED, 3); + PTS(LOWER_CRIT_SPECIFIED, 2); + PTS(LOWER_NON_CRIT_SPECIFIED, 1); + PTS(UPPER_NON_CRIT_SPECIFIED, 4); + PTS(UPPER_CRIT_SPECIFIED, 5); + PTS(UPPER_NON_RECOV_SPECIFIED, 6); +#undef PTS + } else { + printf(",%s,%s,%s,%s,%s,%s", + "na", "na", "na", "na", "na", "na"); + } + printf("\n"); +} + +/* output format + * id value units status thresholds.... + */ +static void +dump_sensor_fc_thredshold( + int thresh_available, + const char *thresh_status, + struct ipmi_rs *rsp, + struct sensor_reading *sr) +{ + printf("%-16s ", sr->s_id); + if (sr->s_reading_valid) { + if (sr->s_has_analog_value) + printf("| %-10.3f | %-10s | %-6s", + sr->s_a_val, sr->s_a_units, thresh_status); + else + printf("| 0x%-8x | %-10s | %-6s", + sr->s_reading, sr->s_a_units, thresh_status); + } else { + printf("| %-10s | %-10s | %-6s", + "na", sr->s_a_units, "na"); + } + if (thresh_available && sr->full) { +#define PTS(bit, dataidx) { \ +print_thresh_setting(sr->full, rsp->data[0] & (bit), \ +rsp->data[(dataidx)], "| ", "%-10.3f", "0x%-8x", "%-10s"); \ +} + PTS(LOWER_NON_RECOV_SPECIFIED, 3); + PTS(LOWER_CRIT_SPECIFIED, 2); + PTS(LOWER_NON_CRIT_SPECIFIED, 1); + PTS(UPPER_NON_CRIT_SPECIFIED, 4); + PTS(UPPER_CRIT_SPECIFIED, 5); + PTS(UPPER_NON_RECOV_SPECIFIED, 6); +#undef PTS + } else { + printf("| %-10s| %-10s| %-10s| %-10s| %-10s| %-10s", + "na", "na", "na", "na", "na", "na"); + } + + printf("\n"); +} + +static void +dump_sensor_fc_thredshold_verbose( + int thresh_available, + const char *thresh_status, + struct ipmi_intf *intf, + struct sdr_record_common_sensor *sensor, + struct ipmi_rs *rsp, + struct sensor_reading *sr) +{ + printf("Sensor ID : %s (0x%x)\n", + sr->s_id, sensor->keys.sensor_num); + + printf(" Entity ID : %d.%d\n", + sensor->entity.id, sensor->entity.instance); + + printf(" Sensor Type (Threshold) : %s\n", + ipmi_get_sensor_type(intf, sensor->sensor.type)); + + printf(" Sensor Reading : "); + if (sr->s_reading_valid) { + if (sr->full) { + uint16_t raw_tol = __TO_TOL(sr->full->mtol); + if (sr->s_has_analog_value) { + double tol = + sdr_convert_sensor_tolerance(sr->full, + raw_tol); + printf("%.*f (+/- %.*f) %s\n", + (sr->s_a_val == (int) + sr->s_a_val) ? 0 : 3, + sr->s_a_val, + (tol == (int) tol) ? 0 : 3, tol, + sr->s_a_units); + } else { + printf("0x%x (+/- 0x%x) %s\n", + sr->s_reading, + raw_tol, + sr->s_a_units); + } + } else { + printf("0x%x %s\n", + sr->s_reading, sr->s_a_units); + } + printf(" Status : %s\n", thresh_status); + + if (thresh_available) { + if (sr->full) { +#define PTS(bit, dataidx, str) { \ +print_thresh_setting(sr->full, rsp->data[0] & (bit), \ + rsp->data[(dataidx)], \ + (str), "%.3f\n", "0x%x\n", "%s\n"); \ +} + PTS(LOWER_NON_RECOV_SPECIFIED, 3, " Lower Non-Recoverable : "); + PTS(LOWER_CRIT_SPECIFIED, 2, " Lower Critical : "); + PTS(LOWER_NON_CRIT_SPECIFIED, 1, " Lower Non-Critical : "); + PTS(UPPER_NON_CRIT_SPECIFIED, 4, " Upper Non-Critical : "); + PTS(UPPER_CRIT_SPECIFIED, 5, " Upper Critical : "); + PTS(UPPER_NON_RECOV_SPECIFIED, 6, " Upper Non-Recoverable : "); +#undef PTS + + } + ipmi_sdr_print_sensor_hysteresis(sensor, sr->full, + sr->full ? sr->full->threshold.hysteresis.positive : + sr->compact->threshold.hysteresis.positive, + "Positive Hysteresis"); + + ipmi_sdr_print_sensor_hysteresis(sensor, sr->full, + sr->full ? sr->full->threshold.hysteresis.negative : + sr->compact->threshold.hysteresis.negative, + "Negative Hysteresis"); + } else { + printf(" Sensor Threshold Settings not available\n"); + } + } else { + printf(" Unable to read sensor: Device Not Present\n\n"); + } + + ipmi_sdr_print_sensor_event_status(intf, + sensor->keys. + sensor_num, + sensor->sensor.type, + sensor->event_type, + ANALOG_SENSOR, + sensor->keys.owner_id, + sensor->keys.lun, + sensor->keys.channel); + ipmi_sdr_print_sensor_event_enable(intf, + sensor->keys. + sensor_num, + sensor->sensor.type, + sensor->event_type, + ANALOG_SENSOR, + sensor->keys.owner_id, + sensor->keys.lun, + sensor->keys.channel); + + printf("\n"); +} + static int ipmi_sensor_print_fc_threshold(struct ipmi_intf *intf, struct sdr_record_common_sensor *sensor, @@ -253,7 +449,7 @@ ipmi_sensor_print_fc_threshold(struct ipmi_intf *intf, sr = ipmi_sdr_read_sensor_value(intf, sensor, sdr_record_type, 3); - if (sr == NULL) { + if (!sr) { return -1; } @@ -266,137 +462,17 @@ ipmi_sensor_print_fc_threshold(struct ipmi_intf *intf, sensor->keys.sensor_num, sensor->keys.owner_id, sensor->keys.lun, sensor->keys.channel); - if ((rsp == NULL) || (rsp->ccode > 0) || (rsp->data_len == 0)) + if (!rsp || rsp->ccode || !rsp->data_len) thresh_available = 0; if (csv_output) { - /* NOT IMPLEMENTED */ + dump_sensor_fc_thredshold_csv(thresh_available, thresh_status, rsp, sr); } else { if (verbose == 0) { - /* output format - * id value units status thresholds.... - */ - printf("%-16s ", sr->s_id); - if (sr->s_reading_valid) { - if (sr->s_has_analog_value) - printf("| %-10.3f | %-10s | %-6s", - sr->s_a_val, sr->s_a_units, thresh_status); - else - printf("| 0x%-8x | %-10s | %-6s", - sr->s_reading, sr->s_a_units, thresh_status); - } else { - printf("| %-10s | %-10s | %-6s", - "na", sr->s_a_units, "na"); - } - if (thresh_available && sr->full) { -#define PTS(bit, dataidx) { \ - print_thresh_setting(sr->full, rsp->data[0] & (bit), \ - rsp->data[(dataidx)], "| ", "%-10.3f", "0x-8x", "%-10s"); \ -} - PTS(LOWER_NON_RECOV_SPECIFIED, 3); - PTS(LOWER_CRIT_SPECIFIED, 2); - PTS(LOWER_NON_CRIT_SPECIFIED, 1); - PTS(UPPER_NON_CRIT_SPECIFIED, 4); - PTS(UPPER_CRIT_SPECIFIED, 5); - PTS(UPPER_NON_RECOV_SPECIFIED, 6); -#undef PTS - } else { - printf - ("| %-10s| %-10s| %-10s| %-10s| %-10s| %-10s", - "na", "na", "na", "na", "na", "na"); - } - - printf("\n"); + dump_sensor_fc_thredshold(thresh_available, thresh_status, rsp, sr); } else { - printf("Sensor ID : %s (0x%x)\n", - sr->s_id, sensor->keys.sensor_num); - - printf(" Entity ID : %d.%d\n", - sensor->entity.id, sensor->entity.instance); - - printf(" Sensor Type (Threshold) : %s\n", - ipmi_get_sensor_type(intf, sensor->sensor. - type)); - - printf(" Sensor Reading : "); - if (sr->s_reading_valid) { - if (sr->full) { - uint16_t raw_tol = __TO_TOL(sr->full->mtol); - if (sr->s_has_analog_value) { - double tol = - sdr_convert_sensor_tolerance(sr->full, - raw_tol); - printf("%.*f (+/- %.*f) %s\n", - (sr->s_a_val == (int) - sr->s_a_val) ? 0 : 3, - sr->s_a_val, - (tol == (int) tol) ? 0 : 3, tol, - sr->s_a_units); - } else { - printf("0x%x (+/- 0x%x) %s\n", - sr->s_reading, - raw_tol, - sr->s_a_units); - } - } else { - printf("0x%x %s\n", sr->s_reading, - sr->s_a_units); - } - printf(" Status : %s\n", thresh_status); - - if (thresh_available) { - if (sr->full) { -#define PTS(bit, dataidx, str) { \ -print_thresh_setting(sr->full, rsp->data[0] & (bit), \ - rsp->data[(dataidx)], \ - (str), "%.3f\n", "0x%x\n", "%s\n"); \ -} - - PTS(LOWER_NON_RECOV_SPECIFIED, 3, " Lower Non-Recoverable : "); - PTS(LOWER_CRIT_SPECIFIED, 2, " Lower Critical : "); - PTS(LOWER_NON_CRIT_SPECIFIED, 1, " Lower Non-Critical : "); - PTS(UPPER_NON_CRIT_SPECIFIED, 4, " Upper Non-Critical : "); - PTS(UPPER_CRIT_SPECIFIED, 5, " Upper Critical : "); - PTS(UPPER_NON_RECOV_SPECIFIED, 6, " Upper Non-Recoverable : "); -#undef PTS - - } - ipmi_sdr_print_sensor_hysteresis(sensor, sr->full, - sr->full ? sr->full->threshold.hysteresis.positive : - sr->compact->threshold.hysteresis.positive, - "Positive Hysteresis"); - - ipmi_sdr_print_sensor_hysteresis(sensor, sr->full, - sr->full ? sr->full->threshold.hysteresis.negative : - sr->compact->threshold.hysteresis.negative, - "Negative Hysteresis"); - } else { - printf(" Sensor Threshold Settings not available\n"); - } - } else { - printf(" Unable to read sensor: Device Not Present\n\n"); - } - - ipmi_sdr_print_sensor_event_status(intf, - sensor->keys. - sensor_num, - sensor->sensor.type, - sensor->event_type, - ANALOG_SENSOR, - sensor->keys.owner_id, - sensor->keys.lun, - sensor->keys.channel); - ipmi_sdr_print_sensor_event_enable(intf, - sensor->keys. - sensor_num, - sensor->sensor.type, - sensor->event_type, - ANALOG_SENSOR, - sensor->keys.owner_id, - sensor->keys.lun, - sensor->keys.channel); - - printf("\n"); + dump_sensor_fc_thredshold_verbose(thresh_available, thresh_status, + intf, sensor, rsp, sr); } } @@ -424,16 +500,16 @@ ipmi_sensor_list(struct ipmi_intf *intf) lprintf(LOG_DEBUG, "Querying SDR for sensor list"); itr = ipmi_sdr_start(intf, 0); - if (itr == NULL) { + if (!itr) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return -1; } - while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, itr))) { uint8_t *rec; rec = ipmi_sdr_get_record(intf, header, itr); - if (rec == NULL) { + if (!rec) { lprintf(LOG_DEBUG, "rec == NULL"); continue; } @@ -456,7 +532,7 @@ ipmi_sensor_list(struct ipmi_intf *intf) /* rc = (r == 0) ? rc : r; */ } - ipmi_sdr_end(intf, itr); + ipmi_sdr_end(itr); return rc; } @@ -481,11 +557,11 @@ __ipmi_sensor_set_threshold(struct ipmi_intf *intf, rsp = ipmi_sensor_set_sensor_thresholds(intf, num, mask, setting, target, lun, channel); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error setting threshold"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error setting threshold: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -529,7 +605,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) struct sdr_record_list *sdr; - if (argc < 3 || strncmp(argv[0], "help", 4) == 0) { + if (argc < 3 || !strcmp(argv[0], "help")) { print_sensor_thresh_usage(); return 0; } @@ -537,7 +613,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) id = argv[0]; thresh = argv[1]; - if (strncmp(thresh, "upper", 5) == 0) { + if (!strcmp(thresh, "upper")) { if (argc < 5) { lprintf(LOG_ERR, "usage: sensor thresh <id> upper <unc> <ucr> <unr>"); @@ -559,7 +635,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) argv[4]); return (-1); } - } else if (strncmp(thresh, "lower", 5) == 0) { + } else if (!strcmp(thresh, "lower")) { if (argc < 5) { lprintf(LOG_ERR, "usage: sensor thresh <id> lower <lnr> <lcr> <lnc>"); @@ -582,17 +658,17 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) return (-1); } } else { - if (strncmp(thresh, "unr", 3) == 0) + if (!strcmp(thresh, "unr")) settingMask = UPPER_NON_RECOV_SPECIFIED; - else if (strncmp(thresh, "ucr", 3) == 0) + else if (!strcmp(thresh, "ucr")) settingMask = UPPER_CRIT_SPECIFIED; - else if (strncmp(thresh, "unc", 3) == 0) + else if (!strcmp(thresh, "unc")) settingMask = UPPER_NON_CRIT_SPECIFIED; - else if (strncmp(thresh, "lnc", 3) == 0) + else if (!strcmp(thresh, "lnc")) settingMask = LOWER_NON_CRIT_SPECIFIED; - else if (strncmp(thresh, "lcr", 3) == 0) + else if (!strcmp(thresh, "lcr")) settingMask = LOWER_CRIT_SPECIFIED; - else if (strncmp(thresh, "lnr", 3) == 0) + else if (!strcmp(thresh, "lnr")) settingMask = LOWER_NON_RECOV_SPECIFIED; else { lprintf(LOG_ERR, @@ -612,7 +688,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) /* lookup by sensor name */ sdr = ipmi_sdr_find_sdr_byid(intf, id); - if (sdr == NULL) { + if (!sdr) { lprintf(LOG_ERR, "Sensor data record not found!"); return -1; } @@ -721,7 +797,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) sdr->record.common->keys.owner_id, sdr->record.common->keys.lun, sdr->record.common->keys.channel); - if ((rsp == NULL) || (rsp->ccode > 0)) { + if (!rsp || rsp->ccode) { lprintf(LOG_ERR, "Sensor data record not found!"); return -1; } @@ -810,7 +886,7 @@ ipmi_sensor_get_reading(struct ipmi_intf *intf, int argc, char **argv) struct sdr_record_list *sdr; int i, rc=0; - if (argc < 1 || strncmp(argv[0], "help", 4) == 0) { + if (argc < 1 || !strcmp(argv[0], "help")) { lprintf(LOG_NOTICE, "sensor reading <id> ... [id]"); lprintf(LOG_NOTICE, " id : name of desired sensor"); return -1; @@ -818,7 +894,7 @@ ipmi_sensor_get_reading(struct ipmi_intf *intf, int argc, char **argv) for (i = 0; i < argc; i++) { sdr = ipmi_sdr_find_sdr_byid(intf, argv[i]); - if (sdr == NULL) { + if (!sdr) { lprintf(LOG_ERR, "Sensor \"%s\" not found!", argv[i]); rc = -1; @@ -833,7 +909,7 @@ ipmi_sensor_get_reading(struct ipmi_intf *intf, int argc, char **argv) struct sdr_record_common_sensor *sensor = sdr->record.common; sr = ipmi_sdr_read_sensor_value(intf, sensor, sdr->type, 3); - if (sr == NULL) { + if (!sr) { rc = -1; continue; } @@ -874,7 +950,7 @@ ipmi_sensor_get(struct ipmi_intf *intf, int argc, char **argv) lprintf(LOG_ERR, "Not enough parameters given."); print_sensor_get_usage(); return (-1); - } else if (strcmp(argv[0], "help") == 0) { + } else if (!strcmp(argv[0], "help")) { print_sensor_get_usage(); return 0; } @@ -882,7 +958,7 @@ ipmi_sensor_get(struct ipmi_intf *intf, int argc, char **argv) /* lookup by sensor name */ for (i = 0; i < argc; i++) { sdr = ipmi_sdr_find_sdr_byid(intf, argv[i]); - if (sdr == NULL) { + if (!sdr) { lprintf(LOG_ERR, "Sensor data record \"%s\" not found!", argv[i]); rc = -1; @@ -919,15 +995,15 @@ ipmi_sensor_main(struct ipmi_intf *intf, int argc, char **argv) if (argc == 0) { rc = ipmi_sensor_list(intf); - } else if (strncmp(argv[0], "help", 4) == 0) { + } else if (!strcmp(argv[0], "help")) { lprintf(LOG_NOTICE, "Sensor Commands: list thresh get reading"); - } else if (strncmp(argv[0], "list", 4) == 0) { + } else if (!strcmp(argv[0], "list")) { rc = ipmi_sensor_list(intf); - } else if (strncmp(argv[0], "thresh", 5) == 0) { + } else if (!strcmp(argv[0], "thresh")) { rc = ipmi_sensor_set_threshold(intf, argc - 1, &argv[1]); - } else if (strncmp(argv[0], "get", 3) == 0) { + } else if (!strcmp(argv[0], "get")) { rc = ipmi_sensor_get(intf, argc - 1, &argv[1]); - } else if (strncmp(argv[0], "reading", 7) == 0) { + } else if (!strcmp(argv[0], "reading")) { rc = ipmi_sensor_get_reading(intf, argc - 1, &argv[1]); } else { lprintf(LOG_ERR, "Invalid sensor command: %s", argv[0]); |