/** Create and return top-level cont with no transient data * Sets up engine manager and kill-or-continue txn hook before launching * potentially-slow mainconfiguration in separate thread. */ static ib_status_t tsib_pre_init(TSCont *contp) { int rv; ib_status_t rc; TSCont cont; assert(contp != NULL); /* create a cont to fend off traffic while we read config */ *contp = cont = TSContCreate(ironbee_plugin, NULL); if (cont == NULL) { TSError("[ironbee] failed to create initial continuation: disabled"); return IB_EUNKNOWN; } if (module_data.allow_at_startup) { /* SSN_START doesn't use contdata; READ_REQUEST_HDR only needs non-null flag. * Using &module_data might let us clean up some tsib_api stuff in future. */ TSContDataSet(cont, &module_data); } else { /* NULL contdata signals the READ_REQUEST_HDR hook to reject requests */ TSContDataSet(cont, NULL); } TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont); if (!module_data.log_disable) { /* success is documented as TS_LOG_ERROR_NO_ERROR but that's undefined. * It's actually a TS_SUCCESS (proxy/InkAPI.cc line 6641). */ printf("Logging to \"%s\"\n", module_data.log_file); rv = TSTextLogObjectCreate(module_data.log_file, TS_LOG_MODE_ADD_TIMESTAMP, &module_data.logger); if (rv != TS_SUCCESS) { TSError("[ironbee] Error creating log file."); return IB_EUNKNOWN; } } /* Initialize IronBee (including util) */ rc = ib_initialize(); if (rc != IB_OK) { TSError("[ironbee] Error initializing IronBee: %s", ib_status_to_string(rc)); return rc; } /* Create the IronBee engine manager */ TSDebug("ironbee", "Creating IronBee engine manager"); rc = ib_manager_create(&(module_data.manager), /* Engine Manager */ &ibplugin, /* Server object */ module_data.max_engines); /* Default max */ if (rc != IB_OK) { TSError("[ironbee] Error creating IronBee engine manager: %s", ib_status_to_string(rc)); } return rc; }
/** * IronBee initialization function. Sets up engine and logging, * and reads IronBee config. * * @param[in] cf Configuration rec * @return NGX_OK or error */ static ngx_int_t ironbee_init(ngx_conf_t *cf) { ironbee_proc_t *proc; ib_status_t rc; module_data_t *mod_data = &module_data; char *buf; /* We still use the global-log hack to initialise */ ngx_regex_malloc_init(cf->pool); ngx_log_error(NGX_LOG_NOTICE, cf->log, 0, "ironbee_init %d", getpid()); proc = ngx_http_conf_get_module_main_conf(cf, ngx_ironbee_module); if (proc->log_level == NGX_CONF_UNSET_UINT) { proc->log_level = IB_LOG_NOTICE; } if (proc->max_engines == NGX_CONF_UNSET_UINT) { proc->max_engines = IB_MANAGER_DEFAULT_MAX_ENGINES; } if (proc->use_ngxib_logger == NGX_CONF_UNSET) { proc->use_ngxib_logger =1; } /* initialise fields in mod_data */ mod_data->ib_log_active = proc->use_ngxib_logger; mod_data->log = cf->log; mod_data->log_level = proc->log_level; rc = ib_initialize(); if (rc != IB_OK) { cleanup_return IB2NG(rc); } /* Create the IronBee engine manager */ rc = ib_manager_create(&(mod_data->manager), /* Engine Manager */ ngxib_server(), /* Server object */ proc->max_engines); /* Max engines */ if (rc != IB_OK) { cleanup_return IB2NG(rc); } rc = ib_manager_register_module_fn( mod_data->manager, ngxib_module, mod_data); if (rc != IB_OK) { cleanup_return IB2NG(rc); } /* Null manager here would be a bug, as per RNS-CR-143 comments */ assert(mod_data->manager != NULL); /* FIXME - use the temp pool operation for this */ buf = strndup((char*)proc->config_file.data, proc->config_file.len); /* Create the initial engine */ rc = ib_manager_engine_create(mod_data->manager, buf); if (rc != IB_OK) { free(buf); cleanup_return IB2NG(rc); } free(buf); cleanup_return rc == IB_OK ? NGX_OK : IB2NG(rc); }