*** src/zabbix_server/poller/checks_ipmi.c Tue Mar 30 04:22:44 2010 --- checks_ipmi.c.new Thu Apr 15 10:33:10 2010 *************** *** 32,38 **** typedef struct zbx_ipmi_sensor { ipmi_sensor_t *sensor; char *s_name; ! double value; } zbx_ipmi_sensor_t; typedef struct zbx_ipmi_control { --- 32,39 ---- typedef struct zbx_ipmi_sensor { ipmi_sensor_t *sensor; char *s_name; ! double value; // threshold sensor value ! zbx_uint64_t discrete; // discrete sensor value } zbx_ipmi_sensor_t; typedef struct zbx_ipmi_control { *************** *** 145,152 **** s_name = zbx_malloc(s_name, sz + 1); ipmi_sensor_get_id(sensor, s_name, sz); ! zabbix_log(LOG_LEVEL_DEBUG, "In allocate_ipmi_sensor() %s@[%s]:%d", ! s_name, h->ip, h->port); h->sensor_count++; sz = h->sensor_count * sizeof(zbx_ipmi_sensor_t); --- 146,153 ---- s_name = zbx_malloc(s_name, sz + 1); ipmi_sensor_get_id(sensor, s_name, sz); ! zabbix_log(LOG_LEVEL_DEBUG, "In allocate_ipmi_sensor()"); // %s@[%s]:%d", ! // s_name, h->ip, h->port); h->sensor_count++; sz = h->sensor_count * sizeof(zbx_ipmi_sensor_t); *************** *** 314,319 **** --- 315,321 ---- { case IPMI_NO_VALUES_PRESENT: case IPMI_RAW_VALUE_PRESENT: + zabbix_log(LOG_LEVEL_DEBUG, " - No values"); h->err = zbx_dsprintf(h->err, "No value present for threshold sensor"); h->ret = NOTSUPPORTED; break; *************** *** 326,347 **** --- 328,359 ---- s_type_string = ipmi_sensor_get_sensor_type_string(sensor); s_reading_type_string = ipmi_sensor_get_event_reading_type_string(sensor); + zabbix_log(LOG_LEVEL_DEBUG, " - Name: %s [%s]", s->s_name, e_string); + zabbix_log(LOG_LEVEL_DEBUG, " - Sensor Type: %s", s_type_string); + zabbix_log(LOG_LEVEL_DEBUG, " - Reading Type: %s", s_reading_type_string); + zabbix_log(LOG_LEVEL_DEBUG, " - Value: %f", s->value); + base = ipmi_sensor_get_base_unit_string(sensor); + zabbix_log(LOG_LEVEL_DEBUG, " - Base: %s [%s]", s->s_name, e_string); if (ipmi_sensor_get_percentage(sensor)) percent = "%"; + switch (ipmi_sensor_get_modifier_unit_use(sensor)) { case IPMI_MODIFIER_UNIT_NONE: break; case IPMI_MODIFIER_UNIT_BASE_DIV_MOD: mod_use = "/"; modifier = ipmi_sensor_get_modifier_unit_string(sensor); + zabbix_log(LOG_LEVEL_DEBUG, " - Modifier: %s %s", mod_use, modifier); break; case IPMI_MODIFIER_UNIT_BASE_MULT_MOD: mod_use = "*"; modifier = ipmi_sensor_get_modifier_unit_string(sensor); + zabbix_log(LOG_LEVEL_DEBUG, " - Modifier: %s %s", mod_use, modifier); break; } rate = ipmi_sensor_get_rate_unit_string(sensor); + zabbix_log(LOG_LEVEL_DEBUG, " - Rate: ", rate); zabbix_log(LOG_LEVEL_DEBUG, "Value [%s | %s | %s | %s | " ZBX_FS_DBL "%s %s%s%s%s]", s->s_name, e_string, s_type_string, s_reading_type_string, *************** *** 350,370 **** } h->done = 1; } ! /* static void got_discrete_states(ipmi_sensor_t *sensor, int err, ipmi_states_t *states, void *cb_data) { ! int id, i, val, ret; const char *e_string, *s_type_string, *s_reading_type_string; ipmi_entity_t *ent; zbx_ipmi_host_t *h = cb_data; zbx_ipmi_sensor_t *s; s = get_ipmi_sensor(h, sensor); if (NULL == s) ! {*/ /* this should never happen */ ! /* h->err = zbx_dsprintf(h->err, "Fatal error"); h->ret = NOTSUPPORTED; h->done = 1; return; --- 362,384 ---- } h->done = 1; } ! static void got_discrete_states(ipmi_sensor_t *sensor, int err, ipmi_states_t *states, void *cb_data) { ! int id, i, val, ret, type, isStateOn; const char *e_string, *s_type_string, *s_reading_type_string; ipmi_entity_t *ent; zbx_ipmi_host_t *h = cb_data; zbx_ipmi_sensor_t *s; + zabbix_log(LOG_LEVEL_DEBUG, "In got_discrete_states()"); + s = get_ipmi_sensor(h, sensor); if (NULL == s) ! { /* this should never happen */ ! h->err = zbx_dsprintf(h->err, "Fatal error"); h->ret = NOTSUPPORTED; h->done = 1; return; *************** *** 383,390 **** e_string = ipmi_get_entity_id_string(id); s_type_string = ipmi_sensor_get_sensor_type_string(sensor); s_reading_type_string = ipmi_sensor_get_event_reading_type_string(sensor); ! for (i = 0; i < 15; i++) { ret = ipmi_sensor_discrete_event_readable(sensor, i, &val); if (ret || !val) --- 397,412 ---- e_string = ipmi_get_entity_id_string(id); s_type_string = ipmi_sensor_get_sensor_type_string(sensor); s_reading_type_string = ipmi_sensor_get_event_reading_type_string(sensor); + type = ipmi_sensor_get_event_reading_type(s->sensor); ! zabbix_log(LOG_LEVEL_DEBUG, " - Name: %s [%s]", s->s_name, e_string); ! zabbix_log(LOG_LEVEL_DEBUG, " - Sensor Type: %s", s_type_string); ! zabbix_log(LOG_LEVEL_DEBUG, " - Reading Type: %s (%i)", s_reading_type_string, type); ! zabbix_log(LOG_LEVEL_DEBUG, " - Value: %f", s->value); ! ! s->discrete = 65536; // Discrete value are 16-bit (ie: [0,2^16-1], so 2^16 = fail) ! // We're using a 64-bit uint, so this is kosher ! for (i = 0; i <= 15; i++) { ret = ipmi_sensor_discrete_event_readable(sensor, i, &val); if (ret || !val) *************** *** 393,402 **** zabbix_log(LOG_LEVEL_DEBUG, "State [%s | %s | %s | %s | state %d value is %d]", s->s_name, e_string, s_type_string, s_reading_type_string, i, ipmi_is_state_set(states, i)); ! s->value = ?; } } ! */ static void read_ipmi_sensor(zbx_ipmi_host_t *h, zbx_ipmi_sensor_t *s) { int type, ret; --- 415,448 ---- zabbix_log(LOG_LEVEL_DEBUG, "State [%s | %s | %s | %s | state %d value is %d]", s->s_name, e_string, s_type_string, s_reading_type_string, i, ipmi_is_state_set(states, i)); ! switch(type) ! { ! case IPMI_EVENT_READING_TYPE_DISCRETE_USAGE: ! case IPMI_EVENT_READING_TYPE_DISCRETE_STATE: ! case IPMI_EVENT_READING_TYPE_DISCRETE_PREDICTIVE_FAILURE: ! case IPMI_EVENT_READING_TYPE_DISCRETE_LIMIT_EXCEEDED: ! case IPMI_EVENT_READING_TYPE_DISCRETE_PERFORMANCE_MET: ! case IPMI_EVENT_READING_TYPE_DISCRETE_SEVERITY: ! case IPMI_EVENT_READING_TYPE_DISCRETE_DEVICE_PRESENCE: ! case IPMI_EVENT_READING_TYPE_DISCRETE_DEVICE_ENABLE: ! case IPMI_EVENT_READING_TYPE_DISCRETE_AVAILABILITY: ! case IPMI_EVENT_READING_TYPE_DISCRETE_REDUNDANCY: ! case IPMI_EVENT_READING_TYPE_DISCRETE_ACPI_POWER: ! case IPMI_EVENT_READING_TYPE_SENSOR_SPECIFIC: ! if ( ipmi_is_state_set(states, i) ) ! { ! zabbix_log(LOG_LEVEL_DEBUG, ">>> State %i is set",i); ! s->discrete = i; ! zabbix_log(LOG_LEVEL_DEBUG, ">>> New value: %u",s->discrete); ! goto discrete_done; ! } ! break; ! } } + discrete_done:h->done = 1; } ! ! static void read_ipmi_sensor(zbx_ipmi_host_t *h, zbx_ipmi_sensor_t *s) { int type, ret; *************** *** 405,417 **** zabbix_log(LOG_LEVEL_DEBUG, "In read_ipmi_sensor() %s@[%s]:%d", s->s_name, h->ip, h->port); - h->ret = SUCCEED; h->done = 0; type = ipmi_sensor_get_event_reading_type(s->sensor); switch (type) { case IPMI_EVENT_READING_TYPE_THRESHOLD: if (0 != (ret = ipmi_sensor_get_reading(s->sensor, got_thresh_reading, h))) { h->err = zbx_dsprintf(h->err, "Cannot read sensor %s." --- 451,465 ---- zabbix_log(LOG_LEVEL_DEBUG, "In read_ipmi_sensor() %s@[%s]:%d", s->s_name, h->ip, h->port); h->done = 0; type = ipmi_sensor_get_event_reading_type(s->sensor); + zabbix_log(LOG_LEVEL_DEBUG, " -> Type: %i", type); switch (type) { case IPMI_EVENT_READING_TYPE_THRESHOLD: + zabbix_log(LOG_LEVEL_DEBUG, " - Type: Threshold"); + if (0 != (ret = ipmi_sensor_get_reading(s->sensor, got_thresh_reading, h))) { h->err = zbx_dsprintf(h->err, "Cannot read sensor %s." *************** *** 421,438 **** return; } break; ! default: ! h->err = zbx_dsprintf(h->err, "Discrete sensor is not supported."); ! h->ret = NOTSUPPORTED; ! return; ! /* if (0 != (ret = ipmi_sensor_get_states(s->sensor, got_discrete_states, h))) { h->err = zbx_dsprintf(h->err, "Cannot read sensor %s." " ipmi_sensor_get_states() return error: 0x%x", s->s_name, ret); h->ret = NOTSUPPORTED; return; ! }*/ } tv.tv_sec = 10; --- 469,505 ---- return; } break; ! case IPMI_EVENT_READING_TYPE_DISCRETE_USAGE: ! case IPMI_EVENT_READING_TYPE_DISCRETE_STATE: ! case IPMI_EVENT_READING_TYPE_DISCRETE_PREDICTIVE_FAILURE: ! case IPMI_EVENT_READING_TYPE_DISCRETE_LIMIT_EXCEEDED: ! case IPMI_EVENT_READING_TYPE_DISCRETE_PERFORMANCE_MET: ! case IPMI_EVENT_READING_TYPE_DISCRETE_SEVERITY: ! case IPMI_EVENT_READING_TYPE_DISCRETE_DEVICE_PRESENCE: ! case IPMI_EVENT_READING_TYPE_DISCRETE_DEVICE_ENABLE: ! case IPMI_EVENT_READING_TYPE_DISCRETE_AVAILABILITY: ! case IPMI_EVENT_READING_TYPE_DISCRETE_REDUNDANCY: ! case IPMI_EVENT_READING_TYPE_DISCRETE_ACPI_POWER: ! zabbix_log(LOG_LEVEL_DEBUG, " - Type: Discrete"); ! ! //AAL 20081211 ! // h->err = zbx_dsprintf(h->err, "Discrete sensor is not supported."); ! // h->ret = NOTSUPPORTED; ! ! if (0 != (ret = ipmi_sensor_get_states(s->sensor, got_discrete_states, h))) { + //AAL 20081211 + zabbix_log(LOG_LEVEL_DEBUG, " - Cannot read sensor: %s", s->s_name); + h->err = zbx_dsprintf(h->err, "Cannot read sensor %s." " ipmi_sensor_get_states() return error: 0x%x", s->s_name, ret); h->ret = NOTSUPPORTED; return; ! } ! break; ! default: ! zabbix_log(LOG_LEVEL_WARNING, "*** IPMI reading type not handled: %i", type); } tv.tv_sec = 10; *************** *** 901,906 **** --- 968,979 ---- zabbix_log(LOG_LEVEL_DEBUG, "Sensor or control %s@[%s]:%d does not exist", item->ipmi_sensor, h->ip, h->port); SET_MSG_RESULT(value, strdup("Sensor or control does not exist")); + + //AAL 20081211 + int i; + zabbix_log(LOG_LEVEL_DEBUG, "Available Sensors:"); + for (i = 0; i < h->sensor_count; i++) + zabbix_log(LOG_LEVEL_DEBUG, "- %s", h->sensors[i].s_name); return NOTSUPPORTED; } *************** *** 920,926 **** } if (NULL != s) ! SET_DBL_RESULT(value, s->value); if (NULL != c) SET_DBL_RESULT(value, c->val[0]); --- 993,1019 ---- } if (NULL != s) ! { ! switch (ipmi_sensor_get_event_reading_type(s->sensor)) { ! // Store threshold sensor values ! case IPMI_EVENT_READING_TYPE_THRESHOLD: ! zabbix_log(LOG_LEVEL_DEBUG, "Saving value '%f' for %s", s->value, item->ipmi_sensor); ! SET_DBL_RESULT(value, s->value); ! break; ! ! // Store discrete sensor value ! default: ! if ( s->discrete < 65536 ) ! { ! zabbix_log(LOG_LEVEL_DEBUG, "TODO: Save value '%u' for %s", s->discrete, item->ipmi_sensor); ! SET_UI64_RESULT(value, s->discrete); ! } ! else ! { ! zabbix_log(LOG_LEVEL_DEBUG, "Invalid value (%u) received for %s", s->discrete, item->ipmi_sensor); ! } ! } ! } if (NULL != c) SET_DBL_RESULT(value, c->val[0]);