static int check_test_sweeper(eventer_t e, int mask, void *closure, struct timeval *now) { int left = 0; noit_skiplist_node *iter = NULL; sweeper_event = NULL; iter = noit_skiplist_getlist(&in_progress); while(iter) { struct check_test_closure *cl = iter->data; /* advance here, we might delete */ noit_skiplist_next(&in_progress,&iter); if(NOIT_CHECK_DISABLED(cl->check)) { if(NOIT_CHECK_SHOULD_RESOLVE(cl->check)) noit_check_resolve(cl->check); if(NOIT_CHECK_RESOLVED(cl->check)) { noit_module_t *m = noit_module_lookup(cl->check->module); cl->check->flags &= ~NP_DISABLED; if(NOIT_CHECK_SHOULD_RESOLVE(cl->check)) noitL(nldeb, "translated to %s\n", cl->check->target_ip); if(m) m->initiate_check(m, cl->check, 1, NULL); } left++; } else if(NOIT_CHECK_RUNNING(cl->check)) left++; else noit_skiplist_remove(&in_progress, cl->restc, (noit_freefunc_t)rest_test_check_result); } if(left) check_test_schedule_sweeper(); return 0; }
void noit_poller_free_check(noit_check_t *checker) { noit_module_t *mod; if(checker->flags & NP_RUNNING) { recycle_check(checker); return; } mod = noit_module_lookup(checker->module); if(mod->cleanup) mod->cleanup(mod, checker); if(checker->fire_event) { eventer_remove(checker->fire_event); free(checker->fire_event->closure); eventer_free(checker->fire_event); checker->fire_event = NULL; } if(checker->closure) free(checker->closure); if(checker->target) free(checker->target); if(checker->module) free(checker->module); if(checker->name) free(checker->name); if(checker->config) { noit_hash_destroy(checker->config, free, free); free(checker->config); checker->config = NULL; } free(checker); }
void noit_check_set_stats(struct _noit_module *module, noit_check_t *check, stats_t *newstate) { int report_change = 0; dep_list_t *dep; if(check->stats.previous.status) free(check->stats.previous.status); noit_hash_destroy(&check->stats.previous.metrics, NULL, __free_metric); memcpy(&check->stats.previous, &check->stats.current, sizeof(stats_t)); memcpy(&check->stats.current, newstate, sizeof(stats_t)); if(check->stats.current.status) check->stats.current.status = strdup(check->stats.current.status); /* check for state changes */ if(check->stats.current.available != NP_UNKNOWN && check->stats.previous.available != NP_UNKNOWN && check->stats.current.available != check->stats.previous.available) report_change = 1; if(check->stats.current.state != NP_UNKNOWN && check->stats.previous.state != NP_UNKNOWN && check->stats.current.state != check->stats.previous.state) report_change = 1; noitL(noit_debug, "%s`%s <- [%s]\n", check->target, check->name, check->stats.current.status); if(report_change) { noitL(noit_debug, "%s`%s -> [%s:%s]\n", check->target, check->name, noit_check_available_string(check->stats.current.available), noit_check_state_string(check->stats.current.state)); } /* Write out our status */ noit_check_log_status(check); /* Write out all metrics */ noit_check_log_metrics(check); /* count the check as complete */ check_completion_count++; for(dep = check->causal_checks; dep; dep = dep->next) { noit_module_t *mod; mod = noit_module_lookup(dep->check->module); assert(mod); noitL(noit_debug, "Firing %s`%s in response to %s`%s\n", dep->check->target, dep->check->name, check->target, check->name); if((dep->check->flags & NP_DISABLED) == 0) if(mod->initiate_check) mod->initiate_check(mod, dep->check, 1, check); } }
int noit_check_activate(noit_check_t *check) { noit_module_t *mod; if(NOIT_CHECK_LIVE(check)) return 0; mod = noit_module_lookup(check->module); if(mod && mod->initiate_check) { if((check->flags & NP_DISABLED) == 0) { mod->initiate_check(mod, check, 0, NULL); return 1; } else noitL(noit_debug, "Skipping %s`%s, disabled.\n", check->target, check->name); } else { if(!mod) { noitL(noit_stderr, "Cannot find module '%s'\n", check->module); check->flags |= NP_DISABLED; } } return 0; }
noit_check_t * noit_fire_check(xmlNodePtr attr, xmlNodePtr config, const char **error) { char *target = NULL, *name = NULL, *module = NULL, *filterset = NULL; int timeout = 0; noit_module_t *m; noit_check_t *c = NULL; xmlNodePtr a, co; noit_hash_table *conf_hash = NULL; for(a = attr->children; a; a = a->next) { if(!strcmp((char *)a->name, "target")) target = (char *)xmlNodeGetContent(a); else if(!strcmp((char *)a->name, "name")) name = (char *)xmlNodeGetContent(a); else if(!strcmp((char *)a->name, "module")) module = (char *)xmlNodeGetContent(a); else if(!strcmp((char *)a->name, "filterset")) filterset = (char *)xmlNodeGetContent(a); else if(!strcmp((char *)a->name, "timeout")) { char *timeout_str = (char *)xmlNodeGetContent(a); timeout = atoi(timeout_str); free(timeout_str); } } m = noit_module_lookup(module); if(!m) { *error = "cannot find requested module"; goto error; } conf_hash = calloc(1, sizeof(*conf_hash)); for(co = config->children; co; co = co->next) { char *name, *val; xmlChar *tmp_val; name = strdup((char *)co->name); tmp_val = xmlNodeGetContent(co); val = strdup(tmp_val ? (char *)tmp_val : ""); noit_hash_replace(conf_hash, name, strlen(name), val, free, free); xmlFree(tmp_val); } if(!m->initiate_check) { *error = "that module cannot run checks"; goto error; } c = calloc(1, sizeof(*c)); noit_check_update(c, target, name, filterset, conf_hash, 0, timeout, NULL, NP_TRANSIENT); c->module = strdup(module); uuid_generate(c->checkid); c->flags |= NP_DISABLED; /* this is hack to know we haven't run it yet */ if(NOIT_CHECK_SHOULD_RESOLVE(c)) noit_check_resolve(c); error: if(conf_hash) { noit_hash_destroy(conf_hash, free, free); free(conf_hash); } if(target) xmlFree(target); if(name) xmlFree(name); if(module) xmlFree(module); if(filterset) xmlFree(filterset); return c; }
noit_check_t * noit_fire_check(xmlNodePtr attr, xmlNodePtr config, const char **error) { char *target = NULL, *name = NULL, *module = NULL, *filterset = NULL; char *resolve_rtype = NULL; int timeout = 0, flags = NP_TRANSIENT, i, mod_cnt; noit_module_t *m; noit_check_t *c = NULL; xmlNodePtr a, co; noit_hash_table *conf_hash = NULL; noit_hash_table **moptions = NULL; for(a = attr->children; a; a = a->next) { if(!strcmp((char *)a->name, "target")) target = (char *)xmlNodeGetContent(a); else if(!strcmp((char *)a->name, "name")) name = (char *)xmlNodeGetContent(a); else if(!strcmp((char *)a->name, "module")) module = (char *)xmlNodeGetContent(a); else if(!strcmp((char *)a->name, "filterset")) filterset = (char *)xmlNodeGetContent(a); else if(!strcmp((char *)a->name, "timeout")) { char *timeout_str = (char *)xmlNodeGetContent(a); timeout = atoi(timeout_str); free(timeout_str); } else if(!strcmp((char *)a->name, "resolve_rtype")) resolve_rtype = (char *)xmlNodeGetContent(a); } m = noit_module_lookup(module); if(!m) { *error = "cannot find requested module"; goto error; } conf_hash = calloc(1, sizeof(*conf_hash)); if(config) { for(co = config->children; co; co = co->next) { char *name, *val; xmlChar *tmp_val; name = strdup((char *)co->name); tmp_val = xmlNodeGetContent(co); val = strdup(tmp_val ? (char *)tmp_val : ""); noit_hash_replace(conf_hash, name, strlen(name), val, free, free); xmlFree(tmp_val); } } mod_cnt = noit_check_registered_module_cnt(); if(mod_cnt > 0) { moptions = alloca(mod_cnt * sizeof(*moptions)); memset(moptions, 0, mod_cnt * sizeof(*moptions)); for(i=0; i<mod_cnt; i++) { const char *name; noit_conf_section_t checks; name = noit_check_registered_module(i); checks = noit_conf_get_section(NULL, "/noit/checks"); if(name) moptions[i] = noit_conf_get_namespaced_hash(checks, "config", name); } } if(!m->initiate_check) { *error = "that module cannot run checks"; goto error; } flags |= noit_calc_rtype_flag(resolve_rtype); c = calloc(1, sizeof(*c)); noit_check_update(c, target, name, filterset, conf_hash, moptions, 0, timeout, NULL, flags); c->module = strdup(module); uuid_generate(c->checkid); c->flags |= NP_DISABLED; /* this is hack to know we haven't run it yet */ if(NOIT_CHECK_SHOULD_RESOLVE(c)) noit_check_resolve(c); error: if(conf_hash) { noit_hash_destroy(conf_hash, free, free); free(conf_hash); } if(moptions) { for(i=0; i<mod_cnt; i++) { if(moptions[i]) { noit_hash_destroy(moptions[i], free, free); free(moptions[i]); } } } if(target) xmlFree(target); if(name) xmlFree(name); if(module) xmlFree(module); if(filterset) xmlFree(filterset); if (resolve_rtype) xmlFree(resolve_rtype); return c; }