From 3f578b21496bbf2076c261cd6bf98dede1072c0c Mon Sep 17 00:00:00 2001 From: Alan Moore Date: Mon, 7 Sep 2026 13:57:17 +0100 Subject: [PATCH 1/9] Move the logic of checking existance inside for loop for bash_ensure_there_are_servers_in_ntp_compatible_config_file Signed-off-by: Alan Moore --- shared/macros/10-bash.jinja | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/shared/macros/10-bash.jinja b/shared/macros/10-bash.jinja index 116f5fc24be..b0963d10a0d 100644 --- a/shared/macros/10-bash.jinja +++ b/shared/macros/10-bash.jinja @@ -741,13 +741,12 @@ fi #}} {{%- macro bash_ensure_there_are_servers_in_ntp_compatible_config_file(config_file, servers_list) -%}} -if ! grep -q '#[[:space:]]*server' "{{{ config_file }}}" ; then - for server in $(echo "{{{ servers_list }}}" | tr ',' '\n') ; do - printf '\nserver %s' "$server" >> "{{{ config_file }}}" - done -else - sed -i 's/#[ \t]*server/server/g' "{{{ config_file }}}" -fi +IFS="," read -a SERVERS <<< {{{ servers_list }}} +for server in "${SERVERS[@]}" ; do + if ! grep -qs "^[[:space:]]*server[[:space:]]\+${server}\([[:space:]]\|$\)" "{{{ config_file }}}" ; then + printf '\nserver %s' "$server" >> "{{{ config_file }}}" + fi +done {{{ bash_ensure_nl_at_eof(config_file) }}} {{%- endmacro -%}} From 7ecb211b286e50f84369fd40d396cf1a3567d8e9 Mon Sep 17 00:00:00 2001 From: Alan Moore Date: Mon, 7 Sep 2026 13:59:00 +0100 Subject: [PATCH 2/9] Change remediation to append if not exist Signed-off-by: Alan Moore --- .../ntp/chronyd_specify_remote_server/bash/shared.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/linux_os/guide/services/ntp/chronyd_specify_remote_server/bash/shared.sh b/linux_os/guide/services/ntp/chronyd_specify_remote_server/bash/shared.sh index 5362980d00b..bcf51ee75be 100644 --- a/linux_os/guide/services/ntp/chronyd_specify_remote_server/bash/shared.sh +++ b/linux_os/guide/services/ntp/chronyd_specify_remote_server/bash/shared.sh @@ -4,6 +4,8 @@ config_file="{{{ chrony_conf_path }}}" -if ! grep -q '^[[:space:]]*\(server\|pool\)[[:space:]]\+[[:graph:]]\+' "$config_file" ; then - {{{ bash_ensure_there_are_servers_in_ntp_compatible_config_file("$config_file", "$var_multiple_time_servers") | indent(2) }}} +if [[ ! -f $config_file ]]; then + touch "$config_file" fi + +{{{ bash_ensure_there_are_servers_in_ntp_compatible_config_file("$config_file", "$var_multiple_time_servers") | indent(2) }}} From 10ee941965636c6030ab57c5c03fc835668e8bc4 Mon Sep 17 00:00:00 2001 From: Alan Moore Date: Mon, 7 Sep 2026 14:02:39 +0100 Subject: [PATCH 3/9] Drop grep suppress flag Signed-off-by: Alan Moore --- shared/macros/10-bash.jinja | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/macros/10-bash.jinja b/shared/macros/10-bash.jinja index b0963d10a0d..d8dcfe946c5 100644 --- a/shared/macros/10-bash.jinja +++ b/shared/macros/10-bash.jinja @@ -743,7 +743,7 @@ fi {{%- macro bash_ensure_there_are_servers_in_ntp_compatible_config_file(config_file, servers_list) -%}} IFS="," read -a SERVERS <<< {{{ servers_list }}} for server in "${SERVERS[@]}" ; do - if ! grep -qs "^[[:space:]]*server[[:space:]]\+${server}\([[:space:]]\|$\)" "{{{ config_file }}}" ; then + if ! grep -q "^[[:space:]]*server[[:space:]]\+${server}\([[:space:]]\|$\)" "{{{ config_file }}}" ; then printf '\nserver %s' "$server" >> "{{{ config_file }}}" fi done From c32cd4707da054522e0f3f74d04317a6c2ad5d07 Mon Sep 17 00:00:00 2001 From: Alan Moore Date: Mon, 7 Sep 2026 17:30:52 +0100 Subject: [PATCH 4/9] Skip chronyd conf dir tests on Ubuntu --- .../ntp/chronyd_specify_remote_server/tests/confdir.pass.sh | 2 +- .../tests/multiple_sourcedir.pass.sh | 2 +- .../ntp/chronyd_specify_remote_server/tests/sourcedir.pass.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/confdir.pass.sh b/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/confdir.pass.sh index 0ef2f966246..a5f5b810940 100644 --- a/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/confdir.pass.sh +++ b/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/confdir.pass.sh @@ -1,6 +1,6 @@ #!/bin/bash # packages = chrony -# platform = multi_platform_fedora,multi_platform_ol,multi_platform_rhel,multi_platform_almalinux,multi_platform_ubuntu +# platform = multi_platform_fedora,multi_platform_ol,multi_platform_rhel,multi_platform_almalinux # Test: server directive in confdir .conf file CONF_DIR="/etc/chrony/conf.d" diff --git a/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/multiple_sourcedir.pass.sh b/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/multiple_sourcedir.pass.sh index 615db60eb37..43eef5f0b84 100644 --- a/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/multiple_sourcedir.pass.sh +++ b/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/multiple_sourcedir.pass.sh @@ -1,6 +1,6 @@ #!/bin/bash # packages = chrony -# platform = multi_platform_fedora,multi_platform_ol,multi_platform_rhel,multi_platform_almalinux,multi_platform_ubuntu +# platform = multi_platform_fedora,multi_platform_ol,multi_platform_rhel,multi_platform_almalinux # Test: Multiple sourcedir declarations, server in second directory SOURCES_DIR1="/etc/chrony/sources1.d" diff --git a/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/sourcedir.pass.sh b/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/sourcedir.pass.sh index 9b574782ded..7d32305833f 100644 --- a/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/sourcedir.pass.sh +++ b/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/sourcedir.pass.sh @@ -1,6 +1,6 @@ #!/bin/bash # packages = chrony -# platform = multi_platform_fedora,multi_platform_ol,multi_platform_rhel,multi_platform_almalinux,multi_platform_ubuntu +# platform = multi_platform_fedora,multi_platform_ol,multi_platform_rhel,multi_platform_almalinux # Test: server directive in sourcedir .sources file SOURCES_DIR="/etc/chrony/sources.d" From 51648e875fac3e54c542569efbf4d5ec9815e78c Mon Sep 17 00:00:00 2001 From: Alan Moore Date: Tue, 8 Sep 2026 13:19:35 +0100 Subject: [PATCH 5/9] Remove indent Signed-off-by: Alan Moore --- .../services/ntp/chronyd_specify_remote_server/bash/shared.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux_os/guide/services/ntp/chronyd_specify_remote_server/bash/shared.sh b/linux_os/guide/services/ntp/chronyd_specify_remote_server/bash/shared.sh index bcf51ee75be..41c84439306 100644 --- a/linux_os/guide/services/ntp/chronyd_specify_remote_server/bash/shared.sh +++ b/linux_os/guide/services/ntp/chronyd_specify_remote_server/bash/shared.sh @@ -8,4 +8,4 @@ if [[ ! -f $config_file ]]; then touch "$config_file" fi -{{{ bash_ensure_there_are_servers_in_ntp_compatible_config_file("$config_file", "$var_multiple_time_servers") | indent(2) }}} +{{{ bash_ensure_there_are_servers_in_ntp_compatible_config_file("$config_file", "$var_multiple_time_servers") }}} From b1b679e9237661e24cf34200c4bb7af7422257cf Mon Sep 17 00:00:00 2001 From: Alan Moore Date: Tue, 8 Sep 2026 13:31:08 +0100 Subject: [PATCH 6/9] Dot escaping Signed-off-by: Alan Moore --- shared/macros/10-bash.jinja | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/macros/10-bash.jinja b/shared/macros/10-bash.jinja index d8dcfe946c5..b115127b359 100644 --- a/shared/macros/10-bash.jinja +++ b/shared/macros/10-bash.jinja @@ -743,7 +743,8 @@ fi {{%- macro bash_ensure_there_are_servers_in_ntp_compatible_config_file(config_file, servers_list) -%}} IFS="," read -a SERVERS <<< {{{ servers_list }}} for server in "${SERVERS[@]}" ; do - if ! grep -q "^[[:space:]]*server[[:space:]]\+${server}\([[:space:]]\|$\)" "{{{ config_file }}}" ; then + escaped_server="${server//./\\.}" + if ! grep -q "^[[:space:]]*server[[:space:]]\+${escaped_server}\([[:space:]]\|$\)" "{{{ config_file }}}" ; then printf '\nserver %s' "$server" >> "{{{ config_file }}}" fi done From e21e7fda16cf0ae2c08558a38488cfc8f5c4f7fb Mon Sep 17 00:00:00 2001 From: Alan Moore Date: Tue, 8 Sep 2026 13:31:41 +0100 Subject: [PATCH 7/9] Wrapped {{{ servers_list }}} in double quotes and prevent read from interpreting backslashes Signed-off-by: Alan Moore --- shared/macros/10-bash.jinja | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/macros/10-bash.jinja b/shared/macros/10-bash.jinja index b115127b359..595d45628c6 100644 --- a/shared/macros/10-bash.jinja +++ b/shared/macros/10-bash.jinja @@ -741,7 +741,7 @@ fi #}} {{%- macro bash_ensure_there_are_servers_in_ntp_compatible_config_file(config_file, servers_list) -%}} -IFS="," read -a SERVERS <<< {{{ servers_list }}} +IFS="," read -r -a SERVERS <<< "{{{ servers_list }}}" for server in "${SERVERS[@]}" ; do escaped_server="${server//./\\.}" if ! grep -q "^[[:space:]]*server[[:space:]]\+${escaped_server}\([[:space:]]\|$\)" "{{{ config_file }}}" ; then From acc6073428ec5a6dbab2a05460d0f3d587e3862c Mon Sep 17 00:00:00 2001 From: Alan Moore Date: Tue, 8 Sep 2026 14:57:20 +0100 Subject: [PATCH 8/9] Add escape test case Signed-off-by: Alan Moore --- .../tests/escape_dot.fail.sh | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/escape_dot.fail.sh diff --git a/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/escape_dot.fail.sh b/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/escape_dot.fail.sh new file mode 100644 index 00000000000..f00658d870f --- /dev/null +++ b/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/escape_dot.fail.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# packages = chrony +# platform = multi_platform_fedora,multi_platform_ol,multi_platform_rhel,multi_platform_almalinux,multi_platform_ubuntu +# variables = var_multiple_time_servers=0.pool.ntp.org,1.pool.ntp.org + +rm -rf /etc/chrony/conf.d +rm -rf /etc/chrony/sources.d + +echo "server 0xpool-ntp-org" > {{{ chrony_conf_path }}} From f6dea80845d823edfffef38927a92255a49cbacc Mon Sep 17 00:00:00 2001 From: Alan Moore Date: Tue, 8 Sep 2026 15:14:07 +0100 Subject: [PATCH 9/9] Comment out invalid server lines Signed-off-by: Alan Moore --- shared/macros/10-bash.jinja | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/shared/macros/10-bash.jinja b/shared/macros/10-bash.jinja index 595d45628c6..8c115025bc2 100644 --- a/shared/macros/10-bash.jinja +++ b/shared/macros/10-bash.jinja @@ -742,6 +742,21 @@ fi #}} {{%- macro bash_ensure_there_are_servers_in_ntp_compatible_config_file(config_file, servers_list) -%}} IFS="," read -r -a SERVERS <<< "{{{ servers_list }}}" + +valid_pattern="" +for server in "${SERVERS[@]}"; do + escaped_server="${server//./\\.}" + if [ -z "$valid_pattern" ]; then + valid_pattern="${escaped_server}" + else + valid_pattern="${valid_pattern}|${escaped_server}" + fi +done + +if [ -n "$valid_pattern" ]; then + sed -i -E "/^[[:space:]]*server[[:space:]]/ { /^[[:space:]]*server[[:space:]]+(${valid_pattern})([[:space:]]|$)/! s/^[[:space:]]*server/# server/ }" "{{{ config_file }}}" +fi + for server in "${SERVERS[@]}" ; do escaped_server="${server//./\\.}" if ! grep -q "^[[:space:]]*server[[:space:]]\+${escaped_server}\([[:space:]]\|$\)" "{{{ config_file }}}" ; then