Exemple #1
0
void mtev_dso_init(void) {
  mtev_conf_section_t *sections;
  int i, cnt = 0;

  mtev_dso_add_type("loader", mtev_dso_list_loaders);
  mtev_dso_add_type("generic", mtev_dso_list_generics);

  /* Load our generic modules */
  sections = mtev_conf_get_sections(MTEV_CONF_ROOT, "//modules//generic", &cnt);
  for(i=0; i<cnt; i++) {
    char g_name[256];
    mtev_dso_generic_t *gen;
    mtev_conf_section_t *include_sections = NULL;
    int section_cnt;

    if(!mtev_conf_get_stringbuf(sections[i], "ancestor-or-self::node()/@name",
                                g_name, sizeof(g_name))) {
      mtevL(mtev_stderr, "No name defined in generic stanza %d\n", i+1);
      continue;
    }

    if(mtev_conf_env_off(sections[i], NULL)) {
      mtevL(mtev_debug, "generic module %s environmentally disabled.\n", g_name);
      continue;
    }

    gen = (mtev_dso_generic_t *)
      mtev_load_generic_image(&__mtev_image_loader, g_name,
                              sections[i]);
    if(!gen) {
      mtevL(mtev_stderr, "Failed to load generic %s\n", g_name);
      mtev_dso_load_failure_count++;
      continue;
    }
    if(gen->config) {
      int rv;
      mtev_hash_table *config;
      include_sections = mtev_conf_get_sections(sections[i], "include", &section_cnt);
      if ((include_sections) && (section_cnt == 1)) {
        config = mtev_conf_get_hash(*include_sections, "config");
      }
      else {
        config = mtev_conf_get_hash(sections[i], "config");
      }
      mtev_conf_release_sections(include_sections, section_cnt);
      rv = gen->config(gen, config);
      if(rv == 0) {
        mtev_hash_destroy(config, free, free);
        free(config);
      }
      else if(rv < 0) {
        mtevL(mtev_stderr, "Failed to config generic %s\n", g_name);
        continue;
      }
    }
    if(gen->init && gen->init(gen)) {
      mtevL(mtev_stderr, "Failed to init generic %s\n", g_name);
      mtev_dso_load_failure_count++;
    }
    else
      mtevL(mtev_debug, "Generic module %s successfully loaded.\n", g_name);
  }
  mtev_conf_release_sections(sections, cnt);
  /* Load our module loaders */
  sections = mtev_conf_get_sections(MTEV_CONF_ROOT, "//modules//loader", &cnt);
  for(i=0; i<cnt; i++) {
    char loader_name[256];
    mtev_dso_loader_t *loader;
    mtev_conf_section_t *include_sections = NULL;
    int section_cnt;

    if(!mtev_conf_get_stringbuf(sections[i], "ancestor-or-self::node()/@name",
                                loader_name, sizeof(loader_name))) {
      mtevL(mtev_stderr, "No name defined in loader stanza %d\n", i+1);
      continue;
    }

    if(mtev_conf_env_off(sections[i], NULL)) {
      mtevL(mtev_debug, "loader %s environmentally disabled.\n", loader_name);
      continue;
    }

    loader = (mtev_dso_loader_t *)
      mtev_load_loader_image(&__mtev_image_loader, loader_name,
                             sections[i]);
    if(!loader) {
      mtevL(mtev_stderr, "Failed to load loader %s\n", loader_name);
      mtev_dso_load_failure_count++;
      continue;
    }
    if(loader->config) {
      int rv;
      mtev_hash_table *config;
      include_sections = mtev_conf_get_sections(sections[i], "include", &section_cnt);
      if ((include_sections) && (section_cnt == 1)) {
        config = mtev_conf_get_hash(*include_sections, "config");
      }
      else {
        config = mtev_conf_get_hash(sections[i], "config");
      }
      mtev_conf_release_sections(include_sections, section_cnt);
      rv = loader->config(loader, config);
      if(rv == 0) {
        mtev_hash_destroy(config, free, free);
        free(config);
      }
      else if(rv < 0) {
        mtevL(mtev_stderr, "Failed to config loader %s\n", loader_name);
        mtev_dso_load_failure_count++;
        continue;
      }
    }
    if(loader->init && loader->init(loader))
      mtevL(mtev_stderr, "Failed to init loader %s\n", loader_name);
  }
  mtev_conf_release_sections(sections, cnt);
}
void noit_check_resolver_init() {
  static int initialized = 0;
  int32_t cnt;
  mtev_conf_section_t *servers, *searchdomains;
  eventer_t e;

  DCLOCK();
  if(initialized != 0) {
    DCUNLOCK();
    return;
  }

  if(dns_init(NULL, 0) < 0)
    mtevL(noit_error, "dns initialization failed.\n");
  dns_ctx = dns_new(NULL);
  if(dns_init(dns_ctx, 0) != 0) {
    mtevL(noit_error, "dns initialization failed.\n");
    DCUNLOCK();
    exit(-1);
  }

  /* Optional servers */
  servers = mtev_conf_get_sections(MTEV_CONF_ROOT, "//resolver//server", &cnt);
  if(cnt) {
    int i;
    char server[128];
    dns_add_serv(dns_ctx, NULL); /* reset */
    for(i=0;i<cnt;i++) {
      if(mtev_conf_get_stringbuf(servers[i], "self::node()",
                                 server, sizeof(server))) {
        if(mtev_conf_env_off(servers[i], NULL)) {
          mtevL(noit_error, "DNS server %s environmentally ignored.\n", server);
        }
        else if(dns_add_serv(dns_ctx, server) < 0) {
          mtevL(noit_error, "Failed adding DNS server: %s\n", server);
        }
      }
    }
  }
  mtev_conf_release_sections(servers, cnt);
  searchdomains = mtev_conf_get_sections(MTEV_CONF_ROOT, "//resolver//search", &cnt);
  if(cnt) {
    int i;
    char search[128];
    dns_add_srch(dns_ctx, NULL); /* reset */
    for(i=0;i<cnt;i++) {
      if(mtev_conf_get_stringbuf(searchdomains[i], "self::node()",
                                 search, sizeof(search))) {
        if(mtev_conf_env_off(searchdomains[i], NULL)) {
          mtevL(noit_error, "DNS search %s environmentally ignored.\n", search);
        }
        else if(dns_add_srch(dns_ctx, search) < 0) {
          mtevL(noit_error, "Failed adding DNS search path: %s\n", search);
        }
        else if(dns_search_flag) dns_search_flag = 0; /* enable search */
      }
    }
  }
  mtev_conf_release_sections(searchdomains, cnt);

  if(mtev_conf_get_int32(MTEV_CONF_ROOT, "//resolver/@ndots", &cnt))
    dns_set_opt(dns_ctx, DNS_OPT_NDOTS, cnt);

  if(mtev_conf_get_int32(MTEV_CONF_ROOT, "//resolver/@ntries", &cnt))
    dns_set_opt(dns_ctx, DNS_OPT_NTRIES, cnt);

  if(mtev_conf_get_int32(MTEV_CONF_ROOT, "//resolver/@timeout", &cnt))
    dns_set_opt(dns_ctx, DNS_OPT_TIMEOUT, cnt);

  if(dns_open(dns_ctx) < 0) {
    mtevL(noit_error, "dns open failed.\n");
    DCUNLOCK();
    exit(-1);
  }
  eventer_name_callback("dns_cache_callback", dns_cache_callback);
  dns_set_tmcbck(dns_ctx, dns_cache_utm_fn, dns_ctx);
  e = eventer_alloc_fd(dns_cache_callback, dns_ctx, dns_sock(dns_ctx),
                       EVENTER_READ|EVENTER_EXCEPTION);
  eventer_add(e);

  mtev_skiplist *dc = mtev_skiplist_alloc();
  mtev_skiplist_set_compare(dc, name_lookup, name_lookup_k);
  mtev_skiplist_add_index(dc, refresh_idx, refresh_idx_k);
  ck_pr_barrier();
  nc_dns_cache = dc;

  /* maybe load it from cache */
  if(noit_resolver_cache_load_hook_exists()) {
    struct timeval now;
    char *key;
    void *data;
    int len;
    mtev_gettimeofday(&now, NULL);
    while(noit_resolver_cache_load_hook_invoke(&key, &data, &len) == MTEV_HOOK_CONTINUE) {
      dns_cache_node *n;
      n = calloc(1, sizeof(*n));
      if(dns_cache_node_deserialize(n, data, len) >= 0) {
        n->target = strdup(key);
        /* if the TTL indicates that it will expire in less than 60 seconds
         * (including stuff that should have already expired), then fudge
         * the last_updated time to make it expire some random time within
         * the next 60 seconds.
         */
        if(n->last_needed > now.tv_sec || n->last_updated > now.tv_sec) {
          dns_cache_node_free(n);
          break; /* impossible */
        }

        n->last_needed = now.tv_sec;
        if(n->last_updated + n->ttl < now.tv_sec + 60) {
          int fudge = MIN(60, n->ttl) + 1;
          n->last_updated = now.tv_sec - n->ttl + (lrand48() % fudge);
        }
        mtev_skiplist_insert(nc_dns_cache, n);
        n = NULL;
      }
      else {
        mtevL(noit_error, "Failed to deserialize resolver cache record.\n");
      }
      if(n) dns_cache_node_free(n);
      if(key) free(key);
      if(data) free(data);
    }
  }

  noit_check_resolver_loop(NULL, 0, NULL, NULL);
  register_console_dns_cache_commands();

  mtev_hash_init(&etc_hosts_cache);
  noit_check_etc_hosts_cache_refresh(NULL, 0, NULL, NULL);
  initialized = 1;
  DCUNLOCK();
}