/* * _check_power_sensor check if the sensor is in Watt */ static int _check_power_sensor(void) { unsigned int record_ids[] = {(int) slurm_ipmi_conf.power_sensor_num}; unsigned int record_ids_length = 1; int sensor_units; void* sensor_reading; if ((ipmi_monitoring_sensor_readings_by_record_id( ipmi_ctx, hostname, &ipmi_config, sensor_reading_flags, record_ids, record_ids_length, NULL, NULL)) != record_ids_length) { error("ipmi_monitoring_sensor_readings_by_record_id: %s", ipmi_monitoring_ctx_errormsg(ipmi_ctx)); return SLURM_FAILURE; } if ((sensor_units = ipmi_monitoring_sensor_read_sensor_units(ipmi_ctx)) < 0) { error("ipmi_monitoring_sensor_read_sensor_units: %s", ipmi_monitoring_ctx_errormsg(ipmi_ctx)); return SLURM_FAILURE; } if (sensor_units != slurm_ipmi_conf.variable) { error("Configured sensor is not in Watt, " "please check ipmi.conf"); return SLURM_FAILURE; } ipmi_monitoring_sensor_iterator_first(ipmi_ctx); if (ipmi_monitoring_sensor_read_record_id(ipmi_ctx) < 0) { error("ipmi_monitoring_sensor_read_record_id: %s", ipmi_monitoring_ctx_errormsg(ipmi_ctx)); return SLURM_FAILURE; } sensor_reading = ipmi_monitoring_sensor_read_sensor_reading(ipmi_ctx); if (sensor_reading) { last_update_watt = (uint32_t)(*((double *)sensor_reading)); previous_update_time = last_update_time; last_update_time = time(NULL); } else { error("ipmi read an empty value for power consumption"); return SLURM_FAILURE; } return SLURM_SUCCESS; }
/* * _find_power_sensor reads all sensors and find sensor in Watt */ static int _find_power_sensor(void) { int sensor_count; int i; int rc = SLURM_FAILURE; void* sensor_reading; int sensor_units, record_id; sensor_count = ipmi_monitoring_sensor_readings_by_record_id( ipmi_ctx, hostname, &ipmi_config, sensor_reading_flags, NULL, 0, NULL, NULL); if (sensor_count < 0) { error("ipmi_monitoring_sensor_readings_by_record_id: %s", ipmi_monitoring_ctx_errormsg(ipmi_ctx)); return SLURM_FAILURE; } for (i = 0; i < sensor_count; i++, ipmi_monitoring_sensor_iterator_next(ipmi_ctx)) { if ((sensor_units = ipmi_monitoring_sensor_read_sensor_units(ipmi_ctx)) < 0) { error("ipmi_monitoring_sensor_read_sensor_units: %s", ipmi_monitoring_ctx_errormsg(ipmi_ctx)); return SLURM_FAILURE; } if (sensor_units != slurm_ipmi_conf.variable) continue; if ((record_id = ipmi_monitoring_sensor_read_record_id(ipmi_ctx)) < 0) { error("ipmi_monitoring_sensor_read_record_id: %s", ipmi_monitoring_ctx_errormsg(ipmi_ctx)); return SLURM_FAILURE; } slurm_ipmi_conf.power_sensor_num = (uint32_t) record_id; sensor_reading = ipmi_monitoring_sensor_read_sensor_reading( ipmi_ctx); if (sensor_reading) { last_update_watt = (uint32_t)(*((double *)sensor_reading)); last_update_time = time(NULL); } else { error("ipmi read an empty value for power consumption"); rc = SLURM_FAILURE; continue; } rc = SLURM_SUCCESS; break; } if (rc != SLURM_SUCCESS) info("Power sensor not found."); else if (debug_flags & DEBUG_FLAG_ENERGY) info("Power sensor found: %d", slurm_ipmi_conf.power_sensor_num); return rc; }
static int _ipmimonitoring (struct ipmi_monitoring_ipmi_config *ipmi_config) { ipmi_monitoring_ctx_t ctx = NULL; unsigned int sensor_reading_flags = 0; unsigned int i; int sensor_count; int errnum; int rv = -1; if (ipmi_monitoring_init (ipmimonitoring_init_flags, &errnum) < 0) { fprintf (stderr, "ipmi_monitoring_init: %s\n", ipmi_monitoring_ctx_strerror (errnum)); goto cleanup; } if (!(ctx = ipmi_monitoring_ctx_create ())) { perror ("ipmi_monitoring_ctx_create:"); goto cleanup; } if (sdr_cache_directory) { if (ipmi_monitoring_ctx_sdr_cache_directory (ctx, sdr_cache_directory) < 0) { fprintf (stderr, "ipmi_monitoring_ctx_sdr_cache_directory: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } } /* Must call otherwise only default interpretations ever used */ if (sensor_config_file) { if (ipmi_monitoring_ctx_sensor_config_file (ctx, sensor_config_file) < 0) { fprintf (stderr, "ipmi_monitoring_ctx_sensor_config_file: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } } else { if (ipmi_monitoring_ctx_sensor_config_file (ctx, NULL) < 0) { fprintf (stderr, "ipmi_monitoring_ctx_sensor_config_file: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } } if (reread_sdr_cache) sensor_reading_flags |= IPMI_MONITORING_SENSOR_READING_FLAGS_REREAD_SDR_CACHE; if (ignore_non_interpretable_sensors) sensor_reading_flags |= IPMI_MONITORING_SENSOR_READING_FLAGS_IGNORE_NON_INTERPRETABLE_SENSORS; if (bridge_sensors) sensor_reading_flags |= IPMI_MONITORING_SENSOR_READING_FLAGS_BRIDGE_SENSORS; if (interpret_oem_data) sensor_reading_flags |= IPMI_MONITORING_SENSOR_READING_FLAGS_INTERPRET_OEM_DATA; if (shared_sensors) sensor_reading_flags |= IPMI_MONITORING_SENSOR_READING_FLAGS_SHARED_SENSORS; if (discrete_reading) sensor_reading_flags |= IPMI_MONITORING_SENSOR_READING_FLAGS_DISCRETE_READING; if (ignore_scanning_disabled) sensor_reading_flags |= IPMI_MONITORING_SENSOR_READING_FLAGS_IGNORE_SCANNING_DISABLED; if (assume_bmc_owner) sensor_reading_flags |= IPMI_MONITORING_SENSOR_READING_FLAGS_ASSUME_BMC_OWNER; if (entity_sensor_names) sensor_reading_flags |= IPMI_MONITORING_SENSOR_READING_FLAGS_ENTITY_SENSOR_NAMES; if (!record_ids_length && !sensor_types_length) { if ((sensor_count = ipmi_monitoring_sensor_readings_by_record_id (ctx, hostname, ipmi_config, sensor_reading_flags, NULL, 0, NULL, NULL)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_readings_by_record_id: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } } else if (record_ids_length) { if ((sensor_count = ipmi_monitoring_sensor_readings_by_record_id (ctx, hostname, ipmi_config, sensor_reading_flags, record_ids, record_ids_length, NULL, NULL)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_readings_by_record_id: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } } else { if ((sensor_count = ipmi_monitoring_sensor_readings_by_sensor_type (ctx, hostname, ipmi_config, sensor_reading_flags, sensor_types, sensor_types_length, NULL, NULL)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_readings_by_sensor_type: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } } printf ("%s, %s, %s, %s, %s, %s, %s, %s, %s, %s\n", "Record ID", "Sensor Name", "Sensor Number", "Sensor Type", "Sensor State", "Sensor Reading", "Sensor Units", "Sensor Event/Reading Type Code", "Sensor Event Bitmask", "Sensor Event String"); for (i = 0; i < sensor_count; i++, ipmi_monitoring_sensor_iterator_next (ctx)) { int record_id, sensor_number, sensor_type, sensor_state, sensor_units, sensor_bitmask_type, sensor_bitmask, sensor_reading_type, event_reading_type_code; char **sensor_bitmask_strings = NULL; const char *sensor_type_str; const char *sensor_state_str; char *sensor_name = NULL; void *sensor_reading; if ((record_id = ipmi_monitoring_sensor_read_record_id (ctx)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_read_record_id: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } if ((sensor_number = ipmi_monitoring_sensor_read_sensor_number (ctx)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_read_sensor_number: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } if ((sensor_type = ipmi_monitoring_sensor_read_sensor_type (ctx)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_read_sensor_type: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } if (!(sensor_name = ipmi_monitoring_sensor_read_sensor_name (ctx))) { fprintf (stderr, "ipmi_monitoring_sensor_read_sensor_name: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } if ((sensor_state = ipmi_monitoring_sensor_read_sensor_state (ctx)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_read_sensor_state: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } if ((sensor_units = ipmi_monitoring_sensor_read_sensor_units (ctx)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_read_sensor_units: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } if ((sensor_bitmask_type = ipmi_monitoring_sensor_read_sensor_bitmask_type (ctx)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_read_sensor_bitmask_type: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } if ((sensor_bitmask = ipmi_monitoring_sensor_read_sensor_bitmask (ctx)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_read_sensor_bitmask: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } if (!(sensor_bitmask_strings = ipmi_monitoring_sensor_read_sensor_bitmask_strings (ctx))) { fprintf (stderr, "ipmi_monitoring_sensor_read_sensor_bitmask_strings: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } if ((sensor_reading_type = ipmi_monitoring_sensor_read_sensor_reading_type (ctx)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_read_sensor_reading_type: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } sensor_reading = ipmi_monitoring_sensor_read_sensor_reading (ctx); if ((event_reading_type_code = ipmi_monitoring_sensor_read_event_reading_type_code (ctx)) < 0) { fprintf (stderr, "ipmi_monitoring_sensor_read_event_reading_type_code: %s\n", ipmi_monitoring_ctx_errormsg (ctx)); goto cleanup; } if (!strlen (sensor_name)) sensor_name = "N/A"; sensor_type_str = _get_sensor_type_string (sensor_type); printf ("%u, %s, %u, %s", record_id, sensor_name, sensor_number, sensor_type_str); if (sensor_state == IPMI_MONITORING_STATE_NOMINAL) sensor_state_str = "Nominal"; else if (sensor_state == IPMI_MONITORING_STATE_WARNING) sensor_state_str = "Warning"; else if (sensor_state == IPMI_MONITORING_STATE_CRITICAL) sensor_state_str = "Critical"; else sensor_state_str = "N/A"; printf (", %s", sensor_state_str); if (sensor_reading) { const char *sensor_units_str; if (sensor_reading_type == IPMI_MONITORING_SENSOR_READING_TYPE_UNSIGNED_INTEGER8_BOOL) printf (", %s", (*((uint8_t *)sensor_reading) ? "true" : "false")); else if (sensor_reading_type == IPMI_MONITORING_SENSOR_READING_TYPE_UNSIGNED_INTEGER32) printf (", %u", *((uint32_t *)sensor_reading)); else if (sensor_reading_type == IPMI_MONITORING_SENSOR_READING_TYPE_DOUBLE) printf (", %.2f", *((double *)sensor_reading)); else printf (", N/A"); if (sensor_units == IPMI_MONITORING_SENSOR_UNITS_CELSIUS) sensor_units_str = "C"; else if (sensor_units == IPMI_MONITORING_SENSOR_UNITS_FAHRENHEIT) sensor_units_str = "F"; else if (sensor_units == IPMI_MONITORING_SENSOR_UNITS_VOLTS) sensor_units_str = "V"; else if (sensor_units == IPMI_MONITORING_SENSOR_UNITS_AMPS) sensor_units_str = "A"; else if (sensor_units == IPMI_MONITORING_SENSOR_UNITS_RPM) sensor_units_str = "RPM"; else if (sensor_units == IPMI_MONITORING_SENSOR_UNITS_WATTS) sensor_units_str = "W"; else if (sensor_units == IPMI_MONITORING_SENSOR_UNITS_PERCENT) sensor_units_str = "%"; else sensor_units_str = "N/A"; printf (", %s", sensor_units_str); } else printf (", N/A, N/A"); printf (", %Xh", event_reading_type_code); /* It is possible you may want to monitor specific event * conditions that may occur. If that is the case, you may want * to check out what specific bitmask type and bitmask events * occurred. See ipmi_monitoring_bitmasks.h for a list of * bitmasks and types. */ if (sensor_bitmask_type != IPMI_MONITORING_SENSOR_BITMASK_TYPE_UNKNOWN) printf (", %Xh", sensor_bitmask); else printf (", N/A"); if (sensor_bitmask_type != IPMI_MONITORING_SENSOR_BITMASK_TYPE_UNKNOWN) { unsigned int i = 0; printf (","); while (sensor_bitmask_strings[i]) { printf (" "); printf ("'%s'", sensor_bitmask_strings[i]); i++; } } else printf (", N/A"); printf ("\n"); } rv = 0; cleanup: if (ctx) ipmi_monitoring_ctx_destroy (ctx); return (rv); }