Skip to content

Commit 14900e7

Browse files
committed
wip
1 parent 0b9d315 commit 14900e7

2 files changed

Lines changed: 77 additions & 53 deletions

File tree

configure.ac

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,13 @@ AC_ARG_WITH([logdir],
485485
[ CRM_LOG_DIR="$withval" ]
486486
)
487487

488+
DLOPEN_ROOT_DIR=""
489+
AC_ARG_WITH([dlopen-root-dir],
490+
[AS_HELP_STRING([--with-dlopen-root-dir=DIR],
491+
[directory for dlopen plugins @<:@LIBEXECDIR/dlopen@:>@])],
492+
[ DLOPEN_ROOT_DIR="$withval" ]
493+
)
494+
488495
CRM_BUNDLE_DIR=""
489496
AC_ARG_WITH([bundledir],
490497
[AS_HELP_STRING([--with-bundledir=DIR],
@@ -693,6 +700,10 @@ expand_path_option CRM_LOG_DIR "${localstatedir}/log/pacemaker"
693700
AC_DEFINE_UNQUOTED(CRM_LOG_DIR,"$CRM_LOG_DIR", Location for Pacemaker log file)
694701
AC_SUBST(CRM_LOG_DIR)
695702

703+
expand_path_option DLOPEN_ROOT_DIR "${libexecdir}/log/pacemaker"
704+
AC_DEFINE_UNQUOTED(DLOPEN_ROOT_DIR, "$DLOPEN_ROOT_DIR", Directory for dlopen plugins)
705+
AC_SUBST(DLOPEN_ROOT_DIR)
706+
696707
expand_path_option CRM_BUNDLE_DIR "${localstatedir}/log/pacemaker/bundles"
697708
AC_DEFINE_UNQUOTED(CRM_BUNDLE_DIR,"$CRM_BUNDLE_DIR", Location for Pacemaker bundle logs)
698709
AC_SUBST(CRM_BUNDLE_DIR)

lib/services/services_dlopen.c

Lines changed: 66 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@
1515
#include "services_private.h"
1616
#include "services_dlopen.h"
1717

18-
#define PCMK_DLOPEN_DIR "/usr/lib/dlopen" // or "/usr/lib/dlopen/"
18+
// #define DLOPEN_ROOT_DIR "/usr/lib/dlopen" // or "/usr/lib/dlopen/"
1919

2020
GList *
2121
services__list_dlopen_agents(void)
2222
{
23-
return services_os_get_directory_list(PCMK_DLOPEN_DIR, TRUE, FALSE);
23+
return services_os_get_directory_list(DLOPEN_ROOT_DIR, TRUE, FALSE);
2424
}
2525

2626
bool
2727
services__dlopen_agent_exists(const char *agent)
2828
{
2929
bool rc = FALSE;
3030
struct stat st;
31-
char *path = pcmk__full_path(agent, PCMK_DLOPEN_DIR);
31+
char *path = pcmk__full_path(agent, DLOPEN_ROOT_DIR);
3232

3333
rc = (stat(path, &st) == 0);
3434
free(path);
@@ -38,7 +38,7 @@ services__dlopen_agent_exists(const char *agent)
3838
int
3939
services__dlopen_prepare(svc_action_t *op)
4040
{
41-
op->opaque->exec = pcmk__full_path(op->agent, PCMK_DLOPEN_DIR);
41+
op->opaque->exec = pcmk__full_path(op->agent, DLOPEN_ROOT_DIR);
4242
op->opaque->args[0] = strdup(op->opaque->exec);
4343
op->opaque->args[1] = strdup(op->action);
4444
if ((op->opaque->args[0] == NULL) || (op->opaque->args[1] == NULL)) {
@@ -67,34 +67,48 @@ int
6767
services__execute_dlopen_metadata(svc_action_t *op) {
6868
void *lib;
6969
char *lib_error;
70-
const char *metadata;
70+
char *error;
71+
int (*exec)(char **);
7172
char dst[200] = "/usr/lib/dlopen/";
7273
strcat(dst, op->agent);
74+
g_hash_table_replace(op->params, strdup("OCF_RESOURCE_INSTANCE"), strdup(op->rsc));
7375
lib = dlopen(dst, RTLD_NOW | RTLD_LOCAL | RTLD_NODELETE);
7476

7577
if (!lib) {
7678
return pcmk_rc_error;
77-
}
78-
79-
metadata = dlsym(lib, "metadata");
79+
} else {
80+
exec = dlsym(lib, "metadata");
8081

81-
if ((lib_error = dlerror()) != NULL){
82-
free(lib_error);
83-
84-
return pcmk_rc_error;
85-
}
82+
if ((lib_error = dlerror()) != NULL){
83+
free(lib_error);
8684

87-
op->rc = PCMK_OCF_OK;
88-
op->status = PCMK_EXEC_DONE;
89-
op->pid = 0;
90-
op->stdout_data = strdup(metadata);
91-
92-
if (op->opaque->callback) {
93-
op->opaque->callback(op);
85+
return pcmk_rc_error;
86+
} else {
87+
op->rc = exec(&op->stdout_data);
88+
op->status = PCMK_EXEC_DONE;
89+
op->pid = 0;
90+
if (op->interval_ms != 0) {
91+
// Recurring operations must be either cancelled or rescheduled
92+
if (op->cancel) {
93+
services__set_cancelled(op);
94+
cancel_recurring_action(op);
95+
} else {
96+
op->opaque->repeat_timer = g_timeout_add(op->interval_ms,
97+
recurring_action_timer,
98+
(void *) op);
99+
}
100+
}
101+
102+
if (op->opaque->callback) {
103+
op->opaque->callback(op);
104+
}
105+
106+
crm_info("Exit code: %d, error: %s", op->rc, error);
107+
108+
dlclose(lib);
109+
return pcmk_rc_ok;
110+
}
94111
}
95-
96-
dlclose(lib);
97-
return pcmk_rc_ok;
98112
}
99113

100114
int
@@ -105,43 +119,42 @@ services__execute_dlopen_action(svc_action_t *op) {
105119
int (*exec)(GHashTable *, char **);
106120
char dst[200] = "/usr/lib/dlopen/";
107121
strcat(dst, op->agent);
108-
g_hash_table_replace(op->params, strdup("DLOPEN_RESOURCE_INSTANCE"), strdup(op->rsc));
122+
g_hash_table_replace(op->params, strdup("OCF_RESOURCE_INSTANCE"), strdup(op->rsc));
109123
lib = dlopen(dst, RTLD_NOW | RTLD_LOCAL | RTLD_NODELETE);
110124

111125
if (!lib) {
112126
return pcmk_rc_error;
113-
}
114-
115-
exec = dlsym(lib, op->action);
116-
117-
if ((lib_error = dlerror()) != NULL){
118-
free(lib_error);
119-
120-
return pcmk_rc_error;
121-
}
127+
} else {
128+
exec = dlsym(lib, op->action);
122129

123-
op->rc = exec(op->params, &error);
124-
op->status = PCMK_EXEC_DONE;
125-
op->pid = 0;
130+
if ((lib_error = dlerror()) != NULL){
131+
free(lib_error);
126132

127-
if (op->interval_ms != 0) {
128-
// Recurring operations must be either cancelled or rescheduled
129-
if (op->cancel) {
130-
services__set_cancelled(op);
131-
cancel_recurring_action(op);
133+
return pcmk_rc_error;
132134
} else {
133-
op->opaque->repeat_timer = g_timeout_add(op->interval_ms,
134-
recurring_action_timer,
135-
(void *) op);
135+
op->rc = exec(op->params, &error);
136+
op->status = PCMK_EXEC_DONE;
137+
op->pid = 0;
138+
if (op->interval_ms != 0) {
139+
// Recurring operations must be either cancelled or rescheduled
140+
if (op->cancel) {
141+
services__set_cancelled(op);
142+
cancel_recurring_action(op);
143+
} else {
144+
op->opaque->repeat_timer = g_timeout_add(op->interval_ms,
145+
recurring_action_timer,
146+
(void *) op);
147+
}
148+
}
149+
150+
if (op->opaque->callback) {
151+
op->opaque->callback(op);
152+
}
153+
154+
crm_info("Exit code: %d, error: %s", op->rc, error);
155+
156+
dlclose(lib);
157+
return pcmk_rc_ok;
136158
}
137159
}
138-
139-
if (op->opaque->callback) {
140-
op->opaque->callback(op);
141-
}
142-
143-
crm_info("Exit code: %d, error: %s", op->rc, error);
144-
145-
dlclose(lib);
146-
return pcmk_rc_ok;
147160
}

0 commit comments

Comments
 (0)