static int ipmi_sensor_get(struct ipmi_intf *intf, int argc, char **argv) { struct sdr_record_list *sdr; int i, v; int rc = 0; if (argc < 1 || strncmp(argv[0], "help", 4) == 0) { lprintf(LOG_NOTICE, "sensor get <id> ... [id]"); lprintf(LOG_NOTICE, " id : name of desired sensor"); return -1; } printf("Locating sensor record...\n"); /* lookup by sensor name */ for (i = 0; i < argc; i++) { int r = 0; sdr = ipmi_sdr_find_sdr_byid(intf, argv[i]); if (sdr == NULL) { lprintf(LOG_ERR, "Sensor data record \"%s\" not found!", argv[i]); rc = -1; continue; } /* need to set verbose level to 1 */ v = verbose; verbose = 1; switch (sdr->type) { case SDR_RECORD_TYPE_FULL_SENSOR: case SDR_RECORD_TYPE_COMPACT_SENSOR: r = ipmi_sensor_print_fc(intf, sdr->record.common, sdr->type); break; case SDR_RECORD_TYPE_EVENTONLY_SENSOR: r = ipmi_sdr_print_sensor_eventonly(intf, sdr->record. eventonly); break; case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR: r = ipmi_sdr_print_sensor_fru_locator(intf, sdr->record. fruloc); break; case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR: r = ipmi_sdr_print_sensor_mc_locator(intf, sdr->record.mcloc); break; } verbose = v; /* save errors */ rc = (r == 0) ? rc : r; } return rc; }
static int 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) { lprintf(LOG_NOTICE, "sensor reading <id> ... [id]"); lprintf(LOG_NOTICE, " id : name of desired sensor"); return -1; } for (i = 0; i < argc; i++) { sdr = ipmi_sdr_find_sdr_byid(intf, argv[i]); if (sdr == NULL) { lprintf(LOG_ERR, "Sensor \"%s\" not found!", argv[i]); rc = -1; continue; } switch (sdr->type) { case SDR_RECORD_TYPE_FULL_SENSOR: case SDR_RECORD_TYPE_COMPACT_SENSOR: { struct sensor_reading *sr; struct sdr_record_common_sensor *sensor = sdr->record.common; sr = ipmi_sdr_read_sensor_value(intf, sensor, sdr->type, 3); if (sr == NULL) { rc = -1; continue; } if (!sr->full) continue; if (!sr->s_reading_valid) continue; if (!sr->s_has_analog_value) { lprintf(LOG_ERR, "Sensor \"%s\" is a discrete sensor!", argv[i]); continue; } if (csv_output) printf("%s,%s\n", argv[i], sr->s_a_str); else printf("%-16s | %s\n", argv[i], sr->s_a_str); break; } default: continue; } } return rc; }
static int ipmi_sensor_get(struct ipmi_intf *intf, int argc, char **argv) { int i, v; int rc = 0; struct sdr_record_list *sdr; if (argc < 1) { lprintf(LOG_ERR, "Not enough parameters given."); printf_sensor_get_usage(); return (-1); } else if (strcmp(argv[0], "help") == 0) { printf_sensor_get_usage(); return 0; } printf("Locating sensor record...\n"); /* lookup by sensor name */ for (i = 0; i < argc; i++) { sdr = ipmi_sdr_find_sdr_byid(intf, argv[i]); if (sdr == NULL) { lprintf(LOG_ERR, "Sensor data record \"%s\" not found!", argv[i]); rc = -1; continue; } /* need to set verbose level to 1 */ v = verbose; verbose = 1; if (ipmi_sdr_print_listentry(intf, sdr) < 0) { rc = (-1); } verbose = v; sdr = NULL; } return rc; }
static int ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) { char *id, *thresh; uint8_t settingMask = 0; double setting1 = 0.0, setting2 = 0.0, setting3 = 0.0; int allUpper = 0, allLower = 0; int ret = 0; struct ipmi_rs *rsp; int i =0; double val[10] = {0}; struct sdr_record_list *sdr; if (argc < 3 || strncmp(argv[0], "help", 4) == 0) { lprintf(LOG_NOTICE, "sensor thresh <id> <threshold> <setting>"); lprintf(LOG_NOTICE, " id : name of the sensor for which threshold is to be set"); lprintf(LOG_NOTICE, " threshold : which threshold to set"); lprintf(LOG_NOTICE, " unr = upper non-recoverable"); lprintf(LOG_NOTICE, " ucr = upper critical"); lprintf(LOG_NOTICE, " unc = upper non-critical"); lprintf(LOG_NOTICE, " lnc = lower non-critical"); lprintf(LOG_NOTICE, " lcr = lower critical"); lprintf(LOG_NOTICE, " lnr = lower non-recoverable"); lprintf(LOG_NOTICE, " setting : the value to set the threshold to"); lprintf(LOG_NOTICE, ""); lprintf(LOG_NOTICE, "sensor thresh <id> lower <lnr> <lcr> <lnc>"); lprintf(LOG_NOTICE, " Set all lower thresholds at the same time"); lprintf(LOG_NOTICE, ""); lprintf(LOG_NOTICE, "sensor thresh <id> upper <unc> <ucr> <unr>"); lprintf(LOG_NOTICE, " Set all upper thresholds at the same time"); lprintf(LOG_NOTICE, ""); return 0; } id = argv[0]; thresh = argv[1]; if (strncmp(thresh, "upper", 5) == 0) { if (argc < 5) { lprintf(LOG_ERR, "usage: sensor thresh <id> upper <unc> <ucr> <unr>"); return -1; } allUpper = 1; setting1 = (double) strtod(argv[2], NULL); setting2 = (double) strtod(argv[3], NULL); setting3 = (double) strtod(argv[4], NULL); } else if (strncmp(thresh, "lower", 5) == 0) { if (argc < 5) { lprintf(LOG_ERR, "usage: sensor thresh <id> lower <unc> <ucr> <unr>"); return -1; } allLower = 1; setting1 = (double) strtod(argv[2], NULL); setting2 = (double) strtod(argv[3], NULL); setting3 = (double) strtod(argv[4], NULL); } else { setting1 = (double) atof(argv[2]); if (strncmp(thresh, "unr", 3) == 0) settingMask = UPPER_NON_RECOV_SPECIFIED; else if (strncmp(thresh, "ucr", 3) == 0) settingMask = UPPER_CRIT_SPECIFIED; else if (strncmp(thresh, "unc", 3) == 0) settingMask = UPPER_NON_CRIT_SPECIFIED; else if (strncmp(thresh, "lnc", 3) == 0) settingMask = LOWER_NON_CRIT_SPECIFIED; else if (strncmp(thresh, "lcr", 3) == 0) settingMask = LOWER_CRIT_SPECIFIED; else if (strncmp(thresh, "lnr", 3) == 0) settingMask = LOWER_NON_RECOV_SPECIFIED; else { lprintf(LOG_ERR, "Valid threshold '%s' for sensor '%s' not specified!", thresh, id); return -1; } } printf("Locating sensor record '%s'...\n", id); /* lookup by sensor name */ sdr = ipmi_sdr_find_sdr_byid(intf, id); if (sdr == NULL) { lprintf(LOG_ERR, "Sensor data record not found!"); return -1; } if (sdr->type != SDR_RECORD_TYPE_FULL_SENSOR) { lprintf(LOG_ERR, "Invalid sensor type %02x", sdr->type); return -1; } if (!IS_THRESHOLD_SENSOR(sdr->record.common)) { lprintf(LOG_ERR, "Invalid sensor event type %02x", sdr->record.common->event_type); return -1; } if (allUpper) { settingMask = UPPER_NON_CRIT_SPECIFIED; printf("Setting sensor \"%s\" %s threshold to %.3f\n", sdr->record.full->id_string, val2str(settingMask, threshold_vals), setting1); ret = __ipmi_sensor_set_threshold(intf, sdr->record.common->keys. sensor_num, settingMask, __ipmi_sensor_threshold_value_to_raw(sdr->record.full, setting1), sdr->record.common->keys.owner_id, sdr->record.common->keys.lun); settingMask = UPPER_CRIT_SPECIFIED; printf("Setting sensor \"%s\" %s threshold to %.3f\n", sdr->record.full->id_string, val2str(settingMask, threshold_vals), setting2); ret = __ipmi_sensor_set_threshold(intf, sdr->record.common->keys. sensor_num, settingMask, __ipmi_sensor_threshold_value_to_raw(sdr->record.full, setting2), sdr->record.common->keys.owner_id, sdr->record.common->keys.lun); settingMask = UPPER_NON_RECOV_SPECIFIED; printf("Setting sensor \"%s\" %s threshold to %.3f\n", sdr->record.full->id_string, val2str(settingMask, threshold_vals), setting3); ret = __ipmi_sensor_set_threshold(intf, sdr->record.common->keys. sensor_num, settingMask, __ipmi_sensor_threshold_value_to_raw(sdr->record.full, setting3), sdr->record.common->keys.owner_id, sdr->record.common->keys.lun); } else if (allLower) { settingMask = LOWER_NON_RECOV_SPECIFIED; printf("Setting sensor \"%s\" %s threshold to %.3f\n", sdr->record.full->id_string, val2str(settingMask, threshold_vals), setting1); ret = __ipmi_sensor_set_threshold(intf, sdr->record.common->keys. sensor_num, settingMask, __ipmi_sensor_threshold_value_to_raw(sdr->record.full, setting1), sdr->record.common->keys.owner_id, sdr->record.common->keys.lun); settingMask = LOWER_CRIT_SPECIFIED; printf("Setting sensor \"%s\" %s threshold to %.3f\n", sdr->record.full->id_string, val2str(settingMask, threshold_vals), setting2); ret = __ipmi_sensor_set_threshold(intf, sdr->record.common->keys. sensor_num, settingMask, __ipmi_sensor_threshold_value_to_raw(sdr->record.full, setting2), sdr->record.common->keys.owner_id, sdr->record.common->keys.lun); settingMask = LOWER_NON_CRIT_SPECIFIED; printf("Setting sensor \"%s\" %s threshold to %.3f\n", sdr->record.full->id_string, val2str(settingMask, threshold_vals), setting3); ret = __ipmi_sensor_set_threshold(intf, sdr->record.common->keys. sensor_num, settingMask, __ipmi_sensor_threshold_value_to_raw(sdr->record.full, setting3), sdr->record.common->keys.owner_id, sdr->record.common->keys.lun); } else { /* * Current implementation doesn't check for the valid setting of upper non critical and other thresholds. * In the below logic: * Get all the current reading of the sensor i.e. unc, uc, lc,lnc. * Validate the values given by the user. * If the values are not correct, then popup with the Error message and return. */ /* * Get current reading */ rsp = ipmi_sdr_get_sensor_reading_ipmb(intf, sdr->record.common->keys.sensor_num, sdr->record.common->keys.owner_id, sdr->record.common->keys.lun,sdr->record.common->keys.channel); rsp = ipmi_sdr_get_sensor_thresholds(intf, sdr->record.common->keys.sensor_num, sdr->record.common->keys.owner_id, sdr->record.common->keys.lun, sdr->record.common->keys.channel); if ((rsp == NULL) || (rsp->ccode > 0)) { lprintf(LOG_ERR, "Sensor data record not found!"); return -1; } for(i=1;i<=6;i++) { val[i] = sdr_convert_sensor_reading(sdr->record.full, rsp->data[i]); if(val[i] < 0) val[i] = 0; } /* Check for the valid Upper non recovarable Value.*/ if( (settingMask & UPPER_NON_RECOV_SPECIFIED) ) { if( (rsp->data[0] & UPPER_NON_RECOV_SPECIFIED) && (( (rsp->data[0] & UPPER_CRIT_SPECIFIED) && ( setting1 <= val[5])) || ( (rsp->data[0] & UPPER_NON_CRIT_SPECIFIED) && ( setting1 <= val[4]))) ) { lprintf(LOG_ERR, INVALID_THRESHOLD); return -1; } } else if( (settingMask & UPPER_CRIT_SPECIFIED) ) { /* Check for the valid Upper critical Value.*/ if( (rsp->data[0] & UPPER_CRIT_SPECIFIED) && (((rsp->data[0] & UPPER_NON_RECOV_SPECIFIED)&& ( setting1 >= val[6])) || ((rsp->data[0] & UPPER_NON_CRIT_SPECIFIED)&&( setting1 <= val[4]))) ) { lprintf(LOG_ERR, INVALID_THRESHOLD); return -1; } } else if( (settingMask & UPPER_NON_CRIT_SPECIFIED) ) { /* Check for the valid Upper non critical Value.*/ if( (rsp->data[0] & UPPER_NON_CRIT_SPECIFIED) && (((rsp->data[0] & UPPER_NON_RECOV_SPECIFIED)&&( setting1 >= val[6])) || ((rsp->data[0] & UPPER_CRIT_SPECIFIED)&&( setting1 >= val[5])) || ((rsp->data[0] & LOWER_NON_CRIT_SPECIFIED)&&( setting1 <= val[1]))) ) { lprintf(LOG_ERR, INVALID_THRESHOLD); return -1; } } else if( (settingMask & LOWER_NON_CRIT_SPECIFIED) ) { /* Check for the valid lower non critical Value.*/ if( (rsp->data[0] & LOWER_NON_CRIT_SPECIFIED) && (((rsp->data[0] & LOWER_CRIT_SPECIFIED)&&( setting1 <= val[2])) || ((rsp->data[0] & LOWER_NON_RECOV_SPECIFIED)&&( setting1 <= val[3]))|| ((rsp->data[0] & UPPER_NON_CRIT_SPECIFIED)&&( setting1 >= val[4]))) ) { lprintf(LOG_ERR, INVALID_THRESHOLD); return -1; } } else if( (settingMask & LOWER_CRIT_SPECIFIED) ) { /* Check for the valid lower critical Value.*/ if( (rsp->data[0] & LOWER_CRIT_SPECIFIED) && (((rsp->data[0] & LOWER_NON_CRIT_SPECIFIED)&&( setting1 >= val[1])) || ((rsp->data[0] & LOWER_NON_RECOV_SPECIFIED)&&( setting1 <= val[3]))) ) { lprintf(LOG_ERR, INVALID_THRESHOLD); return -1; } } else if( (settingMask & LOWER_NON_RECOV_SPECIFIED) ) { /* Check for the valid lower non recovarable Value.*/ if( (rsp->data[0] & LOWER_NON_RECOV_SPECIFIED) && (((rsp->data[0] & LOWER_NON_CRIT_SPECIFIED)&&( setting1 >= val[1])) || ((rsp->data[0] & LOWER_CRIT_SPECIFIED)&&( setting1 >= val[2]))) ) { lprintf(LOG_ERR, INVALID_THRESHOLD); return -1; } } else { /* None of this Then Return with error messages.*/ lprintf(LOG_ERR, INVALID_THRESHOLD); return -1; } printf("Setting sensor \"%s\" %s threshold to %.3f\n", sdr->record.full->id_string, val2str(settingMask, threshold_vals), setting1); ret = __ipmi_sensor_set_threshold(intf, sdr->record.common->keys. sensor_num, settingMask, __ipmi_sensor_threshold_value_to_raw(sdr->record.full, setting1), sdr->record.common->keys.owner_id, sdr->record.common->keys.lun); } return ret; }