ctdb-common: Use script abstraction in run_event
authorMartin Schwenke <martin@meltin.net>
Thu, 12 Jul 2018 03:26:27 +0000 (13:26 +1000)
committerAmitay Isaacs <amitay@samba.org>
Sat, 28 Jul 2018 15:14:11 +0000 (17:14 +0200)
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>
ctdb/common/run_event.c
ctdb/tests/src/run_event_test.c

index a2155500f289fc32279e3f7ee8fa708d2a99bc40..91b3dd3241aa4dd941b3cc7cbc8a03e3c253ef59 100644 (file)
 
 #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;
-       }
-
-       ret = fstat(fd, &st);
-       if (ret != 0) {
-               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];
 
-       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);
-       }
+               script->name = talloc_steal(script_list->script, s->name);
 
-       ret = fchmod(fd, new_mode);
-       if (ret != 0) {
-               ret = errno;
-               goto done;
+               if (! s->enabled) {
+                       script->summary = -ENOEXEC;
+               }
        }
 
-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++) {
+       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];
-               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;
-               }
+               script->name = talloc_steal(script_list->script, s->name);
 
-               if (! (st.st_mode & S_IXUSR)) {
+               if (! s->enabled) {
                        script->summary = -ENOEXEC;
                }
-
-               TALLOC_FREE(path);
        }
 
+
+       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);
 }
 
 /*
index e58d07a9eaef217d2eb911393a9d80f23bda5f2d..2d0053c459aad9d0dd5ab04e90bf90e54d3d797f 100644 (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)