int get_value_ssh(DC_ITEM *item, AGENT_RESULT *result) { AGENT_REQUEST request; int ret = NOTSUPPORTED; const char *port, *encoding, *dns; init_request(&request); if (SUCCEED != parse_item_key(item->key, &request)) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid item key format.")); goto out; } if (0 != strcmp(SSH_RUN_KEY, get_rkey(&request))) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Unsupported item key for this item type.")); goto out; } if (4 < get_rparams_num(&request)) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); goto out; } if (NULL != (dns = get_rparam(&request, 1)) && '\0' != *dns) { strscpy(item->interface.dns_orig, dns); item->interface.addr = item->interface.dns_orig; } if (NULL != (port = get_rparam(&request, 2)) && '\0' != *port) { if (FAIL == is_ushort(port, &item->interface.port)) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid third parameter.")); goto out; } } else item->interface.port = ZBX_DEFAULT_SSH_PORT; encoding = get_rparam(&request, 3); ret = ssh_run(item, result, ZBX_NULL2EMPTY_STR(encoding)); out: free_request(&request); return ret; }
/****************************************************************************** * * * Function: zbx_get_value_internal_ext * * * * Purpose: processes program type (proxy) specific internal checks * * * * Parameters: param1 - [IN] the first parameter * * request - [IN] the request * * result - [OUT] the result * * * * Return value: SUCCEED - data successfully retrieved and stored in result * * NOTSUPPORTED - requested item is not supported * * FAIL - not a proxy specific internal check * * * * Comments: This function is used to process proxy specific internal checks * * before generic internal checks are processed. * * * ******************************************************************************/ int zbx_get_value_internal_ext(const char *param1, const AGENT_REQUEST *request, AGENT_RESULT *result) { if (0 == strcmp(param1, "proxy_history")) { if (1 != get_rparams_num(request)) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid number of parameters.")); return NOTSUPPORTED; } SET_UI64_RESULT(result, proxy_get_history_count()); } else return FAIL; return SUCCEED; }
/****************************************************************************** * * * Function: process_trap_for_interface * * * * Purpose: add trap to all matching items for the specified interface * * * * Return value: SUCCEED - a matching item was found * * FAIL - no matching item was found (including fallback items) * * * * Author: Rudolfs Kreicbergs * * * ******************************************************************************/ static int process_trap_for_interface(zbx_uint64_t interfaceid, char *trap, zbx_timespec_t *ts) { DC_ITEM *items = NULL; const char *regex; char error[ITEM_ERROR_LEN_MAX]; size_t num, i; int ret = FAIL, fb = -1, *lastclocks = NULL, *errcodes = NULL; zbx_uint64_t *itemids = NULL; unsigned char *states = NULL; AGENT_RESULT *results = NULL; AGENT_REQUEST request; zbx_vector_ptr_t regexps; zbx_vector_ptr_create(®exps); num = DCconfig_get_snmp_items_by_interfaceid(interfaceid, &items); itemids = zbx_malloc(itemids, sizeof(zbx_uint64_t) * num); states = zbx_malloc(states, sizeof(unsigned char) * num); lastclocks = zbx_malloc(lastclocks, sizeof(int) * num); errcodes = zbx_malloc(errcodes, sizeof(int) * num); results = zbx_malloc(results, sizeof(AGENT_RESULT) * num); for (i = 0; i < num; i++) { init_result(&results[i]); errcodes[i] = FAIL; items[i].key = zbx_strdup(items[i].key, items[i].key_orig); if (SUCCEED != substitute_key_macros(&items[i].key, NULL, &items[i], NULL, MACRO_TYPE_ITEM_KEY, error, sizeof(error))) { SET_MSG_RESULT(&results[i], zbx_strdup(NULL, error)); errcodes[i] = NOTSUPPORTED; continue; } if (0 == strcmp(items[i].key, "snmptrap.fallback")) { fb = i; continue; } init_request(&request); if (SUCCEED != parse_item_key(items[i].key, &request)) goto next; if (0 != strcmp(get_rkey(&request), "snmptrap")) goto next; if (1 < get_rparams_num(&request)) goto next; if (NULL != (regex = get_rparam(&request, 0))) { if ('@' == *regex) { DCget_expressions_by_name(®exps, regex + 1); if (0 == regexps.values_num) { SET_MSG_RESULT(&results[i], zbx_dsprintf(NULL, "Global regular expression \"%s\" does not exist.", regex + 1)); errcodes[i] = NOTSUPPORTED; goto next; } } if (SUCCEED != regexp_match_ex(®exps, trap, regex, ZBX_CASE_SENSITIVE)) goto next; } if (SUCCEED == set_result_type(&results[i], items[i].value_type, items[i].data_type, trap)) errcodes[i] = SUCCEED; else errcodes[i] = NOTSUPPORTED; ret = SUCCEED; next: free_request(&request); } if (FAIL == ret && -1 != fb) { if (SUCCEED == set_result_type(&results[fb], items[fb].value_type, items[fb].data_type, trap)) errcodes[fb] = SUCCEED; else errcodes[fb] = NOTSUPPORTED; ret = SUCCEED; } for (i = 0; i < num; i++) { switch (errcodes[i]) { case SUCCEED: if (ITEM_VALUE_TYPE_LOG == items[i].value_type) { calc_timestamp(results[i].log->value, &results[i].log->timestamp, items[i].logtimefmt); } items[i].state = ITEM_STATE_NORMAL; dc_add_history(items[i].itemid, items[i].value_type, items[i].flags, &results[i], ts, items[i].state, NULL); itemids[i] = items[i].itemid; states[i] = items[i].state; lastclocks[i] = ts->sec; break; case NOTSUPPORTED: items[i].state = ITEM_STATE_NOTSUPPORTED; dc_add_history(items[i].itemid, items[i].value_type, items[i].flags, NULL, ts, items[i].state, results[i].msg); itemids[i] = items[i].itemid; states[i] = items[i].state; lastclocks[i] = ts->sec; break; } zbx_free(items[i].key); free_result(&results[i]); } zbx_free(results); DCrequeue_items(itemids, states, lastclocks, NULL, NULL, errcodes, num); zbx_free(errcodes); zbx_free(lastclocks); zbx_free(states); zbx_free(itemids); DCconfig_clean_items(items, NULL, num); zbx_free(items); zbx_regexp_clean_expressions(®exps); zbx_vector_ptr_destroy(®exps); dc_flush_history(); return ret; }
/****************************************************************************** * * * Function: get_value_aggregate * * * * Purpose: retrieve data from Zabbix server (aggregate items) * * * * Parameters: item - item we are interested in * * * * Return value: SUCCEED - data successfully retrieved and stored in result * * and result_str (as string) * * NOTSUPPORTED - requested item is not supported * * * * Author: Alexei Vladishev * * * ******************************************************************************/ int get_value_aggregate(DC_ITEM *item, AGENT_RESULT *result) { const char *__function_name = "get_value_aggregate"; AGENT_REQUEST request; int ret = NOTSUPPORTED; const char *tmp, *groups, *itemkey, *funcp = NULL; int grp_func, item_func, params_num; zabbix_log(LOG_LEVEL_DEBUG, "In %s() key:'%s'", __function_name, item->key_orig); init_request(&request); if (ITEM_VALUE_TYPE_FLOAT != item->value_type && ITEM_VALUE_TYPE_UINT64 != item->value_type) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Value type must be Numeric for aggregate items")); goto out; } if (SUCCEED != parse_item_key(item->key, &request)) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid item key format.")); goto out; } if (0 == strcmp(get_rkey(&request), "grpmin")) { grp_func = ZBX_VALUE_FUNC_MIN; } else if (0 == strcmp(get_rkey(&request), "grpavg")) { grp_func = ZBX_VALUE_FUNC_AVG; } else if (0 == strcmp(get_rkey(&request), "grpmax")) { grp_func = ZBX_VALUE_FUNC_MAX; } else if (0 == strcmp(get_rkey(&request), "grpsum")) { grp_func = ZBX_VALUE_FUNC_SUM; } else { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid item key.")); goto out; } params_num = get_rparams_num(&request); if (3 > params_num || params_num > 4) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid number of parameters.")); goto out; } groups = get_rparam(&request, 0); itemkey = get_rparam(&request, 1); tmp = get_rparam(&request, 2); if (0 == strcmp(tmp, "min")) item_func = ZBX_VALUE_FUNC_MIN; else if (0 == strcmp(tmp, "avg")) item_func = ZBX_VALUE_FUNC_AVG; else if (0 == strcmp(tmp, "max")) item_func = ZBX_VALUE_FUNC_MAX; else if (0 == strcmp(tmp, "sum")) item_func = ZBX_VALUE_FUNC_SUM; else if (0 == strcmp(tmp, "count")) item_func = ZBX_VALUE_FUNC_COUNT; else if (0 == strcmp(tmp, "last")) item_func = ZBX_VALUE_FUNC_LAST; else { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid third parameter.")); goto out; } if (4 == params_num) { funcp = get_rparam(&request, 3); } else if (3 == params_num && ZBX_VALUE_FUNC_LAST != item_func) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid number of parameters.")); goto out; } if (SUCCEED != evaluate_aggregate(item, result, grp_func, groups, itemkey, item_func, funcp)) goto out; ret = SUCCEED; out: free_request(&request); zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret)); return ret; }