#include "replace.h"
#include "system/filesys.h"
#include "system/dir.h"
-#include "system/locale.h"
+#include "system/glob.h"
#include "system/wait.h"
#include <talloc.h>
static int script_filter(const struct dirent *de)
{
- size_t namelen = strlen(de->d_name);
- char *ptr;
-
- /* Ignore . and .. */
- if (namelen < 3) {
- return 0;
- }
-
- /* Skip filenames with ~ */
- ptr = strchr(de->d_name, '~');
- if (ptr != NULL) {
- return 0;
- }
-
- /* Filename should start with [0-9][0-9]. */
- if ((! isdigit(de->d_name[0])) ||
- (! isdigit(de->d_name[1])) ||
- (de->d_name[2] != '.')) {
- return 0;
- }
+ int ret;
- /* Ignore filenames with multiple '.'s */
- ptr = index(&de->d_name[3], '.');
- if (ptr != NULL) {
- return 0;
+ /* Match a script pattern */
+ ret = fnmatch("[0-9][0-9].*.script", de->d_name, 0);
+ if (ret == 0) {
+ return 1;
}
- return 1;
+ return 0;
}
static int get_script_list(TALLOC_CTX *mem_ctx,
{
struct dirent **namelist = NULL;
struct run_event_script_list *script_list;
+ size_t ls;
int count, ret;
int i;
goto done;
}
+ ls = strlen(".script");
for (i=0; i<count; i++) {
struct run_event_script *s = &script_list->script[i];
- s->name = talloc_strdup(script_list, namelist[i]->d_name);
+ 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);
{
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_name) == 0) {
+ if (strcmp(de->d_name, script_file) == 0) {
/* check for valid script names */
ret = script_filter(de);
return ENOENT;
}
- filename = talloc_asprintf(mem_ctx, "%s/%s", script_dir, script_name);
+ filename = talloc_asprintf(mem_ctx, "%s/%s", script_dir, script_file);
if (filename == NULL) {
return ENOMEM;
}
struct stat st;
char *path = NULL;
- path = talloc_asprintf(mem_ctx, "%s/%s",
+ path = talloc_asprintf(mem_ctx, "%s/%s.script",
run_event_script_dir(run_ctx),
script->name);
if (path == NULL) {
script = &state->script_list->script[state->index];
- path = talloc_asprintf(state, "%s/%s",
+ path = talloc_asprintf(state, "%s/%s.script",
run_event_script_dir(state->run_ctx),
script->name);
if (path == NULL) {
===== Start of hung script debug for PID=".*", event="monitor" =====
===== End of hung script debug for PID=".*", event="monitor" =====
pstree -p -a .*:
-99\\.timeout,.* /etc/ctdb/events/legacy/99.timeout monitor
+99\\.timeout\\.scri,.* /etc/ctdb/events/legacy/99\\.timeout\\.script monitor
*\`-sleep,.*
---- Stack trace of interesting process [0-9]*\\[sleep\\] ----
[<[0-9a-f]*>] .*sleep+.*
echo hello
EOF
-# Invalid script
+# Invalid script, doesn't end in ".script"
ok <<EOF
No event scripts found
EOF
unit_test run_event_test "$scriptdir" list
+# Is not found because enabling "prog" actually looks for "prog.script"
ok <<EOF
-Script enable prog completed with result=22
+Script enable prog completed with result=2
EOF
unit_test run_event_test "$scriptdir" enable prog
EOF
unit_test test -x "${scriptdir}/prog"
-cat > "$scriptdir/10.test.rpmnew" <<EOF
-#!/bin/sh
-
-echo hello
-EOF
-chmod +x "$scriptdir/10.test.rpmnew"
-
-# Invalid script with multiple '.'s
-ok <<EOF
-No event scripts found
-EOF
-unit_test run_event_test "$scriptdir" list
-
-ok <<EOF
-Script disable 10.test.rpmnew completed with result=22
-EOF
-unit_test run_event_test "$scriptdir" disable 10.test.rpmnew
-
-ok_null
-unit_test test -x "${scriptdir}/10.test.rpmnew"
-
-cat > "$scriptdir/11.foo" <<EOF
+cat > "$scriptdir/11.foo.script" <<EOF
#!/bin/sh
echo hello
ok <<EOF
EOF
-unit_test test -x "${scriptdir}/11.foo"
+unit_test test -x "${scriptdir}/11.foo.script"
ok <<EOF
11.foo: hello
EOF
unit_test run_event_test "$scriptdir" run 10 monitor
-cat > "$scriptdir/22.bar" <<EOF
+cat > "$scriptdir/22.bar.script" <<EOF
#!/bin/sh
exit 1
required_result 1 <<EOF
EOF
-unit_test test -x "${scriptdir}/22.bar"
+unit_test test -x "${scriptdir}/22.bar.script"
ok <<EOF
11.foo: hello
EOF
unit_test run_event_test "$scriptdir" run 10 monitor
-cat > "$scriptdir/22.bar" <<EOF
+cat > "$scriptdir/22.bar.script" <<EOF
#!/bin/sh
sleep 10
rm -rf "$scriptdir"
exit 0
-
setup_eventd
-touch "$eventd_scriptdir/README"
+touch "$eventd_scriptdir/README.script"
-cat > "$eventd_scriptdir/a.sh" <<EOF
+cat > "$eventd_scriptdir/a.script" <<EOF
#!/bin/sh
exit 1
simple_test script enable README
required_result 22 <<EOF
-Script name a.sh is invalid
+Script name a is invalid
EOF
-simple_test script disable a.sh
+simple_test script disable a
required_result 2 <<EOF
Script 00.test does not exist
setup_eventd
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
exit 0
setup_eventd
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
exit 0
setup_eventd
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
exit 1
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
required_result 1 <<EOF
Failed to run event monitor, result=1
setup_eventd
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
sleep 10
exit 0
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
required_result 62 <<EOF
Event monitor timed out
setup_eventd
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
echo "args: \$*"
exit 1
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
required_result 1 <<EOF
Failed to run event monitor, result=1
setup_eventd
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
echo "args: \$*"
;;
esac
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
required_result 0 <<EOF
EOF
setup_eventd
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
sleep 5
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
required_result 0 <<EOF
EOF
setup_eventd
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
sleep 5
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
required_result 125 <<EOF
Event monitor got cancelled
setup_eventd
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
sleep 5
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
required_result 0 <<EOF
EOF
define_test "debug script"
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
sleep 99
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
cat > "$eventd_scriptdir/debug.sh" <<EOF
#!/bin/sh
define_test "status output in debug script"
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
echo "Sleeping for 99 seconds"
sleep 99
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
cat > "$eventd_scriptdir/debug.sh" <<EOF
#!/bin/sh
sleep 5
required_result 0 <<EOF
-01.test,PID $eventd_scriptdir/01.test monitor
+01.test.script,PID $eventd_scriptdir/01.test.script monitor
\`-sleep,PID 99
01.test TIMEDOUT DATETIME
OUTPUT: Sleeping for 99 seconds
define_test "redirected status output in debug script"
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
echo "Sleeping for 99 seconds"
sleep 99
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
cat > "$eventd_scriptdir/debug.sh" <<EOF
#!/bin/sh
define_test "process terminated after debug"
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
echo "Sleeping for 99 seconds"
sleep 99
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
cat > "$eventd_scriptdir/debug.sh" <<EOF
#!/bin/sh
define_test "multiple scripts"
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
sleep 1
EOF
-cp "$eventd_scriptdir/01.test" "$eventd_scriptdir/02.test"
-cp "$eventd_scriptdir/01.test" "$eventd_scriptdir/03.test"
+cp "$eventd_scriptdir/01.test.script" "$eventd_scriptdir/02.test.script"
+cp "$eventd_scriptdir/01.test.script" "$eventd_scriptdir/03.test.script"
setup_eventd
define_test "failures with multiple scripts"
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
case "\$1" in
esac
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
-cat > "$eventd_scriptdir/02.test" <<EOF
+cat > "$eventd_scriptdir/02.test.script" <<EOF
#!/bin/sh
case "\$1" in
esac
EOF
-chmod +x "$eventd_scriptdir/02.test"
+chmod +x "$eventd_scriptdir/02.test.script"
-cat > "$eventd_scriptdir/03.test" <<EOF
+cat > "$eventd_scriptdir/03.test.script" <<EOF
#!/bin/sh
case "\$1" in
esac
EOF
-chmod +x "$eventd_scriptdir/03.test"
+chmod +x "$eventd_scriptdir/03.test.script"
setup_eventd
define_test "timeouts with multiple scripts"
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
case "\$1" in
esac
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
-cat > "$eventd_scriptdir/02.test" <<EOF
+cat > "$eventd_scriptdir/02.test.script" <<EOF
#!/bin/sh
case "\$1" in
esac
EOF
-chmod +x "$eventd_scriptdir/02.test"
+chmod +x "$eventd_scriptdir/02.test.script"
-cat > "$eventd_scriptdir/03.test" <<EOF
+cat > "$eventd_scriptdir/03.test.script" <<EOF
#!/bin/sh
case "\$1" in
esac
EOF
-chmod +x "$eventd_scriptdir/03.test"
+chmod +x "$eventd_scriptdir/03.test.script"
setup_eventd
define_test "takeip event"
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
echo \$*
fi
exit 0
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
setup_eventd
define_test "releaseip event"
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
echo \$*
fi
exit 0
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
setup_eventd
define_test "updateip event"
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
echo \$*
fi
exit 0
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
setup_eventd
define_test "logging check"
-cat > "$eventd_scriptdir/01.test" <<EOF
+cat > "$eventd_scriptdir/01.test.script" <<EOF
#!/bin/sh
echo "Running event \$1"
EOF
-chmod +x "$eventd_scriptdir/01.test"
+chmod +x "$eventd_scriptdir/01.test.script"
setup_eventd
case "$_f" in
[0-9][0-9].*.*)
- script="${_f%.*}"
+ script="${_f%.*}.script"
event="${_f##*.}"
script_dir="${CTDB_BASE}/events/legacy"
;;
[0-9][0-9].*)
- script="$_f"
+ script="${_f}.script"
unset event
script_dir="${CTDB_BASE}/events/legacy"
;;
[ -r "${script_dir}/${script}" ] || \
die "Internal error - unable to find script \"${script_dir}/${script}\""
- printf "%-17s %-10s %-4s - %s\n\n" "$script" "$event" "$_num" "$desc"
+ script_short="${script%.script}"
+
+ printf "%-17s %-10s %-4s - %s\n\n" "$script_short" "$event" "$_num" "$desc"
- _f="${TEST_SUBDIR}/scripts/${script}.sh"
+ _f="${TEST_SUBDIR}/scripts/${script_short}.sh"
if [ -r "$_f" ] ; then
. "$_f"
fi