diff options
Diffstat (limited to 'src/config.c')
-rw-r--r-- | src/config.c | 83 |
1 files changed, 76 insertions, 7 deletions
diff --git a/src/config.c b/src/config.c index 066203f..ca64514 100644 --- a/src/config.c +++ b/src/config.c @@ -57,7 +57,8 @@ typedef struct _config_ctx { const char* confname; char* configmem; - uint32_t interval; + uint interval; + uint timeout; rb_item* items; } config_ctx; @@ -77,6 +78,48 @@ config_ctx; * CONFIG LOADING */ +static rb_item* +sort_items_by_host(rb_item *item) +{ + rb_item *sort = NULL; + rb_item *cur; + rb_item *it; + + while(item) + { + cur = item; + item = item->next; + cur->next = NULL; + + /* First item */ + if(!sort) + { + sort = cur; + continue; + } + + /* Before first item */ + else if(cur->host <= sort->host) + { + cur->next = sort; + sort = cur; + continue; + } + + for(it = sort; it->next; it = it->next) + { + if(cur->host <= sort->next->host) + break; + } + + ASSERT(it); + cur->next = it->next; + it->next = cur; + } + + return sort; +} + static void config_done(config_ctx* ctx) { @@ -93,8 +136,12 @@ config_done(config_ctx* ctx) if(ctx->interval == 0) errx(2, "no interval specified in config file: %s", ctx->confname); + if(ctx->timeout == 0) + ctx->timeout = g_state.timeout; + /* And a nice key for lookups */ - snprintf(key, sizeof(key), "%d:%s/%s.rrd", ctx->interval, g_state.rrddir, ctx->confname); + snprintf(key, sizeof(key), "%d-%d:%s/%s.rrd", ctx->timeout, + ctx->interval, g_state.rrddir, ctx->confname); key[sizeof(key) - 1] = 0; /* See if we have one of these pollers already */ @@ -111,7 +158,8 @@ config_done(config_ctx* ctx) ASSERT(t); poll->rrdname = t + 1; - poll->interval = ctx->interval; + poll->interval = ctx->interval * 1000; + poll->timeout = ctx->timeout * 1000; /* Add it to the main lists */ poll->next = g_state.polls; @@ -121,11 +169,13 @@ config_done(config_ctx* ctx) /* Get the last item and add to the list */ for(it = ctx->items; it->next; it = it->next) it->poller = poll; - it->next->poller = poll; + + ASSERT(it); + it->poller = poll; /* Add the items to this poller */ it->next = poll->items; - poll->items = ctx->items; + poll->items = sort_items_by_host(ctx->items); /* * This remains allocated for the life of the program as @@ -203,10 +253,15 @@ parse_item(const char* field, char* uri, config_ctx *ctx) parse_uri(uri, &scheme, &host, &user, &path, ctx); ASSERT(scheme && host && path); + /* TODO: SNMP version support */ + /* Currently we only support SNMP pollers */ if(strcmp(scheme, CONFIG_SNMP) != 0) errx(2, "invalid poll scheme: %s", scheme); + /* TODO: THis code assumes all hosts have the same community + the lookups below won't work wehn host/community is different */ + /* See if we can find an associated host */ rhost = (rb_host*)hsh_get(g_state.host_by_name, host, -1); if(!rhost) @@ -217,7 +272,20 @@ parse_item(const char* field, char* uri, config_ctx *ctx) if(!rhost || !hsh_set(g_state.host_by_name, host, -1, rhost)) errx(1, "out of memory"); + /* TODO: Version support */ + rhost->version = 1; rhost->name = host; + rhost->community = user ? user : "public"; + + /* TODO: Eventually resolving should be in a separate thread, + and done regularly */ + if(sock_any_pton(host, &(rhost->address), + SANY_OPT_DEFPORT(161) | SANY_OPT_DEFLOCAL) == -1) + { + rb_message(LOG_WARNING, "couldn't resolve host address (ignoring): %s", host); + free(rhost); + return; + } /* And add it to the list */ rhost->next = g_state.hosts; @@ -230,12 +298,13 @@ parse_item(const char* field, char* uri, config_ctx *ctx) errx(1, "out of memory"); ritem->rrdfield = field; - ritem->community = user ? user : "public"; ritem->host = rhost; ritem->poller = NULL; /* Set later in config_done */ + ritem->req = NULL; + ritem->value = RB_UNKNOWN; /* And parse the OID */ - if(rb_parse_mib(path, &(ritem->value)) == -1) + if(rb_parse_mib(path, &(ritem->snmpfield)) == -1) errx(2, "invalid OID: %s", path + 1); /* And add it to the list */ |