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 5362980d00be..41c84439306d 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") }}} 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 0ef2f9662467..a5f5b8109403 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/escape_dot.fail.sh b/linux_os/guide/services/ntp/chronyd_specify_remote_server/tests/escape_dot.fail.sh new file mode 100644 index 000000000000..cc933ecd8fb5 --- /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_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 }}} 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 615db60eb37f..43eef5f0b84d 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 9b574782dedd..7d32305833fb 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" diff --git a/shared/macros/10-bash.jinja b/shared/macros/10-bash.jinja index 116f5fc24bea..8c115025bc24 100644 --- a/shared/macros/10-bash.jinja +++ b/shared/macros/10-bash.jinja @@ -741,13 +741,28 @@ 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 }}}" +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 + printf '\nserver %s' "$server" >> "{{{ config_file }}}" + fi +done {{{ bash_ensure_nl_at_eof(config_file) }}} {{%- endmacro -%}}