static char* test_api_assertion() { lsb_lua_sandbox *sb = lsb_create(NULL, "lua/counter.lua", "", NULL); lsb_err_value ret = lsb_init(sb, NULL); mu_assert(!ret, "lsb_init() received: %s", ret); lsb_stop_sandbox(NULL); mu_assert(lsb_destroy(NULL) == NULL, "not null"); mu_assert(lsb_usage(NULL, 0, 0) == 0, "not 0"); mu_assert(lsb_usage(sb, LSB_UT_MAX, 0) == 0, "not 0"); mu_assert(lsb_usage(sb, 0, LSB_US_MAX) == 0, "not 0"); mu_assert(strcmp(lsb_get_error(NULL), "") == 0, "not empty"); lsb_set_error(NULL, "foo"); mu_assert(lsb_get_lua(NULL) == NULL, "not null"); mu_assert(lsb_get_lua_file(NULL) == NULL, "not null"); mu_assert(lsb_get_parent(NULL) == NULL, "not null"); mu_assert(lsb_get_logger(NULL) == NULL, "not null"); mu_assert(lsb_get_state(NULL) == LSB_UNKNOWN, "not unknown"); lsb_add_function(NULL, lsb_test_write_output, "foo"); lsb_add_function(sb, NULL, "foo"); lsb_add_function(sb, lsb_test_write_output, NULL); mu_assert(lsb_pcall_setup(NULL, "foo") == LSB_ERR_UTIL_NULL, "not null"); mu_assert(lsb_pcall_setup(sb, NULL) == LSB_ERR_UTIL_NULL, "not null"); lsb_add_function(NULL, NULL, NULL); lsb_pcall_teardown(NULL); lsb_terminate(NULL, NULL); lsb_terminate(sb, NULL); lsb_add_function(sb, lsb_test_write_output, "write_output"); e = lsb_destroy(sb); mu_assert(!e, "lsb_destroy() received: %s", e); return NULL; }
const char* lsb_heka_get_lua_file(lsb_heka_sandbox *hsb) { return hsb ? lsb_get_lua_file(hsb->lsb) : NULL; }
static void process_lua(hs_output_plugins* plugins, const char* lpath, const char* rpath, DIR* dp) { char lua_lpath[HS_MAX_PATH]; char lua_rpath[HS_MAX_PATH]; char cfg_lpath[HS_MAX_PATH]; char cfg_rpath[HS_MAX_PATH]; size_t tlen = strlen(hs_output_dir) + 1; struct dirent* entry; while ((entry = readdir(dp))) { if (hs_has_ext(entry->d_name, hs_lua_ext)) { // move the Lua to the run directory if (!hs_get_fqfn(lpath, entry->d_name, lua_lpath, sizeof(lua_lpath))) { hs_log(g_module, 0, "load lua path too long"); exit(EXIT_FAILURE); } if (!hs_get_fqfn(rpath, entry->d_name, lua_rpath, sizeof(lua_rpath))) { hs_log(g_module, 0, "run lua path too long"); exit(EXIT_FAILURE); } if (rename(lua_lpath, lua_rpath)) { hs_log(g_module, 3, "failed to move: %s to %s errno: %d", lua_lpath, lua_rpath, errno); continue; } // restart any plugins using this Lua code pthread_mutex_lock(&plugins->list_lock); for (int i = 0; i < plugins->list_cap; ++i) { if (!plugins->list[i]) continue; hs_output_plugin* p = plugins->list[i]; if (strcmp(lua_rpath, lsb_get_lua_file(p->sb->lsb)) == 0) { int ret = snprintf(cfg_lpath, HS_MAX_PATH, "%s/%s%s", lpath, p->sb->name + tlen, hs_cfg_ext); if (ret < 0 || ret > HS_MAX_PATH - 1) { hs_log(g_module, 0, "load cfg path too long"); exit(EXIT_FAILURE); } ret = snprintf(cfg_rpath, HS_MAX_PATH, "%s/%s%s", rpath, p->sb->name + tlen, hs_cfg_ext); if (ret < 0 || ret > HS_MAX_PATH - 1) { hs_log(g_module, 0, "run cfg path too long"); exit(EXIT_FAILURE); } // if no new cfg was provided, move the existing cfg to the load // directory if (!hs_file_exists(cfg_lpath)) { if (rename(cfg_rpath, cfg_lpath)) { hs_log(g_module, 3, "failed to move: %s to %s errno: %d", cfg_rpath, cfg_lpath, errno); } } } } pthread_mutex_unlock(&plugins->list_lock); } } rewinddir(dp); }