1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-07 00:58:40 +03:00

ctdb-common: Use script abstraction in run_event

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13551

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
(cherry picked from commit 82e62488027302e541739628210292c2d95717e1)
This commit is contained in:
Martin Schwenke 2018-07-12 13:26:27 +10:00 committed by Karolin Seeger
parent 4cce86e872
commit 0c65347e94
2 changed files with 67 additions and 165 deletions

View File

@ -31,177 +31,70 @@
#include "common/logging.h"
#include "common/run_proc.h"
#include "common/event_script.h"
#include "common/run_event.h"
/*
* Utility functions
*/
static int script_filter(const struct dirent *de)
{
int ret;
/* Match a script pattern */
ret = fnmatch("[0-9][0-9].*.script", de->d_name, 0);
if (ret == 0) {
return 1;
}
return 0;
}
static int get_script_list(TALLOC_CTX *mem_ctx,
const char *script_dir,
struct run_event_script_list **out)
{
struct dirent **namelist = NULL;
struct event_script_list *s_list;
struct run_event_script_list *script_list;
size_t ls;
int count, ret;
int i;
unsigned int i;
int ret;
count = scandir(script_dir, &namelist, script_filter, alphasort);
if (count == -1) {
ret = errno;
ret = event_script_get_list(mem_ctx, script_dir, &s_list);
if (ret != 0) {
if (ret == ENOENT) {
D_WARNING("event script dir %s removed\n", script_dir);
} else {
D_WARNING("scandir() failed on %s, ret=%d\n",
D_WARNING("failed to get script list for %s, ret=%d\n",
script_dir, ret);
}
*out = NULL;
goto done;
return ret;
}
if (count == 0) {
if (s_list->num_scripts == 0) {
*out = NULL;
ret = 0;
goto done;
talloc_free(s_list);
return 0;
}
script_list = talloc_zero(mem_ctx, struct run_event_script_list);
if (script_list == NULL) {
talloc_free(s_list);
return ENOMEM;
}
script_list->num_scripts = count;
script_list->num_scripts = s_list->num_scripts;
script_list->script = talloc_zero_array(script_list,
struct run_event_script,
count);
script_list->num_scripts);
if (script_list->script == NULL) {
ret = ENOMEM;
talloc_free(s_list);
talloc_free(script_list);
goto done;
}
ls = strlen(".script");
for (i=0; i<count; i++) {
struct run_event_script *s = &script_list->script[i];
s->name = talloc_strndup(script_list,
namelist[i]->d_name,
strlen(namelist[i]->d_name) - ls);
if (s->name == NULL) {
ret = ENOMEM;
talloc_free(script_list);
goto done;
}
}
*out = script_list;
ret = 0;
done:
if (namelist != NULL && count != -1) {
for (i=0; i<count; i++) {
free(namelist[i]);
}
free(namelist);
}
return ret;
}
static int script_chmod(TALLOC_CTX *mem_ctx, const char *script_dir,
const char *script_name, bool enable)
{
DIR *dirp;
struct dirent *de;
char script_file[PATH_MAX];
int ret, new_mode;
char *filename;
struct stat st;
bool found;
int fd = -1;
ret = snprintf(script_file,
sizeof(script_file),
"%s.script",
script_name);
if (ret >= sizeof(script_file)) {
return ENAMETOOLONG;
}
dirp = opendir(script_dir);
if (dirp == NULL) {
return errno;
}
found = false;
while ((de = readdir(dirp)) != NULL) {
if (strcmp(de->d_name, script_file) == 0) {
/* check for valid script names */
ret = script_filter(de);
if (ret == 0) {
closedir(dirp);
return EINVAL;
}
found = true;
break;
}
}
closedir(dirp);
if (! found) {
return ENOENT;
}
filename = talloc_asprintf(mem_ctx, "%s/%s", script_dir, script_file);
if (filename == NULL) {
return ENOMEM;
}
fd = open(filename, O_RDWR);
if (fd == -1) {
ret = errno;
goto done;
for (i = 0; i < s_list->num_scripts; i++) {
struct event_script *s = s_list->script[i];
struct run_event_script *script = &script_list->script[i];
script->name = talloc_steal(script_list->script, s->name);
if (! s->enabled) {
script->summary = -ENOEXEC;
}
}
ret = fstat(fd, &st);
if (ret != 0) {
ret = errno;
goto done;
}
if (enable) {
new_mode = st.st_mode | (S_IXUSR | S_IXGRP | S_IXOTH);
} else {
new_mode = st.st_mode & ~(S_IXUSR | S_IXGRP | S_IXOTH);
}
ret = fchmod(fd, new_mode);
if (ret != 0) {
ret = errno;
goto done;
}
done:
if (fd != -1) {
close(fd);
}
talloc_free(filename);
return ret;
talloc_free(s_list);
*out = script_list;
return 0;
}
static int script_args(TALLOC_CTX *mem_ctx, const char *event_str,
@ -392,45 +285,51 @@ int run_event_list(struct run_event_context *run_ctx,
TALLOC_CTX *mem_ctx,
struct run_event_script_list **output)
{
struct event_script_list *s_list;
struct run_event_script_list *script_list;
int ret, i;
ret = get_script_list(mem_ctx, run_event_script_dir(run_ctx),
&script_list);
ret = event_script_get_list(mem_ctx,
run_event_script_dir(run_ctx),
&s_list);
if (ret != 0) {
return ret;
}
if (script_list == NULL) {
if (s_list->num_scripts == 0) {
*output = NULL;
talloc_free(s_list);
return 0;
}
for (i=0; i<script_list->num_scripts; i++) {
struct run_event_script *script = &script_list->script[i];
struct stat st;
char *path = NULL;
path = talloc_asprintf(mem_ctx, "%s/%s.script",
run_event_script_dir(run_ctx),
script->name);
if (path == NULL) {
continue;
}
ret = stat(path, &st);
if (ret != 0) {
TALLOC_FREE(path);
continue;
}
if (! (st.st_mode & S_IXUSR)) {
script->summary = -ENOEXEC;
}
TALLOC_FREE(path);
script_list = talloc_zero(mem_ctx, struct run_event_script_list);
if (script_list == NULL) {
return ENOMEM;
}
script_list->num_scripts = s_list->num_scripts;
script_list->script = talloc_zero_array(script_list,
struct run_event_script,
script_list->num_scripts);
if (script_list->script == NULL) {
talloc_free(s_list);
talloc_free(script_list);
return ENOMEM;
}
for (i=0; i < s_list->num_scripts; i++) {
struct event_script *s = s_list->script[i];
struct run_event_script *script = &script_list->script[i];
script->name = talloc_steal(script_list->script, s->name);
if (! s->enabled) {
script->summary = -ENOEXEC;
}
}
talloc_free(s_list);
*output = script_list;
return 0;
}
@ -438,15 +337,17 @@ int run_event_list(struct run_event_context *run_ctx,
int run_event_script_enable(struct run_event_context *run_ctx,
const char *script_name)
{
return script_chmod(run_ctx, run_event_script_dir(run_ctx),
script_name, true);
return event_script_chmod(run_event_script_dir(run_ctx),
script_name,
true);
}
int run_event_script_disable(struct run_event_context *run_ctx,
const char *script_name)
{
return script_chmod(run_ctx, run_event_script_dir(run_ctx),
script_name, false);
return event_script_chmod(run_event_script_dir(run_ctx),
script_name,
false);
}
/*

View File

@ -24,6 +24,7 @@
#include "common/db_hash.c"
#include "common/run_proc.c"
#include "common/event_script.c"
#include "common/run_event.c"
static void usage(const char *prog)