Пример #1
0
/**
 * 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;
}
Пример #2
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;
	}
	
}