24#include <stonith/stonith.h>
28#define LHA_STONITH_LIBRARY "libstonith.so.1"
30static void *lha_agents_lib = NULL;
33static const char META_TEMPLATE[] =
63find_library_function(
void **handle,
const char *lib,
const char *fn)
67 if (*handle == NULL) {
68 *handle = dlopen(lib, RTLD_LAZY);
69 if ((*handle) == NULL) {
70 crm_err(
"Could not open %s: %s", lib, dlerror());
75 a_function = dlsym(*handle, fn);
76 if (a_function == NULL) {
77 crm_err(
"Could not find %s in %s: %s", fn, lib, dlerror());
94 Stonith *stonith_obj = NULL;
96 static bool need_init =
true;
97 static Stonith *(*st_new_fn) (
const char *) = NULL;
98 static void (*st_del_fn) (Stonith *) = NULL;
108 if (lha_agents_lib && st_new_fn && st_del_fn) {
109 stonith_obj = (*st_new_fn) (agent);
111 (*st_del_fn) (stonith_obj);
121 static gboolean need_init = TRUE;
125 char **type_list = NULL;
126 static char **(*type_list_fn) (void) = NULL;
127 static void (*type_free_fn) (
char **) = NULL;
131 type_list_fn = find_library_function(&lha_agents_lib,
134 type_free_fn = find_library_function(&lha_agents_lib,
136 "stonith_free_hostlist");
140 type_list = (*type_list_fn) ();
143 for (entry = type_list; entry != NULL && *entry; ++entry) {
148 if (type_list && type_free_fn) {
149 (*type_free_fn) (type_list);
155stonith_plugin(
int priority,
const char *fmt, ...) G_GNUC_PRINTF(2, 3);
158stonith_plugin(
int priority, const
char *format, ...)
166 va_start(ap, format);
168 len = vasprintf (&
string, format, ap);
183 static const char *no_parameter_info =
"<!-- no value -->";
185 Stonith *stonith_obj = NULL;
187 static gboolean need_init = TRUE;
188 static Stonith *(*st_new_fn) (
const char *) = NULL;
189 static const char *(*st_info_fn) (Stonith *, int) = NULL;
190 static void (*st_del_fn) (Stonith *) = NULL;
191 static void (*st_log_fn) (Stonith *, PILLogFun) = NULL;
205 if (lha_agents_lib && st_new_fn && st_del_fn && st_info_fn && st_log_fn) {
206 const char *meta_longdesc = NULL;
207 const char *meta_shortdesc = NULL;
208 const char *meta_param = NULL;
209 const char *timeout_str = NULL;
211 gchar *meta_longdesc_esc = NULL;
212 gchar *meta_shortdesc_esc = NULL;
214 stonith_obj = st_new_fn(agent);
215 if (stonith_obj != NULL) {
216 st_log_fn(stonith_obj, (PILLogFun) &stonith_plugin);
218 meta_longdesc = st_info_fn(stonith_obj, ST_DEVICEDESCR);
219 if (meta_longdesc == NULL) {
220 crm_warn(
"no long description in %s's metadata.", agent);
221 meta_longdesc = no_parameter_info;
224 meta_shortdesc = st_info_fn(stonith_obj, ST_DEVICEID);
225 if (meta_shortdesc == NULL) {
226 crm_warn(
"no short description in %s's metadata.", agent);
227 meta_shortdesc = no_parameter_info;
230 meta_param = st_info_fn(stonith_obj, ST_CONF_XML);
231 if (meta_param == NULL) {
232 crm_warn(
"no list of parameters in %s's metadata.", agent);
233 meta_param = no_parameter_info;
236 st_del_fn(stonith_obj);
240 crm_perror(LOG_ERR,
"Agent %s not found", agent);
247 meta_longdesc = meta_longdesc_esc;
252 meta_shortdesc = meta_shortdesc_esc;
261 meta_shortdesc, meta_param,
262 timeout_str, timeout_str, timeout_str);
264 g_free(meta_longdesc_esc);
265 g_free(meta_shortdesc_esc);
279#include <pils/plugin.h>
286 return PIL_strerror(rc);
291 const char *agent, GHashTable *params,
int timeout,
292 char **output,
char **error_output)
295 crm_perror(LOG_ERR,
"Cannot validate Linux-HA fence agents");
#define PCMK_ACTION_STATUS
#define PCMK_ACTION_META_DATA
#define PCMK_ACTION_START
#define PCMK_DEFAULT_ACTION_TIMEOUT_MS
Default timeout (in milliseconds) for non-metadata actions.
#define PCMK_ACTION_MONITOR
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
const char * pcmk__readable_interval(guint interval_ms)
#define crm_warn(fmt, args...)
#define crm_perror(level, fmt, args...)
Send a system error message to both the log and stderr.
#define crm_err(fmt, args...)
#define do_crm_log_alias(level, file, function, line, fmt, args...)
Log a message as if it came from a different code location.
#define crm_trace(fmt, args...)
#define PCMK_META_INTERVAL
#define PCMK_META_TIMEOUT
int stonith__lha_metadata(const char *agent, int timeout, char **output)
const char * i_hate_pils(int rc)
int stonith__list_lha_agents(stonith_key_value_t **devices)
int stonith__lha_validate(stonith_t *st, int call_options, const char *target, const char *agent, GHashTable *params, int timeout, char **output, char **error_output)
#define LHA_STONITH_LIBRARY
bool stonith__agent_is_lha(const char *agent)
stonith_key_value_t * stonith_key_value_add(stonith_key_value_t *kvp, const char *key, const char *value)
Wrappers for and extensions to libxml2.
bool pcmk__xml_needs_escape(const char *text, enum pcmk__xml_escape_type type)
char * pcmk__xml_escape(const char *text, enum pcmk__xml_escape_type type)
#define PCMK_XE_SHORTDESC
#define PCMK_XE_RESOURCE_AGENT