示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
0
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;
}