static int child_main() { int log_flags; mtev_conf_section_t section; char *err = NULL; cli_stdout = mtev_log_stream_new_on_fd("stdout", 1, NULL); log_flags = mtev_log_stream_get_flags(mtev_stderr); log_flags &= ~(MTEV_LOG_STREAM_FACILITY|MTEV_LOG_STREAM_TIMESTAMPS); mtev_log_stream_set_flags(mtev_stderr, log_flags); /* reload our config, to make sure we have the most current */ if(mtev_conf_load(NULL) == -1) { mtevL(mtev_error, "Cannot load config: '%s'\n", config_file); if(needs_unlink) unlink(config_file); exit(2); } mtev_conf_security_init(APPNAME, droptouser, droptogroup, NULL); if(mtev_conf_write_file(&err) != 0) { if(err) { mtevL(mtev_stderr, "Error: '%s'\n", err); free(err); } mtevL(mtev_stderr, "Permissions issue, are you running as the right user?\n"); exit(2); } if(needs_unlink) unlink(config_file); /* update the lua module */ section = mtev_conf_get_section(NULL, "/cli/modules/generic[@name=\"lua_general\"]/config"); if(!section || !mtev_conf_set_string(section, "lua_module", lua_file)) { mtevL(mtev_stderr, "Cannot set target lua module, invalid config.\n"); exit(2); } eventer_init(); mtev_dso_init(); mtev_dso_post_init(); if(mtev_dso_load_failures() > 0) { mtevL(mtev_stderr, "Failed to initialize.\n"); exit(2); } if(interactive) { mtev_console_init(APPNAME); mtev_console_conf_init(APPNAME); eventer_set_fd_nonblocking(STDIN_FILENO); if(mtev_console_std_init(STDIN_FILENO, STDOUT_FILENO)) { mtevL(mtev_stderr, "Failed to initialize IO\n"); exit(2); } } /* Lastly, spin up the event loop */ eventer_loop(); return 0; }
static int rest_delete_filter(mtev_http_rest_closure_t *restc, int npats, char **pats) { mtev_http_session_ctx *ctx = restc->http_ctx; xmlNodePtr node; char xpath[1024]; int error_code = 500; if(npats != 2) goto error; snprintf(xpath, sizeof(xpath), "//filtersets%sfilterset[@name=\"%s\"]", pats[0], pats[1]); node = mtev_conf_get_section(NULL, xpath); if(!node) goto not_found; if(noit_filter_remove(node) == 0) goto not_found; CONF_REMOVE(node); xmlUnlinkNode(node); xmlFreeNode(node); if(mtev_conf_write_file(NULL) != 0) mtevL(noit_error, "local config write failed\n"); mtev_conf_mark_changed(); mtev_http_response_ok(ctx, "text/html"); mtev_http_response_end(ctx); goto cleanup; not_found: mtev_http_response_not_found(ctx, "text/html"); mtev_http_response_end(ctx); goto cleanup; error: mtev_http_response_standard(ctx, error_code, "ERROR", "text/html"); mtev_http_response_end(ctx); goto cleanup; cleanup: return 0; }
static int rest_set_filter(mtev_http_rest_closure_t *restc, int npats, char **pats) { mtev_http_session_ctx *ctx = restc->http_ctx; xmlDocPtr doc = NULL, indoc = NULL; xmlNodePtr node, parent, root, newfilter; char xpath[1024]; int error_code = 500, complete = 0, mask = 0; const char *error = "internal error"; if(npats != 2) goto error; indoc = rest_get_xml_upload(restc, &mask, &complete); if(!complete) return mask; if(indoc == NULL) FAIL("xml parse error"); snprintf(xpath, sizeof(xpath), "//filtersets%sfilterset[@name=\"%s\"]", pats[0], pats[1]); node = mtev_conf_get_section(NULL, xpath); if(!node && noit_filter_exists(pats[1])) { /* It's someone else's */ error_code = 403; goto error; } if((newfilter = validate_filter_post(indoc)) == NULL) goto error; xmlSetProp(newfilter, (xmlChar *)"name", (xmlChar *)pats[1]); parent = make_conf_path(pats[0]); if(!parent) FAIL("invalid path"); if(node) { xmlUnlinkNode(node); xmlFreeNode(node); } xmlUnlinkNode(newfilter); xmlAddChild(parent, newfilter); CONF_DIRTY(newfilter); mtev_conf_mark_changed(); if(mtev_conf_write_file(NULL) != 0) mtevL(noit_error, "local config write failed\n"); noit_filter_compile_add(newfilter); if(restc->call_closure_free) restc->call_closure_free(restc->call_closure); restc->call_closure_free = NULL; restc->call_closure = NULL; restc->fastpath = rest_show_filter; return restc->fastpath(restc, restc->nparams, restc->params); error: mtev_http_response_standard(ctx, error_code, "ERROR", "text/html"); doc = xmlNewDoc((xmlChar *)"1.0"); root = xmlNewDocNode(doc, NULL, (xmlChar *)"error", NULL); xmlDocSetRootElement(doc, root); xmlNodeAddContent(root, (xmlChar *)error); mtev_http_response_xml(ctx, doc); mtev_http_response_end(ctx); goto cleanup; cleanup: if(doc) xmlFreeDoc(doc); return 0; }
static int lua_general_conf_save(lua_State *L) { /* Invert the response to indicate a truthy success in lua */ lua_pushboolean(L, mtev_conf_write_file(NULL) ? 0 : 1); return 1; }