static int noit_conf_checks_reload(noit_console_closure_t ncct, int argc, char **argv, noit_console_state_t *state, void *closure) { if(noit_conf_reload(ncct, argc, argv, state, closure)) return -1; noit_poller_reload(NULL); return 0; }
static int noitice_hup(eventer_t e, int mask, void *unused, struct timeval *now) { if(__reload_needed) { noitL(noit_error, "SIGHUP received, performing reload\n"); if(noit_conf_load(config_file) == -1) { noitL(noit_error, "Cannot load config: '%s'\n", config_file); exit(-1); } noit_poller_reload(NULL); __reload_needed = 0; } return 0; }
void noit_poller_init() { noit_check_tools_init(); noit_skiplist_init(&polls_by_name); noit_skiplist_set_compare(&polls_by_name, __check_name_compare, __check_name_compare); noit_skiplist_init(&watchlist); noit_skiplist_set_compare(&watchlist, __watchlist_compare, __watchlist_compare); register_console_check_commands(); eventer_name_callback("check_recycle_bin_processor", check_recycle_bin_processor); eventer_add_in_s_us(check_recycle_bin_processor, NULL, 60, 0); noit_poller_reload(NULL); }
static void refresh_subchecks(noit_console_closure_t ncct, noit_conf_t_userdata_t *info) { char *path; char xpath[1024]; path = info->path; if(!strcmp(path, "/")) path = ""; /* The first one is just a process_checks, the second is the reload. * Reload does a lot of work and there is no need to do it twice. */ snprintf(xpath, sizeof(xpath), "/noit/%s[@uuid]", path); noit_poller_process_checks(xpath); snprintf(xpath, sizeof(xpath), "/noit/%s//check[@uuid]", path); noit_poller_reload(xpath); }
static int noit_console_config_nocheck(noit_console_closure_t ncct, int argc, char **argv, noit_console_state_t *state, void *closure) { int i, cnt; const char *err = "internal error"; noit_conf_t_userdata_t *info; xmlXPathObjectPtr pobj = NULL; xmlXPathContextPtr xpath_ctxt = NULL; char xpath[1024]; uuid_t checkid; noit_conf_xml_xpath(NULL, &xpath_ctxt); if(argc < 1) { nc_printf(ncct, "requires one argument\n"); return -1; } info = noit_console_userdata_get(ncct, NOIT_CONF_T_USERDATA); if(noit_console_mkcheck_xpath(xpath, sizeof(xpath), info, argv[0])) { nc_printf(ncct, "could not find check '%s'\n", argv[0]); return -1; } pobj = xmlXPathEval((xmlChar *)xpath, xpath_ctxt); if(!pobj || pobj->type != XPATH_NODESET || xmlXPathNodeSetIsEmpty(pobj->nodesetval)) { err = "no checks found"; goto bad; } cnt = xmlXPathNodeSetGetLength(pobj->nodesetval); for(i=0; i<cnt; i++) { xmlNodePtr node; char *uuid_conf; node = (noit_conf_section_t)xmlXPathNodeSetItem(pobj->nodesetval, i); uuid_conf = (char *)xmlGetProp(node, (xmlChar *)"uuid"); if(!uuid_conf || uuid_parse(uuid_conf, checkid)) { nc_printf(ncct, "%s has invalid or missing UUID!\n", (char *)xmlGetNodePath(node) + strlen("/noit")); } else { if(argc > 1) { int j; for(j=1;j<argc;j++) xmlUnsetProp(node, (xmlChar *)argv[j]); } else { nc_printf(ncct, "descheduling %s\n", uuid_conf); noit_poller_deschedule(checkid); xmlUnlinkNode(node); } noit_conf_mark_changed(); } } if(argc > 1) { noit_poller_process_checks(xpath); noit_poller_reload(xpath); } nc_printf(ncct, "rebuilding causal map...\n"); noit_poller_make_causal_map(); if(pobj) xmlXPathFreeObject(pobj); return 0; bad: if(pobj) xmlXPathFreeObject(pobj); nc_printf(ncct, "%s\n", err); return -1; }