ctdb-scripts: Do not de-duplicate the interfaces list
authorMartin Schwenke <mschwenke@ddn.com>
Thu, 18 Apr 2024 04:13:11 +0000 (14:13 +1000)
committerMartin Schwenke <martins@samba.org>
Thu, 18 Apr 2024 09:08:34 +0000 (09:08 +0000)
Using xargs with sort -u to de-duplicate this list was my idea and
causes a couple of things to go wrong.  The use of xargs causes
double-quotes to be lost.  The resulting $public_ifaces value also
contains newlines.  The newlines could be removed with an additional
xargs at the end of the pipeline... but that would add an extra level
of quote stripping.

I have unsuccessfully tried to find an alternative, but still elegant,
command pipeline that de-duplicates the list, while maintaining
quoting.

So, just drop the de-duplication.

This might make interface_ifindex_exists_with_options() slightly less
efficient.  However, that function walks the whole list, only
terminating early when a match is found on both interface and options,
so at least it will be correct.

Include an extra testcase.

Signed-off-by: Martin Schwenke <mschwenke@ddn.com>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Autobuild-User(master): Martin Schwenke <martins@samba.org>
Autobuild-Date(master): Thu Apr 18 09:08:34 UTC 2024 on atb-devel-224

ctdb/config/events/legacy/50.samba.script
ctdb/tests/UNIT/eventscripts/50.samba.startup.012.sh [new file with mode: 0755]

index 90de6a3f31b17850116e85d568ee4c4710fd1b00..c9d34cd2245ed7583e37ccd1c3360c8758227e37 100755 (executable)
@@ -40,7 +40,6 @@ generate_smb_interfaces_config()
        if [ -n "$CTDB_SAMBA_INTERFACES_EXTRA" ]; then
                public_ifaces="$public_ifaces $CTDB_SAMBA_INTERFACES_EXTRA"
        fi
-       public_ifaces=$(echo "$public_ifaces" | xargs -n 1 | sort -u)
 
 cat <<EOT > "$CTDB_SAMBA_INTERFACES_FILE"
     bind interfaces only = yes
diff --git a/ctdb/tests/UNIT/eventscripts/50.samba.startup.012.sh b/ctdb/tests/UNIT/eventscripts/50.samba.startup.012.sh
new file mode 100755 (executable)
index 0000000..fb7627c
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "startup, with interfaces list generation"
+
+setup
+
+interfaces_file="${CTDB_TEST_TMP_DIR}/interfaces.conf"
+
+setup_script_options <<EOF
+CTDB_SAMBA_INTERFACES_FILE=${interfaces_file}
+CTDB_SAMBA_INTERFACES_EXTRA='"devX123;options=nodynamic" "devX456;options=dynamic"'
+EOF
+
+ok <<EOF
+Starting smb: OK
+EOF
+simple_test
+
+ok <<EOF
+    bind interfaces only = yes
+    interfaces = lo  "dev123;options=dynamic" "dev456;options=dynamic" "devX123;options=nodynamic" "devX456;options=dynamic"
+EOF
+simple_test_command cat "$interfaces_file"