--- ./include/zbxserver.h.orig 2010-10-31 01:00:17.000000000 +0400 +++ ./include/zbxserver.h 2010-11-01 01:38:03.000000000 +0300 @@ -47,6 +47,7 @@ DC_ITEM *dc_item, DB_ESCALATION *escalation, char **data, int macro_type, char *error, int maxerrlen); void substitute_macros(DB_EVENT *event, DB_ACTION *action, DB_ESCALATION *escalation, char **data); +void substitute_user_macros(char **data, const char *key, zbx_uint64_t hostid); int evaluate_expression(int *result, char **expression, time_t now, zbx_uint64_t trigggerid, int trigger_value, char *error, int maxerrlen); --- ./src/zabbix_server/poller/checks_snmp.c.orig 2010-10-31 01:00:17.000000000 +0400 +++ ./src/zabbix_server/poller/checks_snmp.c 2010-11-01 02:00:33.000000000 +0300 @@ -178,6 +178,7 @@ const char *__function_name = "snmp_open_session"; struct snmp_session session, *ss = NULL; char addr[128], *conn; + char *p = NULL; #ifdef HAVE_IPV6 int family; #endif /* HAVE_IPV6 */ @@ -212,7 +213,10 @@ if (session.version == SNMP_VERSION_1 || session.version == SNMP_VERSION_2c) { - session.community = (u_char *)item->snmp_community; + p = zbx_malloc(p, sizeof(item->snmp_community)); + zbx_strlcpy(p, item->snmp_community, sizeof(item->snmp_community)); + substitute_user_macros(&p, item->key, item->host.hostid); + session.community = (u_char *)p; session.community_len = strlen((void *)session.community); zabbix_log(LOG_LEVEL_DEBUG, "SNMP [%s@%s]", session.community, session.peername); } @@ -301,6 +305,7 @@ zbx_snprintf(err, MAX_STRING_LEN, "Error doing snmp_open()"); } end: + zbx_free(p); zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __function_name); return ss; @@ -867,6 +872,7 @@ char err[MAX_STRING_LEN]; char *pl; int idx, num, ret = SUCCEED; + char *snmp_oid = NULL; zabbix_log(LOG_LEVEL_DEBUG, "In %s() key:'%s' oid:'%s'", __function_name, item->key_orig, item->snmp_oid); @@ -881,19 +887,23 @@ goto out; } - num = num_key_param(item->snmp_oid); + snmp_oid = zbx_malloc(snmp_oid, sizeof(item->snmp_oid)); + zbx_strlcpy(snmp_oid, item->snmp_oid, sizeof(item->snmp_oid)); + substitute_user_macros(&snmp_oid, item->key, item->host.hostid); + + num = num_key_param(snmp_oid); if (0 != (ZBX_FLAG_DISCOVERY & item->flags)) { switch (num) { case 0: - snmp_normalize(oid_normalized, item->snmp_oid, sizeof(oid_normalized)); + snmp_normalize(oid_normalized, snmp_oid, sizeof(oid_normalized)); ret = snmp_walk(ss, item, oid_normalized, value); break; default: SET_MSG_RESULT(value, zbx_dsprintf(NULL, "OID [%s] contains unsupported parameters", - item->snmp_oid)); + snmp_oid)); ret = NOTSUPPORTED; } } @@ -903,7 +913,7 @@ { case 0: zabbix_log(LOG_LEVEL_DEBUG, "Standard processing"); - snmp_normalize(oid_normalized, item->snmp_oid, sizeof(oid_normalized)); + snmp_normalize(oid_normalized, snmp_oid, sizeof(oid_normalized)); ret = get_snmp(ss, item, oid_normalized, value); break; case 3: @@ -911,12 +921,12 @@ { zabbix_log(LOG_LEVEL_DEBUG, "Special processing"); - if (get_key_param(item->snmp_oid, 1, method, sizeof(method)) != 0 - || get_key_param(item->snmp_oid, 2, oid_index, MAX_STRING_LEN) != 0 - || get_key_param(item->snmp_oid, 3, index_value, MAX_STRING_LEN) != 0) + if (get_key_param(snmp_oid, 1, method, sizeof(method)) != 0 + || get_key_param(snmp_oid, 2, oid_index, MAX_STRING_LEN) != 0 + || get_key_param(snmp_oid, 3, index_value, MAX_STRING_LEN) != 0) { SET_MSG_RESULT(value, zbx_dsprintf(NULL, "Cannot retrieve all three parameters from [%s]", - item->snmp_oid)); + snmp_oid)); ret = NOTSUPPORTED; break; } @@ -929,7 +939,7 @@ { SET_MSG_RESULT(value, zbx_dsprintf(NULL, "Unsupported method [%s] in the OID [%s]", method, - item->snmp_oid)); + snmp_oid)); ret = NOTSUPPORTED; break; } @@ -948,7 +958,7 @@ SET_MSG_RESULT(value, zbx_dsprintf(NULL, "Cannot find index [%s] of the OID [%s]: %s", oid_index, - item->snmp_oid, + snmp_oid, err)); ret = NOTSUPPORTED; break; @@ -958,16 +968,16 @@ zabbix_log(LOG_LEVEL_DEBUG, "Found index:%d", idx); - if (NULL == (pl = strchr(item->snmp_oid, '['))) + if (NULL == (pl = strchr(snmp_oid, '['))) { SET_MSG_RESULT(value, zbx_dsprintf(NULL, "Cannot find left bracket in the OID [%s]", - item->snmp_oid)); + snmp_oid)); ret = NOTSUPPORTED; break; } *pl = '\0'; - snmp_normalize(oid_normalized, item->snmp_oid, sizeof(oid_normalized)); + snmp_normalize(oid_normalized, snmp_oid, sizeof(oid_normalized)); *pl = '['; zbx_snprintf(oid_full, sizeof(oid_full), "%s.%d", oid_normalized, idx); @@ -979,12 +989,13 @@ break; default: SET_MSG_RESULT(value, zbx_dsprintf(NULL, "OID [%s] contains unsupported parameters", - item->snmp_oid)); + snmp_oid)); ret = NOTSUPPORTED; } } snmp_close_session(ss); + zbx_free(snmp_oid); out: zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret)); --- ./src/libs/zbxserver/expression.c.orig 2010-10-31 01:00:17.000000000 +0400 +++ ./src/libs/zbxserver/expression.c 2010-11-01 01:38:03.000000000 +0300 @@ -803,7 +803,7 @@ /****************************************************************************** * * - * Function: item_description * + * Function: substitute_user_macros * * * * Purpose: substitute key parameters and user macros in * * the item description string with real values * @@ -817,7 +817,7 @@ * Comments: * * * ******************************************************************************/ -static void item_description(char **data, const char *key, zbx_uint64_t hostid) +void substitute_user_macros(char **data, const char *key, zbx_uint64_t hostid) { char c, *p, *m, *n, *str_out = NULL, *replace_to = NULL, params[MAX_STRING_LEN], param[MAX_STRING_LEN]; @@ -955,7 +955,7 @@ break; case ZBX_REQUEST_ITEM_NAME: *replace_to = zbx_dsprintf(*replace_to, "%s", item.description); - item_description(replace_to, item.key, item.hostid); + substitute_user_macros(replace_to, item.key, item.hostid); ret = SUCCEED; break; case ZBX_REQUEST_ITEM_KEY: