static int mb_config_add_slave (mb_host_t *host, oconfig_item_t *ci) /* {{{ */ { mb_slave_t *slave; int status; int i; if ((host == NULL) || (ci == NULL)) return (EINVAL); slave = realloc (host->slaves, sizeof (*slave) * (host->slaves_num + 1)); if (slave == NULL) return (ENOMEM); host->slaves = slave; slave = host->slaves + host->slaves_num; memset (slave, 0, sizeof (*slave)); slave->collect = NULL; status = cf_util_get_int (ci, &slave->id); if (status != 0) return (status); for (i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; status = 0; if (strcasecmp ("Instance", child->key) == 0) status = cf_util_get_string_buffer (child, slave->instance, sizeof (slave->instance)); else if (strcasecmp ("Collect", child->key) == 0) { char buffer[1024]; status = cf_util_get_string_buffer (child, buffer, sizeof (buffer)); if (status == 0) data_copy_by_name (&slave->collect, data_definitions, buffer); status = 0; /* continue after failure. */ } else { ERROR ("Modbus plugin: Unknown configuration option: %s", child->key); status = -1; } if (status != 0) break; } if ((status == 0) && (slave->collect == NULL)) status = EINVAL; if (slave->id < 0) status = EINVAL; if (status == 0) host->slaves_num++; else /* if (status != 0) */ data_free_all (slave->collect); return (status); } /* }}} int mb_config_add_slave */
static int dpdk_stats_config(oconfig_item_t *ci) { DPDK_STATS_TRACE(); int ret = dpdk_stats_preinit(); if (ret) return ret; dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(g_hc); for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if ((strcasecmp("EnabledPortMask", child->key) == 0) && (child->values[0].type == OCONFIG_TYPE_NUMBER)) { ctx->config.enabled_port_mask = child->values[0].value.number; DEBUG("%s: Enabled Port Mask 0x%X", DPDK_STATS_PLUGIN, ctx->config.enabled_port_mask); } else if (strcasecmp("SharedMemObj", child->key) == 0) { cf_util_get_string_buffer(child, g_shm_name, sizeof(g_shm_name)); DEBUG("%s: Shared memory object %s", DPDK_STATS_PLUGIN, g_shm_name); dpdk_stats_reinit_helper(); } else if (strcasecmp("EAL", child->key) == 0) { ret = dpdk_helper_eal_config_parse(g_hc, child); if (ret) return ret; } } int port_num = 0; /* parse port names after EnabledPortMask was parsed */ for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("PortName", child->key) == 0) { while (!(ctx->config.enabled_port_mask & (1 << port_num))) port_num++; cf_util_get_string_buffer(child, ctx->config.port_name[port_num], sizeof(ctx->config.port_name[port_num])); DEBUG("%s: Port %d Name: %s", DPDK_STATS_PLUGIN, port_num, ctx->config.port_name[port_num]); port_num++; } } return ret; }
static int csnmp_config_add_host_priv_protocol (host_definition_t *hd, oconfig_item_t *ci) { char buffer[4]; int status; status = cf_util_get_string_buffer(ci, buffer, sizeof(buffer)); if (status != 0) return status; if (strcasecmp("AES", buffer) == 0) { hd->priv_protocol = usmAESPrivProtocol; hd->priv_protocol_len = sizeof(usmAESPrivProtocol)/sizeof(oid); } else if (strcasecmp("DES", buffer) == 0) { hd->priv_protocol = usmDESPrivProtocol; hd->priv_protocol_len = sizeof(usmDESPrivProtocol)/sizeof(oid); } else { WARNING ("snmp plugin: The `PrivProtocol' config option must be `AES' or `DES'."); return (-1); } DEBUG ("snmp plugin: host = %s; host->priv_protocol = %s;", hd->name, hd->priv_protocol == usmAESPrivProtocol ? "AES" : "DES"); return (0); } /* int csnmp_config_add_host_priv_protocol */
static int csnmp_config_add_host_security_level (host_definition_t *hd, oconfig_item_t *ci) { char buffer[16]; int status; status = cf_util_get_string_buffer(ci, buffer, sizeof(buffer)); if (status != 0) return status; if (strcasecmp("noAuthNoPriv", buffer) == 0) hd->security_level = SNMP_SEC_LEVEL_NOAUTH; else if (strcasecmp("authNoPriv", buffer) == 0) hd->security_level = SNMP_SEC_LEVEL_AUTHNOPRIV; else if (strcasecmp("authPriv", buffer) == 0) hd->security_level = SNMP_SEC_LEVEL_AUTHPRIV; else { WARNING ("snmp plugin: The `SecurityLevel' config option must be `noAuthNoPriv', `authNoPriv', or `authPriv'."); return (-1); } DEBUG ("snmp plugin: host = %s; host->security_level = %d;", hd->name, hd->security_level); return (0); } /* int csnmp_config_add_host_security_level */
static int lua_config_script(const oconfig_item_t *ci) /* {{{ */ { char rel_path[PATH_MAX]; int status = cf_util_get_string_buffer(ci, rel_path, sizeof(rel_path)); if (status != 0) return (status); char abs_path[PATH_MAX]; if (base_path[0] == '\0') sstrncpy(abs_path, rel_path, sizeof(abs_path)); else ssnprintf(abs_path, sizeof(abs_path), "%s/%s", base_path, rel_path); DEBUG("Lua plugin: abs_path = \"%s\";", abs_path); status = lua_script_load(abs_path); if (status != 0) return (status); INFO("Lua plugin: File \"%s\" loaded succesfully", abs_path); return 0; } /* }}} int lua_config_script */
static int csnmp_config_add_data_instance (data_definition_t *dd, oconfig_item_t *ci) { char buffer[DATA_MAX_NAME_LEN]; int status; status = cf_util_get_string_buffer(ci, buffer, sizeof(buffer)); if (status != 0) return status; if (dd->is_table) { /* Instance is an OID */ dd->instance.oid.oid_len = MAX_OID_LEN; if (!read_objid (buffer, dd->instance.oid.oid, &dd->instance.oid.oid_len)) { ERROR ("snmp plugin: read_objid (%s) failed.", buffer); return (-1); } } else { /* Instance is a simple string */ sstrncpy (dd->instance.string, buffer, sizeof (dd->instance.string)); } return (0); } /* int csnmp_config_add_data_instance */
static int csnmp_config_add_host_auth_protocol (host_definition_t *hd, oconfig_item_t *ci) { char buffer[4]; int status; status = cf_util_get_string_buffer(ci, buffer, sizeof(buffer)); if (status != 0) return status; if (strcasecmp("MD5", buffer) == 0) { hd->auth_protocol = usmHMACMD5AuthProtocol; hd->auth_protocol_len = sizeof(usmHMACMD5AuthProtocol)/sizeof(oid); } else if (strcasecmp("SHA", buffer) == 0) { hd->auth_protocol = usmHMACSHA1AuthProtocol; hd->auth_protocol_len = sizeof(usmHMACSHA1AuthProtocol)/sizeof(oid); } else { WARNING ("snmp plugin: The `AuthProtocol' config option must be `MD5' or `SHA'."); return (-1); } DEBUG ("snmp plugin: host = %s; host->auth_protocol = %s;", hd->name, hd->auth_protocol == usmHMACMD5AuthProtocol ? "MD5" : "SHA"); return (0); } /* int csnmp_config_add_host_auth_protocol */
static int redis_config_node (oconfig_item_t *ci) /* {{{ */ { redis_node_t rn; int i; int status; memset (&rn, 0, sizeof (rn)); sstrncpy (rn.host, REDIS_DEF_HOST, sizeof (rn.host)); rn.port = REDIS_DEF_PORT; rn.timeout = REDIS_DEF_TIMEOUT; status = cf_util_get_string_buffer (ci, rn.name, sizeof (rn.name)); if (status != 0) return (status); for (i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; if (strcasecmp ("Host", option->key) == 0) status = cf_util_get_string_buffer (option, rn.host, sizeof (rn.host)); else if (strcasecmp ("Port", option->key) == 0) { status = cf_util_get_port_number (option); if (status > 0) { rn.port = status; status = 0; } } else if (strcasecmp ("Timeout", option->key) == 0) status = cf_util_get_int (option, &rn.timeout); else if (strcasecmp ("Password", option->key) == 0) status = cf_util_get_string_buffer (option, rn.passwd, sizeof (rn.passwd)); else WARNING ("redis plugin: Option `%s' not allowed inside a `Node' " "block. I'll ignore this option.", option->key); if (status != 0) break; } if (status != 0) return (status); return (redis_node_add (&rn)); } /* }}} int redis_config_node */
static int dpdk_events_keep_alive_config(dpdk_events_ctx_t *ec, oconfig_item_t *ci) { ec->config.keep_alive.enabled = 1; DEBUG(DPDK_EVENTS_PLUGIN ": Subscribed for Keep Alive Events."); for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("SendEventsOnUpdate", child->key) == 0) { if (cf_util_get_boolean(child, &ec->config.keep_alive.send_updated)) return -1; DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:SendEventsOnUpdate %d", ec->config.keep_alive.send_updated); } else if (strcasecmp("LCoreMask", child->key) == 0) { char lcore_mask[DATA_MAX_NAME_LEN]; if (cf_util_get_string_buffer(child, lcore_mask, sizeof(lcore_mask))) return -1; ec->config.keep_alive.lcore_mask = str_to_uint128(lcore_mask, strlen(lcore_mask)); DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:LCoreMask 0x%" PRIX64 "%" PRIX64 "", ec->config.keep_alive.lcore_mask.high, ec->config.keep_alive.lcore_mask.low); } else if (strcasecmp("KeepAliveShmName", child->key) == 0) { if (cf_util_get_string_buffer(child, ec->config.keep_alive.shm_name, sizeof(ec->config.keep_alive.shm_name))) return -1; DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:KeepAliveShmName %s", ec->config.keep_alive.shm_name); } else if (strcasecmp("SendNotification", child->key) == 0) { if (cf_util_get_boolean(child, &ec->config.keep_alive.notify)) return -1; DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:SendNotification %d", ec->config.keep_alive.notify); } else { ERROR(DPDK_EVENTS_PLUGIN ": unrecognized configuration option %s.", child->key); return -1; } } return 0; }
static int dpdk_events_link_status_config(dpdk_events_ctx_t *ec, oconfig_item_t *ci) { ec->config.link_status.enabled = 1; DEBUG(DPDK_EVENTS_PLUGIN ": Subscribed for Link Status Events."); for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("EnabledPortMask", child->key) == 0) { if (cf_util_get_int(child, (int *)&ec->config.link_status.enabled_port_mask)) return -1; DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:Enabled Port Mask 0x%X", ec->config.link_status.enabled_port_mask); } else if (strcasecmp("SendEventsOnUpdate", child->key) == 0) { if (cf_util_get_boolean(child, &ec->config.link_status.send_updated)) return -1; DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:SendEventsOnUpdate %d", ec->config.link_status.send_updated); } else if (strcasecmp("SendNotification", child->key) == 0) { if (cf_util_get_boolean(child, &ec->config.link_status.notify)) return -1; DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:SendNotification %d", ec->config.link_status.notify); } else if (strcasecmp("PortName", child->key) != 0) { ERROR(DPDK_EVENTS_PLUGIN ": unrecognized configuration option %s.", child->key); return -1; } } int port_num = 0; /* parse port names after EnabledPortMask was parsed */ for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("PortName", child->key) == 0) { while (!(ec->config.link_status.enabled_port_mask & (1 << port_num))) port_num++; if (cf_util_get_string_buffer( child, ec->config.link_status.port_name[port_num], sizeof(ec->config.link_status.port_name[port_num]))) { return -1; } DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:Port %d Name: %s", port_num, ec->config.link_status.port_name[port_num]); port_num++; } } return 0; }
static redis_query_t *redis_config_query (oconfig_item_t *ci) /* {{{ */ { redis_query_t *rq; int status; int i; rq = calloc(1, sizeof(*rq)); if (rq == NULL) { ERROR("redis plugin: calloc failed adding redis_query."); return NULL; } status = cf_util_get_string_buffer(ci, rq->query, sizeof(rq->query)); if (status != 0) goto err; /* * Default to a gauge type. */ (void)strncpy(rq->type, "gauge", sizeof(rq->type)); (void)sstrncpy(rq->instance, rq->query, sizeof(rq->instance)); replace_special(rq->instance, sizeof(rq->instance)); for (i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; if (strcasecmp("Type", option->key) == 0) { status = cf_util_get_string_buffer(option, rq->type, sizeof(rq->type)); } else if (strcasecmp("Instance", option->key) == 0) { status = cf_util_get_string_buffer(option, rq->instance, sizeof(rq->instance)); } else { WARNING("redis plugin: unknown configuration option: %s", option->key); status = -1; } if (status != 0) goto err; } return rq; err: free(rq); return NULL; } /* }}} */
static int cloudpower_config_node (oconfig_item_t *ci) { cloudpower_node_t cpn; int i; int status; memset (&cpn, 0, sizeof (cpn)); status = cf_util_get_string_buffer (ci, cpn.name, sizeof (cpn.name)); if (status != 0) { return (status); } for (i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; if (strcasecmp ("Host", option->key) == 0) { status = cf_util_get_string_buffer (option, cpn.host, sizeof (cpn.host)); } else { WARNING ("cloudpower plugin: Option `%s' not allowed inside a `Node' block. I'll ignore this option.", option->key); } if (status != 0) break; } if (status != 0) { return (status); } return (cloudpower_node_add (&cpn)); }
static int lua_config_base_path(const oconfig_item_t *ci) /* {{{ */ { int status = cf_util_get_string_buffer(ci, base_path, sizeof(base_path)); if (status != 0) return (status); size_t len = strlen(base_path); while ((len > 0) && (base_path[len - 1] == '/')) { len--; base_path[len] = '\0'; } DEBUG("Lua plugin: base_path = \"%s\";", base_path); return (0); } /* }}} int lua_config_base_path */
static int ut_config_plugin(const threshold_t *th_orig, oconfig_item_t *ci) { threshold_t th; int status = 0; if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) { WARNING("threshold values: The `Plugin' block needs exactly one string " "argument."); return -1; } if (ci->children_num < 1) { WARNING("threshold values: The `Plugin' block needs at least one nested " "block."); return -1; } memcpy(&th, th_orig, sizeof(th)); sstrncpy(th.plugin, ci->values[0].value.string, sizeof(th.plugin)); for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; if (strcasecmp("Type", option->key) == 0) status = ut_config_type(&th, option); else if (strcasecmp("Instance", option->key) == 0) status = cf_util_get_string_buffer(option, th.plugin_instance, sizeof(th.plugin_instance)); else { WARNING("threshold values: Option `%s' not allowed inside a `Plugin' " "block.", option->key); status = -1; } if (status != 0) break; } return status; } /* int ut_config_plugin */
/* * Configuration * ============= * The following approximately two hundred functions are used to handle the * configuration and fill the threshold list. * {{{ */ static int ut_config_type(const threshold_t *th_orig, oconfig_item_t *ci) { threshold_t th; int status = 0; if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) { WARNING("threshold values: The `Type' block needs exactly one string " "argument."); return -1; } if (ci->children_num < 1) { WARNING("threshold values: The `Type' block needs at least one option."); return -1; } memcpy(&th, th_orig, sizeof(th)); sstrncpy(th.type, ci->values[0].value.string, sizeof(th.type)); th.warning_min = NAN; th.warning_max = NAN; th.failure_min = NAN; th.failure_max = NAN; th.hits = 0; th.hysteresis = 0; th.flags = UT_FLAG_INTERESTING; /* interesting by default */ for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; if (strcasecmp("Instance", option->key) == 0) status = cf_util_get_string_buffer(option, th.type_instance, sizeof(th.type_instance)); else if (strcasecmp("DataSource", option->key) == 0) status = cf_util_get_string_buffer(option, th.data_source, sizeof(th.data_source)); else if (strcasecmp("WarningMax", option->key) == 0) status = cf_util_get_double(option, &th.warning_max); else if (strcasecmp("FailureMax", option->key) == 0) status = cf_util_get_double(option, &th.failure_max); else if (strcasecmp("WarningMin", option->key) == 0) status = cf_util_get_double(option, &th.warning_min); else if (strcasecmp("FailureMin", option->key) == 0) status = cf_util_get_double(option, &th.failure_min); else if (strcasecmp("Interesting", option->key) == 0) status = cf_util_get_flag(option, &th.flags, UT_FLAG_INTERESTING); else if (strcasecmp("Invert", option->key) == 0) status = cf_util_get_flag(option, &th.flags, UT_FLAG_INVERT); else if (strcasecmp("Persist", option->key) == 0) status = cf_util_get_flag(option, &th.flags, UT_FLAG_PERSIST); else if (strcasecmp("PersistOK", option->key) == 0) status = cf_util_get_flag(option, &th.flags, UT_FLAG_PERSIST_OK); else if (strcasecmp("Percentage", option->key) == 0) status = cf_util_get_flag(option, &th.flags, UT_FLAG_PERCENTAGE); else if (strcasecmp("Hits", option->key) == 0) status = cf_util_get_int(option, &th.hits); else if (strcasecmp("Hysteresis", option->key) == 0) status = cf_util_get_double(option, &th.hysteresis); else { WARNING("threshold values: Option `%s' not allowed inside a `Type' " "block.", option->key); status = -1; } if (status != 0) break; } if (status == 0) { status = ut_threshold_add(&th); } return status; } /* int ut_config_type */
static int dpdk_stats_config(oconfig_item_t *ci) { DPDK_STATS_TRACE(); int ret = dpdk_stats_preinit(); if (ret) { g_state = DPDK_STAT_STATE_CFG_ERR; return 0; } dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(g_hc); for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("EnabledPortMask", child->key) == 0) ret = cf_util_get_int(child, (int *)&ctx->config.enabled_port_mask); else if (strcasecmp("SharedMemObj", child->key) == 0) { ret = cf_util_get_string_buffer(child, g_shm_name, sizeof(g_shm_name)); if (ret == 0) ret = dpdk_stats_reinit_helper(); } else if (strcasecmp("EAL", child->key) == 0) ret = dpdk_helper_eal_config_parse(g_hc, child); else if (strcasecmp("PortName", child->key) != 0) { ERROR(DPDK_STATS_PLUGIN ": unrecognized configuration option %s", child->key); ret = -1; } if (ret != 0) { g_state = DPDK_STAT_STATE_CFG_ERR; return 0; } } DEBUG(DPDK_STATS_PLUGIN ": Enabled Port Mask 0x%X", ctx->config.enabled_port_mask); DEBUG(DPDK_STATS_PLUGIN ": Shared memory object %s", g_shm_name); int port_num = 0; /* parse port names after EnabledPortMask was parsed */ for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("PortName", child->key) == 0) { while (!(ctx->config.enabled_port_mask & (1 << port_num))) port_num++; if (cf_util_get_string_buffer(child, ctx->config.port_name[port_num], sizeof(ctx->config.port_name[port_num]))) { g_state = DPDK_STAT_STATE_CFG_ERR; return 0; } DEBUG(DPDK_STATS_PLUGIN ": Port %d Name: %s", port_num, ctx->config.port_name[port_num]); port_num++; } } return 0; }
static int riemann_config_node(oconfig_item_t *ci) { struct riemann_host *host = NULL; int status = 0; int i; oconfig_item_t *child; char callback_name[DATA_MAX_NAME_LEN]; user_data_t ud; if ((host = calloc(1, sizeof (*host))) == NULL) { ERROR ("write_riemann plugin: calloc failed."); return ENOMEM; } pthread_mutex_init (&host->lock, NULL); host->reference_count = 1; host->node = NULL; host->service = NULL; host->store_rates = 1; host->always_append_ds = 0; host->use_tcp = 0; status = cf_util_get_string (ci, &host->name); if (status != 0) { WARNING("write_riemann plugin: Required host name is missing."); riemann_free (host); return -1; } for (i = 0; i < ci->children_num; i++) { /* * The code here could be simplified but makes room * for easy adding of new options later on. */ child = &ci->children[i]; status = 0; if (strcasecmp ("Host", child->key) == 0) { status = cf_util_get_string (child, &host->node); if (status != 0) break; } else if (strcasecmp ("Port", child->key) == 0) { status = cf_util_get_service (child, &host->service); if (status != 0) { ERROR ("write_riemann plugin: Invalid argument " "configured for the \"Port\" " "option."); break; } } else if (strcasecmp ("Protocol", child->key) == 0) { char tmp[16]; status = cf_util_get_string_buffer (child, tmp, sizeof (tmp)); if (status != 0) { ERROR ("write_riemann plugin: cf_util_get_" "string_buffer failed with " "status %i.", status); break; } if (strcasecmp ("UDP", tmp) == 0) host->use_tcp = 0; else if (strcasecmp ("TCP", tmp) == 0) host->use_tcp = 1; else WARNING ("write_riemann plugin: The value " "\"%s\" is not valid for the " "\"Protocol\" option. Use " "either \"UDP\" or \"TCP\".", tmp); } else if (strcasecmp ("StoreRates", child->key) == 0) { status = cf_util_get_boolean (child, &host->store_rates); if (status != 0) break; } else if (strcasecmp ("AlwaysAppendDS", child->key) == 0) { status = cf_util_get_boolean (child, &host->always_append_ds); if (status != 0) break; } else { WARNING("write_riemann plugin: ignoring unknown config " "option: \"%s\"", child->key); } } if (status != 0) { riemann_free (host); return status; } ssnprintf (callback_name, sizeof (callback_name), "write_riemann/%s", host->name); ud.data = host; ud.free_func = riemann_free; pthread_mutex_lock (&host->lock); status = plugin_register_write (callback_name, riemann_write, &ud); if (status != 0) WARNING ("write_riemann plugin: plugin_register_write (\"%s\") " "failed with status %i.", callback_name, status); else /* success */ host->reference_count++; status = plugin_register_notification (callback_name, riemann_notification, &ud); if (status != 0) WARNING ("write_riemann plugin: plugin_register_notification (\"%s\") " "failed with status %i.", callback_name, status); else /* success */ host->reference_count++; if (host->reference_count <= 1) { /* Both callbacks failed => free memory. * We need to unlock here, because riemann_free() will lock. * This is not a race condition, because we're the only one * holding a reference. */ pthread_mutex_unlock (&host->lock); riemann_free (host); return (-1); } host->reference_count--; pthread_mutex_unlock (&host->lock); return status; }
static int mb_config_add_host (oconfig_item_t *ci) /* {{{ */ { mb_host_t *host; int status; int i; host = malloc (sizeof (*host)); if (host == NULL) return (ENOMEM); memset (host, 0, sizeof (*host)); host->slaves = NULL; status = cf_util_get_string_buffer (ci, host->host, sizeof (host->host)); if (status != 0) return (status); if (host->host[0] == 0) return (EINVAL); for (i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; status = 0; if (strcasecmp ("Address", child->key) == 0) { char buffer[NI_MAXHOST]; status = cf_util_get_string_buffer (child, buffer, sizeof (buffer)); if (status == 0) status = mb_config_set_host_address (host, buffer); } else if (strcasecmp ("Port", child->key) == 0) { host->port = cf_util_get_port_number (child); if (host->port <= 0) status = -1; } else if (strcasecmp ("Interval", child->key) == 0) status = cf_util_get_cdtime (child, &host->interval); else if (strcasecmp ("Slave", child->key) == 0) /* Don't set status: Gracefully continue if a slave fails. */ mb_config_add_slave (host, child); else { ERROR ("Modbus plugin: Unknown configuration option: %s", child->key); status = -1; } if (status != 0) break; } /* for (i = 0; i < ci->children_num; i++) */ assert (host->host[0] != 0); if (host->host[0] == 0) { ERROR ("Modbus plugin: Data block \"%s\": No type has been specified.", host->host); status = -1; } if (status == 0) { user_data_t ud; char name[1024]; struct timespec interval = { 0, 0 }; ud.data = host; ud.free_func = host_free; ssnprintf (name, sizeof (name), "modbus-%s", host->host); CDTIME_T_TO_TIMESPEC (host->interval, &interval); plugin_register_complex_read (/* group = */ NULL, name, /* callback = */ mb_read, /* interval = */ (host->interval > 0) ? &interval : NULL, &ud); } else { host_free (host); } return (status); } /* }}} int mb_config_add_host */
static int wm_config_node (oconfig_item_t *ci) /* {{{ */ { wm_node_t *node; int status; int i; node = malloc (sizeof (*node)); if (node == NULL) return (ENOMEM); memset (node, 0, sizeof (*node)); mongo_init (node->conn); node->host = NULL; node->store_rates = 1; pthread_mutex_init (&node->lock, /* attr = */ NULL); status = cf_util_get_string_buffer (ci, node->name, sizeof (node->name)); if (status != 0) { sfree (node); return (status); } for (i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp ("Host", child->key) == 0) status = cf_util_get_string (child, &node->host); else if (strcasecmp ("Port", child->key) == 0) { status = cf_util_get_port_number (child); if (status > 0) { node->port = status; status = 0; } } else if (strcasecmp ("Timeout", child->key) == 0) status = cf_util_get_int (child, &node->timeout); else if (strcasecmp ("StoreRates", child->key) == 0) status = cf_util_get_boolean (child, &node->store_rates); else WARNING ("write_mongodb plugin: Ignoring unknown config option \"%s\".", child->key); if (status != 0) break; } /* for (i = 0; i < ci->children_num; i++) */ if (status == 0) { char cb_name[DATA_MAX_NAME_LEN]; user_data_t ud; ssnprintf (cb_name, sizeof (cb_name), "write_mongodb/%s", node->name); ud.data = node; ud.free_func = wm_config_free; status = plugin_register_write (cb_name, wm_write, &ud); INFO ("write_mongodb plugin: registered write plugin %s %d",cb_name,status); } if (status != 0) wm_config_free (node); return (status); } /* }}} int wm_config_node */
static int dpdk_events_config(oconfig_item_t *ci) { DPDK_EVENTS_TRACE(); int ret = dpdk_events_preinit(); if (ret) { g_state |= DPDK_EVENTS_STATE_CFG_ERR; return 0; } dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc); /* Disabling link_status and keep_alive since <Plugin/> config section * specifies if those should be enabled */ ec->config.keep_alive.enabled = ec->config.link_status.enabled = 0; memset(&ec->config.keep_alive.lcore_mask, 0, sizeof(ec->config.keep_alive.lcore_mask)); for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("EAL", child->key) == 0) ret = dpdk_helper_eal_config_parse(g_hc, child); else if (strcasecmp("Event", child->key) == 0) { char event_type[DATA_MAX_NAME_LEN]; if (cf_util_get_string_buffer(child, event_type, sizeof(event_type))) ret = -1; else if (strcasecmp(event_type, "link_status") == 0) { ret = dpdk_events_link_status_config(ec, child); if (ret) { g_state |= DPDK_EVENTS_STATE_LS_CFG_ERR; continue; } } else if (strcasecmp(event_type, "keep_alive") == 0) { ret = dpdk_events_keep_alive_config(ec, child); if (ret) { g_state |= DPDK_EVENTS_STATE_KA_CFG_ERR; continue; } } else { ERROR(DPDK_EVENTS_PLUGIN ": The selected event \"%s\" is unknown.", event_type); ret = -1; } } else { ERROR(DPDK_EVENTS_PLUGIN ": unrecognized configuration option %s.", child->key); ret = -1; } if (ret != 0) { g_state |= DPDK_EVENTS_STATE_CFG_ERR; return 0; } } if (g_state & DPDK_EVENTS_STATE_KA_CFG_ERR) { ERROR(DPDK_EVENTS_PLUGIN ": Invalid keep alive configuration. Event disabled."); ec->config.keep_alive.enabled = 0; } if (g_state & DPDK_EVENTS_STATE_LS_CFG_ERR) { ERROR(DPDK_EVENTS_PLUGIN ": Invalid link status configuration. Event disabled."); ec->config.link_status.enabled = 0; } if (!ec->config.keep_alive.enabled && !ec->config.link_status.enabled) { ERROR(DPDK_EVENTS_PLUGIN ": At least one type of events should be " "configured for collecting. Plugin misconfigured"); g_state |= DPDK_EVENTS_STATE_CFG_ERR; return 0; } return 0; }
static int mb_config_add_data (oconfig_item_t *ci) /* {{{ */ { mb_data_t data; int status; int i; memset (&data, 0, sizeof (data)); data.name = NULL; data.register_type = REG_TYPE_UINT16; data.next = NULL; status = cf_util_get_string (ci, &data.name); if (status != 0) return (status); for (i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; status = 0; if (strcasecmp ("Type", child->key) == 0) status = cf_util_get_string_buffer (child, data.type, sizeof (data.type)); else if (strcasecmp ("Instance", child->key) == 0) status = cf_util_get_string_buffer (child, data.instance, sizeof (data.instance)); else if (strcasecmp ("RegisterBase", child->key) == 0) status = cf_util_get_int (child, &data.register_base); else if (strcasecmp ("RegisterType", child->key) == 0) { char tmp[16]; status = cf_util_get_string_buffer (child, tmp, sizeof (tmp)); if (status != 0) /* do nothing */; else if (strcasecmp ("Uint16", tmp) == 0) data.register_type = REG_TYPE_UINT16; else if (strcasecmp ("Uint32", tmp) == 0) data.register_type = REG_TYPE_UINT32; else if (strcasecmp ("Float", tmp) == 0) data.register_type = REG_TYPE_FLOAT; else { ERROR ("Modbus plugin: The register type \"%s\" is unknown.", tmp); status = -1; } } else { ERROR ("Modbus plugin: Unknown configuration option: %s", child->key); status = -1; } if (status != 0) break; } /* for (i = 0; i < ci->children_num; i++) */ assert (data.name != NULL); if (data.type[0] == 0) { ERROR ("Modbus plugin: Data block \"%s\": No type has been specified.", data.name); status = -1; } if (status == 0) data_copy (&data_definitions, &data); sfree (data.name); return (status); } /* }}} int mb_config_add_data */
static int wm_config_node (oconfig_item_t *ci) /* {{{ */ { wm_node_t *node; int status; node = calloc (1, sizeof (*node)); if (node == NULL) return (ENOMEM); mongo_init (node->conn); node->host = NULL; node->store_rates = 1; pthread_mutex_init (&node->lock, /* attr = */ NULL); status = cf_util_get_string_buffer (ci, node->name, sizeof (node->name)); if (status != 0) { sfree (node); return (status); } for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp ("Host", child->key) == 0) status = cf_util_get_string (child, &node->host); else if (strcasecmp ("Port", child->key) == 0) { status = cf_util_get_port_number (child); if (status > 0) { node->port = status; status = 0; } } else if (strcasecmp ("Timeout", child->key) == 0) status = cf_util_get_int (child, &node->timeout); else if (strcasecmp ("StoreRates", child->key) == 0) status = cf_util_get_boolean (child, &node->store_rates); else if (strcasecmp ("Database", child->key) == 0) status = cf_util_get_string (child, &node->db); else if (strcasecmp ("User", child->key) == 0) status = cf_util_get_string (child, &node->user); else if (strcasecmp ("Password", child->key) == 0) status = cf_util_get_string (child, &node->passwd); else WARNING ("write_mongodb plugin: Ignoring unknown config option \"%s\".", child->key); if (status != 0) break; } /* for (i = 0; i < ci->children_num; i++) */ if ((node->db != NULL) || (node->user != NULL) || (node->passwd != NULL)) { if ((node->db == NULL) || (node->user == NULL) || (node->passwd == NULL)) { WARNING ("write_mongodb plugin: Authentication requires the " "\"Database\", \"User\" and \"Password\" options to be specified, " "but at last one of them is missing. Authentication will NOT be " "used."); sfree (node->db); sfree (node->user); sfree (node->passwd); } } if (status == 0) { char cb_name[DATA_MAX_NAME_LEN]; user_data_t ud; ssnprintf (cb_name, sizeof (cb_name), "write_mongodb/%s", node->name); ud.data = node; ud.free_func = wm_config_free; status = plugin_register_write (cb_name, wm_write, &ud); INFO ("write_mongodb plugin: registered write plugin %s %d",cb_name,status); } if (status != 0) wm_config_free (node); return (status); } /* }}} int wm_config_node */
static int wr_config_node (oconfig_item_t *ci) /* {{{ */ { wr_node_t *node; int timeout; int status; int i; node = calloc (1, sizeof (*node)); if (node == NULL) return (ENOMEM); node->host = NULL; node->port = 0; node->timeout.tv_sec = 0; node->timeout.tv_usec = 1000; node->conn = NULL; node->prefix = NULL; node->database = 0; node->max_set_size = -1; node->store_rates = 1; pthread_mutex_init (&node->lock, /* attr = */ NULL); status = cf_util_get_string_buffer (ci, node->name, sizeof (node->name)); if (status != 0) { sfree (node); return (status); } for (i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp ("Host", child->key) == 0) status = cf_util_get_string (child, &node->host); else if (strcasecmp ("Port", child->key) == 0) { status = cf_util_get_port_number (child); if (status > 0) { node->port = status; status = 0; } } else if (strcasecmp ("Timeout", child->key) == 0) { status = cf_util_get_int (child, &timeout); if (status == 0) node->timeout.tv_usec = timeout; } else if (strcasecmp ("Prefix", child->key) == 0) { status = cf_util_get_string (child, &node->prefix); } else if (strcasecmp ("Database", child->key) == 0) { status = cf_util_get_int (child, &node->database); } else if (strcasecmp ("MaxSetSize", child->key) == 0) { status = cf_util_get_int (child, &node->max_set_size); } else if (strcasecmp ("StoreRates", child->key) == 0) { status = cf_util_get_boolean (child, &node->store_rates); } else WARNING ("write_redis plugin: Ignoring unknown config option \"%s\".", child->key); if (status != 0) break; } /* for (i = 0; i < ci->children_num; i++) */ if (status == 0) { char cb_name[DATA_MAX_NAME_LEN]; user_data_t ud; ssnprintf (cb_name, sizeof (cb_name), "write_redis/%s", node->name); ud.data = node; ud.free_func = wr_config_free; status = plugin_register_write (cb_name, wr_write, &ud); } if (status != 0) wr_config_free (node); return (status); } /* }}} int wr_config_node */
static int redis_config_node (oconfig_item_t *ci) /* {{{ */ { redis_query_t *rq; int status; int timeout; redis_node_t rn = { .port = REDIS_DEF_PORT, .timeout.tv_usec = REDIS_DEF_TIMEOUT }; sstrncpy (rn.host, REDIS_DEF_HOST, sizeof (rn.host)); status = cf_util_get_string_buffer (ci, rn.name, sizeof (rn.name)); if (status != 0) return (status); for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; if (strcasecmp ("Host", option->key) == 0) status = cf_util_get_string_buffer (option, rn.host, sizeof (rn.host)); else if (strcasecmp ("Port", option->key) == 0) { status = cf_util_get_port_number (option); if (status > 0) { rn.port = status; status = 0; } } else if (strcasecmp ("Query", option->key) == 0) { rq = redis_config_query(option); if (rq == NULL) { status =1; } else { rq->next = rn.queries; rn.queries = rq; } } else if (strcasecmp ("Timeout", option->key) == 0) { status = cf_util_get_int (option, &timeout); if (status == 0) rn.timeout.tv_usec = timeout; } else if (strcasecmp ("Password", option->key) == 0) status = cf_util_get_string_buffer (option, rn.passwd, sizeof (rn.passwd)); else WARNING ("redis plugin: Option `%s' not allowed inside a `Node' " "block. I'll ignore this option.", option->key); if (status != 0) break; } if (status != 0) return (status); return (redis_node_add (&rn)); } /* }}} int redis_config_node */ static int redis_config (oconfig_item_t *ci) /* {{{ */ { for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; if (strcasecmp ("Node", option->key) == 0) redis_config_node (option); else WARNING ("redis plugin: Option `%s' not allowed in redis" " configuration. It will be ignored.", option->key); } if (nodes_head == NULL) { ERROR ("redis plugin: No valid node configuration could be found."); return (ENOENT); } return (0); } /* }}} */ __attribute__ ((nonnull(2))) static void redis_submit (char *plugin_instance, const char *type, const char *type_instance, value_t value) /* {{{ */ { value_t values[1]; value_list_t vl = VALUE_LIST_INIT; values[0] = value; vl.values = values; vl.values_len = 1; sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "redis", sizeof (vl.plugin)); if (plugin_instance != NULL) sstrncpy (vl.plugin_instance, plugin_instance, sizeof (vl.plugin_instance)); sstrncpy (vl.type, type, sizeof (vl.type)); if (type_instance != NULL) sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance)); plugin_dispatch_values (&vl); } /* }}} */