/** * Safely load a Ruby script in the VM * * @return 0 upon success, -1 otherwise */ int proxenet_ruby_load_file(plugin_t* plugin) { char* pathname; int res = 0; if (!plugin->interpreter || !plugin->interpreter->ready){ xlog_ruby(LOG_ERROR, "Interpreter '%s' is not ready\n", _RUBY_VERSION_); return -1; } if(plugin->state != INACTIVE){ #ifdef DEBUG if(cfg->verbose > 2) xlog_ruby(LOG_DEBUG, "Plugin '%s' is already loaded. Skipping...\n", plugin->name); #endif return 0; } pathname = plugin->fullpath; rb_load_protect(rb_str_new2(pathname), false, &res); if (res != 0) { xlog_ruby(LOG_ERROR, "Error %d when load file '%s'\n", res, pathname); proxenet_ruby_print_last_exception(); return -1; } if (cfg->verbose) xlog_ruby(LOG_INFO, "File '%s' is loaded\n", pathname); if (proxenet_ruby_initialize_function(plugin, REQUEST) < 0) { proxenet_plugin_set_state(plugin, INACTIVE); xlog_ruby(LOG_ERROR, "Failed to init %s in %s\n", CFG_REQUEST_PLUGIN_FUNCTION, plugin->name); return -1; } if (proxenet_ruby_initialize_function(plugin, RESPONSE) < 0) { proxenet_plugin_set_state(plugin, INACTIVE); xlog_ruby(LOG_ERROR, "Failed to init %s in %s\n", CFG_RESPONSE_PLUGIN_FUNCTION, plugin->name); return -1; } return 0; }
void proxenet_initialize_plugins() { plugin_t *plugin = plugins_list; plugin_t *prec_plugin = NULL; plugin_t *next_plugin = NULL; while(plugin) { switch (plugin->type) { #ifdef _PYTHON_PLUGIN case _PYTHON_: if (proxenet_python_initialize_vm(plugin) < 0) { plugin->state = INACTIVE; xlog(LOG_ERROR, "%s\n", "Failed to init Python VM"); goto delete_plugin; } if (proxenet_python_initialize_function(plugin, REQUEST) < 0) { plugin->state = INACTIVE; xlog(LOG_ERROR, "Failed to init %s in %s\n", CFG_REQUEST_PLUGIN_FUNCTION, plugin->name); goto delete_plugin; } if (proxenet_python_initialize_function(plugin, RESPONSE) < 0) { plugin->state = INACTIVE; xlog(LOG_ERROR, "Failed to init %s in %s\n", CFG_RESPONSE_PLUGIN_FUNCTION, plugin->name); goto delete_plugin; } break; #endif #ifdef _C_PLUGIN case _C_: if (proxenet_c_initialize_vm(plugin) < 0) { plugin->state = INACTIVE; xlog(LOG_ERROR, "%s\n", "Failed to init C VM"); goto delete_plugin; } if (proxenet_c_initialize_function(plugin, REQUEST) < 0) { plugin->state = INACTIVE; xlog(LOG_ERROR, "Failed to init %s in %s\n", CFG_REQUEST_PLUGIN_FUNCTION, plugin->name); goto delete_plugin; } if (proxenet_c_initialize_function(plugin, RESPONSE) < 0) { plugin->state = INACTIVE; xlog(LOG_ERROR, "Failed to init %s in %s\n", CFG_RESPONSE_PLUGIN_FUNCTION, plugin->name); goto delete_plugin; } break; #endif #ifdef _RUBY_PLUGIN case _RUBY_: if (proxenet_ruby_initialize_vm(plugin) < 0) { plugin->state = INACTIVE; xlog(LOG_ERROR, "%s\n", "Failed to init Ruby VM"); goto delete_plugin; } if (proxenet_ruby_initialize_function(plugin, REQUEST) < 0) { plugin->state = INACTIVE; xlog(LOG_ERROR, "Failed to init %s in %s\n", CFG_REQUEST_PLUGIN_FUNCTION, plugin->name); goto delete_plugin; } if (proxenet_ruby_initialize_function(plugin, RESPONSE) < 0) { plugin->state = INACTIVE; xlog(LOG_ERROR, "Failed to init %s in %s\n", CFG_RESPONSE_PLUGIN_FUNCTION, plugin->name); goto delete_plugin; } break; #endif #ifdef _PERL_PLUGIN case _PERL_: if (proxenet_perl_initialize_vm(plugin) < 0) { plugin->state = INACTIVE; plugin->type = -1; xlog(LOG_ERROR, "%s\n", "Failed to init Perl VM"); goto delete_plugin; } break; #endif #ifdef _LUA_PLUGIN case _LUA_: if (proxenet_lua_initialize_vm(plugin) < 0) { plugin->state = INACTIVE; xlog(LOG_ERROR, "%s\n", "Failed to init Lua VM"); goto delete_plugin; } if (proxenet_lua_load_file(plugin) < 0) { plugin->state = INACTIVE; xlog(LOG_ERROR, "Failed to load %s\n", plugin->filename); goto delete_plugin; } break; #endif default: break; } if (cfg->verbose > 1) xlog(LOG_INFO, "Successfully initialiazed '%s'\n", plugin->filename); prec_plugin = plugin; plugin = plugin->next; continue; delete_plugin: if(prec_plugin) { prec_plugin->next = plugin->next; } else { plugins_list = plugin->next; } if (cfg->verbose > 1) xlog(LOG_ERROR, "Removing '%s' from plugin list\n", plugin->filename); next_plugin = plugin->next; proxenet_remove_plugin(plugin); plugin = next_plugin; } }