Пример #1
0
int
noit_validate_check_rest_post(xmlDocPtr doc, xmlNodePtr *a, xmlNodePtr *c,
                              const char **error) {
    xmlNodePtr root, tl, an;
    int name=0, module=0, target=0, period=0, timeout=0, filterset=0;
    *a = *c = NULL;
    root = xmlDocGetRootElement(doc);
    if(!root || strcmp((char *)root->name, "check")) return 0;
    for(tl = root->children; tl; tl = tl->next) {
        if(!strcmp((char *)tl->name, "attributes")) {
            *a = tl;
            for(an = tl->children; an; an = an->next) {
#define CHECK_N_SET(a) if(!strcmp((char *)an->name, #a))
                CHECK_N_SET(name) {
                    xmlChar *tmp;
                    pcre *valid_name = noit_conf_get_valid_name_checker();
                    int ovector[30], valid;
                    tmp = xmlNodeGetContent(an);
                    valid = (pcre_exec(valid_name, NULL,
                                       (char *)tmp, strlen((char *)tmp), 0, 0,
                                       ovector, sizeof(ovector)/sizeof(*ovector)) > 0);
                    xmlFree(tmp);
                    if(!valid) {
                        *error = "invalid name";
                        return 0;
                    }
                    name = 1;
                }
                else CHECK_N_SET(module) module = 1; /* This is validated by called */
                else CHECK_N_SET(target) {
                    noit_boolean should_resolve;
                    int valid;
                    xmlChar *tmp;
                    tmp = xmlNodeGetContent(an);
                    valid = noit_check_is_valid_target((char *)tmp);
                    xmlFree(tmp);
                    if(noit_conf_get_boolean(NULL, "//checks/@resolve_targets",
                                             &should_resolve) &&
                            should_resolve == noit_false &&
                            !valid) {
                        *error = "invalid target";
                        return 0;
                    }
                    target = 1;
                }
                else CHECK_N_SET(resolve_rtype) {
Пример #2
0
void
noit_listener_reconfig(const char *toplevel) {
  int i, cnt = 0;
  noit_conf_section_t *listener_configs;
  char path[256];

  snprintf(path, sizeof(path), "/%s/listeners//listener",
           toplevel ? toplevel : "*");
  listener_configs = noit_conf_get_sections(NULL, path, &cnt);
  noitL(noit_debug, "Found %d %s stanzas\n", cnt, path);
  for(i=0; i<cnt; i++) {
    char address[256];
    char type[256];
    unsigned short port;
    int portint;
    int backlog;
    eventer_func_t f;
    noit_boolean ssl;
    noit_hash_table *sslconfig, *config;

    if(!noit_conf_get_stringbuf(listener_configs[i],
                                "ancestor-or-self::node()/@type",
                                type, sizeof(type))) {
      noitL(noit_error, "No type specified in listener stanza %d\n", i+1);
      continue;
    }
    f = eventer_callback_for_name(type);
    if(!f) {
      noitL(noit_error,
            "Cannot find handler for listener type: '%s'\n", type);
      continue;
    }
    if(!noit_conf_get_stringbuf(listener_configs[i],
                                "ancestor-or-self::node()/@address",
                                address, sizeof(address))) {
      address[0] = '*';
      address[1] = '\0';
    }
    if(!noit_conf_get_int(listener_configs[i],
                          "ancestor-or-self::node()/@port", &portint))
      portint = 0;
    port = (unsigned short) portint;
    if(address[0] != '/' && (portint == 0 || (port != portint))) {
      /* UNIX sockets don't require a port (they'll ignore it if specified */
      noitL(noit_error,
            "Invalid port [%d] specified in stanza %d\n", port, i+1);
      continue;
    }
    if(noit_listener_should_skip(address, port)) {
      if(port)
        noitL(noit_error, "Operator forced skipping listener %s:%d\n", address, port);
      else
        noitL(noit_error, "Operator forced skipping listener %s\n", address);
      continue;
    }
    if(!noit_conf_get_int(listener_configs[i],
                          "ancestor-or-self::node()/@backlog", &backlog))
      backlog = 5;

    if(!noit_conf_get_boolean(listener_configs[i],
                              "ancestor-or-self::node()/@ssl", &ssl))
     ssl = noit_false;

    sslconfig = ssl ?
                  noit_conf_get_hash(listener_configs[i], "sslconfig") :
                  NULL;
    config = noit_conf_get_hash(listener_configs[i], "config");

    if(noit_listener(address, port, SOCK_STREAM, backlog,
                     sslconfig, config, f, NULL) != 0) {
      noit_hash_destroy(config,free,free);
      free(config);
    }
    if(sslconfig) {
      /* A copy of this is made within noit_listener */
      noit_hash_destroy(sslconfig,free,free);
      free(sslconfig);
    }
  }
  free(listener_configs);
}