summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ctdb/event/event_tool.c105
-rw-r--r--ctdb/tests/eventd/etc-ctdb/events/data/README1
-rwxr-xr-xctdb/tests/eventd/etc-ctdb/share/events/data/01.dummy.script6
-rwxr-xr-xctdb/tests/eventd/eventd_009.sh38
4 files changed, 140 insertions, 10 deletions
diff --git a/ctdb/event/event_tool.c b/ctdb/event/event_tool.c
index e2e720fd61d..b83288ccc01 100644
--- a/ctdb/event/event_tool.c
+++ b/ctdb/event/event_tool.c
@@ -18,6 +18,7 @@
*/
#include "replace.h"
+#include "system/filesys.h"
#include "system/time.h"
#include <popt.h>
@@ -335,17 +336,67 @@ static int event_command_script_enable(TALLOC_CTX *mem_ctx,
{
struct event_tool_context *ctx = talloc_get_type_abort(
private_data, struct event_tool_context);
+ struct stat statbuf;
+ char *script, *etc_script, *data_script;
+ int ret;
if (argc != 2) {
cmdline_usage(ctx->cmdline, "script enable");
return 1;
}
- return event_command_script(mem_ctx,
- ctx,
- argv[0],
- argv[1],
- CTDB_EVENT_SCRIPT_ENABLE);
+ script = talloc_asprintf(mem_ctx, "events/%s/%s.script", argv[0], argv[1]);
+ if (script == NULL) {
+ return ENOMEM;
+ }
+
+ etc_script = path_etcdir_append(mem_ctx, script);
+ if (etc_script == NULL) {
+ return ENOMEM;
+ }
+
+ data_script = path_datadir_append(mem_ctx, script);
+ if (data_script == NULL) {
+ return ENOMEM;
+ }
+
+ ret = lstat(etc_script, &statbuf);
+ if (ret == 0) {
+ if (S_ISLNK(statbuf.st_mode)) {
+ /* Link already exists */
+ return 0;
+ } else if (S_ISREG(statbuf.st_mode)) {
+ return event_command_script(mem_ctx,
+ ctx,
+ argv[0],
+ argv[1],
+ CTDB_EVENT_SCRIPT_ENABLE);
+ }
+
+ printf("Script %s is not a file or a link\n", etc_script);
+ return EINVAL;
+ } else {
+ if (errno == ENOENT) {
+ ret = stat(data_script, &statbuf);
+ if (ret != 0) {
+ printf("Script %s does not exist in %s\n",
+ argv[1], argv[0]);
+ return ENOENT;
+ }
+
+ ret = symlink(data_script, etc_script);
+ if (ret != 0) {
+ printf("Failed to create symlink %s\n",
+ etc_script);
+ return EIO;
+ }
+
+ return 0;
+ }
+
+ printf("Script %s does not exist\n", etc_script);
+ return EINVAL;
+ }
}
static int event_command_script_disable(TALLOC_CTX *mem_ctx,
@@ -355,17 +406,51 @@ static int event_command_script_disable(TALLOC_CTX *mem_ctx,
{
struct event_tool_context *ctx = talloc_get_type_abort(
private_data, struct event_tool_context);
+ struct stat statbuf;
+ char *script, *etc_script;
+ int ret;
+
if (argc != 2) {
cmdline_usage(ctx->cmdline, "script disable");
return 1;
}
- return event_command_script(mem_ctx,
- ctx,
- argv[0],
- argv[1],
- CTDB_EVENT_SCRIPT_DISABLE);
+ script = talloc_asprintf(mem_ctx, "events/%s/%s.script", argv[0], argv[1]);
+ if (script == NULL) {
+ return ENOMEM;
+ }
+
+ etc_script = path_etcdir_append(mem_ctx, script);
+ if (etc_script == NULL) {
+ return ENOMEM;
+ }
+
+ ret = lstat(etc_script, &statbuf);
+ if (ret == 0) {
+ if (S_ISLNK(statbuf.st_mode)) {
+ /* Link exists */
+ ret = unlink(etc_script);
+ if (ret != 0) {
+ printf("Failed to remove symlink %s\n",
+ etc_script);
+ return EIO;
+ }
+
+ return 0;
+ } else if (S_ISREG(statbuf.st_mode)) {
+ return event_command_script(mem_ctx,
+ ctx,
+ argv[0],
+ argv[1],
+ CTDB_EVENT_SCRIPT_DISABLE);
+ }
+
+ printf("Script %s is not a file or a link\n", etc_script);
+ return EINVAL;
+ }
+
+ return 0;
}
struct cmdline_command event_commands[] = {
diff --git a/ctdb/tests/eventd/etc-ctdb/events/data/README b/ctdb/tests/eventd/etc-ctdb/events/data/README
new file mode 100644
index 00000000000..f38a189ec47
--- /dev/null
+++ b/ctdb/tests/eventd/etc-ctdb/events/data/README
@@ -0,0 +1 @@
+initially empty event scripts directory
diff --git a/ctdb/tests/eventd/etc-ctdb/share/events/data/01.dummy.script b/ctdb/tests/eventd/etc-ctdb/share/events/data/01.dummy.script
new file mode 100755
index 00000000000..9c56f5b968b
--- /dev/null
+++ b/ctdb/tests/eventd/etc-ctdb/share/events/data/01.dummy.script
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+case "$1" in
+"failure") exit 1 ;;
+*) exit 0 ;;
+esac
diff --git a/ctdb/tests/eventd/eventd_009.sh b/ctdb/tests/eventd/eventd_009.sh
new file mode 100755
index 00000000000..cc6c1b5279e
--- /dev/null
+++ b/ctdb/tests/eventd/eventd_009.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "eventscript directory with links"
+
+setup_eventd
+
+ok_null
+simple_test run 10 data failure
+
+ok_null
+simple_test script enable data 01.dummy
+
+required_result 8 <<EOF
+Event failure in data failed
+EOF
+simple_test run 10 data failure
+
+required_result 1 <<EOF
+01.dummy ERROR DURATION DATETIME
+ OUTPUT:
+EOF
+simple_test status data failure
+
+ok_null
+simple_test run 10 data monitor
+
+ok <<EOF
+01.dummy OK DURATION DATETIME
+EOF
+simple_test status data monitor
+
+ok_null
+simple_test script disable data 01.dummy
+
+ok_null
+simple_test run 10 data failure