/* Initialize the plugin / global continuation hook */ void TSPluginInit(int argc, const char *argv[]) { TSPluginRegistrationInfo info; const char *proof = "acme"; static const struct option longopt[] = { {(char *)"proof-directory", optional_argument, NULL, 'p'}, {NULL, no_argument, NULL, '\0'}, }; memset(&gConfig, 0, sizeof(gConfig)); while (true) { int opt = getopt_long(argc, (char *const *)argv, "", longopt, NULL); switch (opt) { case 'p': proof = optarg; break; } if (opt == -1) { break; } } if ('/' != *proof) { const char *confdir = TSConfigDirGet(); int len = strlen(proof) + strlen(confdir) + 8; gConfig.proof = TSmalloc(len); snprintf(gConfig.proof, len, "%s/%s", confdir, proof); TSDebug(PLUGIN_NAME, "base directory for proof-types is %s", gConfig.proof); } else { gConfig.proof = TSstrdup(proof); } info.plugin_name = "acme"; info.vendor_name = "Apache Software Foundation"; info.support_email = "*****@*****.**"; if (TS_SUCCESS != TSPluginRegister(&info)) { TSError("[%s] Plugin registration failed", PLUGIN_NAME); return; } TSDebug(PLUGIN_NAME, "Started the %s plugin", PLUGIN_NAME); TSDebug(PLUGIN_NAME, "\tproof-type dir = %s", gConfig.proof); TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, TSContCreate(acme_hook, NULL)); }
static config_holder_t* new_config_holder(const char* path) { char default_config_file[1024]; config_holder_t* config_holder = TSmalloc(sizeof(config_holder_t)); config_holder->config_path = 0; config_holder->config = 0; config_holder->last_load = 0; // TSmalloc(32); // if(path) { config_holder->config_path = nstr(path); } else { /* Default config file of plugins/cacheurl.config */ // sprintf(default_config_file, "%s/astats.config", TSPluginDirGet()); sprintf(default_config_file, "%s/"DEFAULT_CONFIG_NAME, TSConfigDirGet()); config_holder->config_path = nstr(default_config_file); } load_config_file(config_holder); return config_holder; }
static bool load_config(plugin_state_t *pstate, invalidate_t **ilist) { FILE *fs; struct stat s; size_t path_len; char *path; char line[LINE_MAX]; time_t now; pcre *config_re; const char *errptr; int erroffset, ovector[OVECTOR_SIZE], rc; int ln = 0; invalidate_t *iptr, *i; if (pstate->config_file[0] != '/') { path_len = strlen(TSConfigDirGet()) + strlen(pstate->config_file) + 2; path = alloca(path_len); snprintf(path, path_len, "%s/%s", TSConfigDirGet(), pstate->config_file); } else path = pstate->config_file; if (stat(path, &s) < 0) { TSDebug(LOG_PREFIX, "Could not stat %s", path); return false; } if (s.st_mtime > pstate->last_load) { now = time(NULL); if (!(fs = fopen(path, "r"))) { TSDebug(LOG_PREFIX, "Could not open %s for reading", path); return false; } config_re = pcre_compile("^([^#].+?)\\s+(\\d+)\\s*$", 0, &errptr, &erroffset, NULL); while (fgets(line, LINE_MAX, fs) != NULL) { ln++; TSDebug(LOG_PREFIX, "Processing: %d %s", ln, line); rc = pcre_exec(config_re, NULL, line, strlen(line), 0, 0, ovector, OVECTOR_SIZE); if (rc == 3) { i = (invalidate_t *)TSmalloc(sizeof(invalidate_t)); init_invalidate_t(i); pcre_get_substring(line, ovector, rc, 1, &i->regex_text); i->epoch = now; i->expiry = atoi(line + ovector[4]); i->regex = pcre_compile(i->regex_text, 0, &errptr, &erroffset, NULL); if (i->expiry <= i->epoch) { TSDebug(LOG_PREFIX, "Rule is already expired!"); free_invalidate_t(i); } else if (i->regex == NULL) { TSDebug(LOG_PREFIX, "%s did not compile", i->regex_text); free_invalidate_t(i); } else { i->regex_extra = pcre_study(i->regex, 0, &errptr); if (!*ilist) { *ilist = i; TSDebug(LOG_PREFIX, "Created new list and Loaded %s %d %d", i->regex_text, (int)i->epoch, (int)i->expiry); } else { iptr = *ilist; while (1) { if (strcmp(i->regex_text, iptr->regex_text) == 0) { if (iptr->expiry != i->expiry) { TSDebug(LOG_PREFIX, "Updating duplicate %s", i->regex_text); iptr->epoch = i->epoch; iptr->expiry = i->expiry; } free_invalidate_t(i); i = NULL; break; } else if (!iptr->next) break; else iptr = iptr->next; } if (i) { iptr->next = i; TSDebug(LOG_PREFIX, "Loaded %s %d %d", i->regex_text, (int)i->epoch, (int)i->expiry); } } } } else TSDebug(LOG_PREFIX, "Skipping line %d", ln); } pcre_free(config_re); fclose(fs); pstate->last_load = s.st_mtime; return true; } else TSDebug(LOG_PREFIX, "File mod time is not newer: %d >= %d", (int)pstate->last_load, (int)s.st_mtime); return false; }