raexecstonith.c
来自「linux集群服务器软件代码包」· C语言 代码 · 共 350 行
C
350 行
/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * File: raexecocf.c * Author: Sun Jiang Dong <sunjd@cn.ibm.com> * Copyright (c) 2004 International Business Machines * * This code implements the Resource Agent Plugin Module for LSB style. * It's a part of Local Resource Manager. Currently it's used by lrmd only. */#include <portability.h>#include <stdio.h> #include <string.h>#include <unistd.h>#include <stdlib.h>#include <libgen.h>#include <sys/types.h>#include <sys/wait.h>#include <sys/stat.h>#include <errno.h>#include <glib.h>#include <clplumbing/cl_log.h>#include <pils/plugin.h>#include <dirent.h>#include <libgen.h> /* Add it for compiling on OSX */#include <config.h>#include <lrm/raexec.h>#include <fencing/stonithd_api.h># define PIL_PLUGINTYPE RA_EXEC_TYPE# define PIL_PLUGINTYPE_S "RAExec"# define PIL_PLUGINLICENSE LICENSE_PUBDOM# define PIL_PLUGINLICENSEURL URL_PUBDOM# define PIL_PLUGIN stonith# define PIL_PLUGIN_S "stonith"static PIL_rc close_stonithRA(PILInterface*, void* ud_interface);/* static const char * RA_PATH = STONITH_RA_DIR; *//* Temporarily use it */static const char * RA_PATH = "/usr/lib/stonith/plugins/stonith/";/* The begin of exported function list */static int execra(const char * rsc_id, const char * rsc_type, const char * provider, const char * op_type, const int timeout, GHashTable * params);static uniform_ret_execra_t map_ra_retvalue(int ret_execra, const char * op_type);static int get_resource_list(GList ** rsc_info);static char* get_resource_meta(const char* rsc_type, const char* provider);static int get_provider_list(const char* op_type, GList ** providers);/* The end of exported function list *//* The begin of internal used function & data list */static int get_providers(const char* class_path, const char* op_type, GList ** providers);static void stonithRA_ops_callback(stonithRA_ops_t * op, void * private_data);static int exit_value;/* The end of internal function & data list *//* Rource agent execution plugin operations */static struct RAExecOps raops ={ execra, map_ra_retvalue, get_resource_list, get_provider_list, get_resource_meta};static const char * meta_data1 = "\n""<?xml version=\"1.0\"?>\n""<!DOCTYPE resource-agent SYSTEM \"ra-api-1.dtd\">\n""<resource-agent name=\"";static const char * meta_data2 = "\" version=\"0.1\">\n"" <version>1.0</version>\n"" <parameters>\n"" <parameter name=\"config_string\" unique=\"0\">\n"" <longdesc lang=\"en\">\n"" Config string for a stonith resource -- one type of stonith devices\n"" </longdesc>\n"" <shortdesc lang=\"en\">Config string</shortdesc>\n"" <content type=\"string\" default=\"\" />\n"" </parameter>\n"" <parameter name=\"config_file\" unique=\"0\">\n"" <longdesc lang=\"en\">\n"" Config file for a stonith resource -- one type of stonithd devices.\n"" </longdesc>\n"" <shortdesc lang=\"en\">Config file</shortdesc>\n"" <content type=\"string\" default=\"\" />\n"" </parameter>\n"" </parameters>\n"" <actions>\n"" <action name=\"start\" timeout=\"15\" />\n"" <action name=\"stop\" timeout=\"15\" />\n"" <action name=\"monitor\" timeout=\"15\" interval=\"15\" start-delay=\"15\" />\n"" <action name=\"meta-data\" timeout=\"5\" />\n"" </actions>\n"" <special tag=\"heartbeat\">\n"" <version>2.0</version>\n"" </special>\n""</resource-agent>\n";PIL_PLUGIN_BOILERPLATE2("1.0", Debug);static const PILPluginImports* PluginImports;static PILPlugin* OurPlugin;static PILInterface* OurInterface;static void* OurImports;static void* interfprivate;/* * Our plugin initialization and registration function * It gets called when the plugin gets loaded. */PIL_rcPIL_PLUGIN_INIT(PILPlugin * us, const PILPluginImports* imports);PIL_rcPIL_PLUGIN_INIT(PILPlugin * us, const PILPluginImports* imports){ /* Force the compiler to do a little type checking */ (void)(PILPluginInitFun)PIL_PLUGIN_INIT; PluginImports = imports; OurPlugin = us; /* Register ourself as a plugin */ imports->register_plugin(us, &OurPIExports); /* Register our interfaces */ return imports->register_interface(us, PIL_PLUGINTYPE_S, PIL_PLUGIN_S, &raops, close_stonithRA, &OurInterface, &OurImports, interfprivate);}static PIL_rcclose_stonithRA(PILInterface* pif, void* ud_interface){ return PIL_OK;}/* * Most of the oprations will be sent to sotnithd directly, such as 'start', * 'stop', 'monitor'. And others like 'meta-data' will be handled by itself * locally. * Some of important parameters' name: * config_file * config_string */static intexecra(const char * rsc_id, const char * rsc_type, const char * provider, const char * op_type,const int timeout, GHashTable * params){ stonithRA_ops_t * op; int call_id = -1; /* Handling "meta-data" operation in a special way. * Now handle "meta-data" operation locally. * Should be changed in the future? */ if (strncmp(op_type, "meta-data", strlen("meta-data")) == 0) { char * tmp; tmp = get_resource_meta(rsc_type, provider); printf("%s", tmp); g_free(tmp); exit(0); } if (ST_OK != stonithd_signon("STONITH_RA_EXEC")) { cl_log(LOG_ERR, "Can not signon to the stonithd."); exit(EXECRA_UNKNOWN_ERROR); } stonithd_set_stonithRA_ops_callback(stonithRA_ops_callback, &call_id); /* Temporarily donnot use it, but how to deal with the global OCF * variables. This is a important thing to think about and do. */ /* send the RA operation to stonithd to simulate a RA's actions */ cl_log(LOG_DEBUG, "Will send the stonith RA operation to stonithd: " "%s %s", rsc_type, op_type); op = g_new(stonithRA_ops_t, 1); op->ra_name = g_strdup(rsc_type); op->op_type = g_strdup(op_type); op->params = params; op->rsc_id = g_strdup(rsc_id); if (ST_OK != stonithd_virtual_stonithRA_ops(op, &call_id)) { cl_log(LOG_ERR, "sending stonithRA op to stonithd failed."); /* Need to improve the granularity for error return code */ stonithd_signoff(); exit(EXECRA_EXEC_UNKNOWN_ERROR); } cl_log(LOG_DEBUG, "Waiting until the final result returned."); /* May be redundant */ /* while (stonithd_op_result_ready() != TRUE) { ; } */ cl_log(LOG_DEBUG, "Will call stonithd_receive_ops_result."); if (ST_OK != stonithd_receive_ops_result(TRUE)) { cl_log(LOG_ERR, "stonithd_receive_ops_result failed."); /* Need to improve the granularity for error return code */ stonithd_signoff(); exit(EXECRA_EXEC_UNKNOWN_ERROR); } /* exit_value will be setted by the callback function */ g_free(op->ra_name); g_free(op->op_type); g_free(op->rsc_id); g_free(op); stonithd_signoff(); cl_log(LOG_DEBUG, "stonithRA orignal exit code=%d", exit_value); exit(map_ra_retvalue(exit_value, op_type));}static voidstonithRA_ops_callback(stonithRA_ops_t * op, void * private_data){ cl_log(LOG_DEBUG, "setting exit code=%d", exit_value); exit_value = op->op_result;}static uniform_ret_execra_tmap_ra_retvalue(int ret_execra, const char * op_type){ /* Because the UNIFORM_RET_EXECRA is compatible with OCF standard */ return ret_execra;}static intget_resource_list(GList ** rsc_info){ cl_log(LOG_ERR, "get_resource_list: begin."); if ( rsc_info == NULL ) { cl_log(LOG_ERR, "Parameter error: get_resource_list"); return -2; } if ( *rsc_info != NULL ) { cl_log(LOG_ERR, "Parameter error: get_resource_list."\ "will cause memory leak."); *rsc_info = NULL; } if (ST_OK != stonithd_signon("STONITH_RA")) { cl_log(LOG_ERR, "Can not signon to the stonithd."); return -1; } return stonithd_list_stonith_types(rsc_info);}static intget_provider_list(const char* op_type, GList ** providers){ int ret; ret = get_providers(RA_PATH, op_type, providers); if (0>ret) { cl_log(LOG_ERR, "scandir failed in stonith RA plugin"); } return ret;}static char *get_resource_meta(const char* rsc_type, const char* provider){ char * buffer; buffer = g_new(char, strlen(meta_data1)+strlen(meta_data2)+40); sprintf(buffer, "%s%s%s", meta_data1, rsc_type, meta_data2); return buffer;}/* * Currently should return *providers = NULL, but rmain the old code for * possible unsing in the future */static intget_providers(const char* class_path, const char* op_type, GList ** providers){ if ( providers == NULL ) { cl_log(LOG_ERR, "Parameter error: get_providers"); return -2; } if ( *providers != NULL ) { cl_log(LOG_ERR, "Parameter error: get_providers."\ "will cause memory leak."); *providers = NULL; } return 0;#if 0 struct dirent **namelist; int file_num; file_num = scandir(class_path, &namelist, 0, alphasort); if (file_num < 0) { return -2; }else{ char tmp_buffer[FILENAME_MAX+1]; while (file_num--) { if ((DT_DIR != namelist[file_num]->d_type) || ('.' == namelist[file_num]->d_name[0])) { free(namelist[file_num]); continue; } snprintf(tmp_buffer,FILENAME_MAX,"%s/%s/%s", class_path, namelist[file_num]->d_name, op_type); if ( filtered(tmp_buffer) == TRUE ) { *providers = g_list_append(*providers, g_strdup(namelist[file_num]->d_name)); } free(namelist[file_num]); } free(namelist); } return g_list_length(*providers);#endif}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?