From cb8335c9b17d222071f59b2b1e5aa2dcbb9804d4 Mon Sep 17 00:00:00 2001 From: Kambiz Aghaiepour Date: Thu, 23 Mar 2017 11:34:15 -0400 Subject: [PATCH] 51-hosts fails if given lots of changes The issue is how awk is used to update hosts files. When os-apply-config produces sufficiently large amounts of lines to be added (or ensure in) hosts files, awk will error out. To work around it, instead use sed, and reconstruct the host file(s) to ensure the entries between the comment delimeters of "# HEAT_HOSTS_START" and "# HEAT_HOSTS_END" are swapped with the new entries. Also get rid of blank lines produced by os-apply-config Partial-Bug: #1674732 Change-Id: Ibe0a9f6ec10d55750e3b0e16301236141f988d69 (cherry picked from commit a1da5fbe3095e055af1a0a520a91938a328a92f1) --- .../os-refresh-config/configure.d/51-hosts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/elements/hosts/os-refresh-config/configure.d/51-hosts b/elements/hosts/os-refresh-config/configure.d/51-hosts index 9e6b72544..ea3112abf 100755 --- a/elements/hosts/os-refresh-config/configure.d/51-hosts +++ b/elements/hosts/os-refresh-config/configure.d/51-hosts @@ -14,14 +14,16 @@ write_entries() { if grep -q "^# HEAT_HOSTS_START" "$file"; then temp=$(mktemp) - awk -v v="$entries" '/^# HEAT_HOSTS_START/ { - print $0 - print v - f=1 - }f &&!/^# HEAT_HOSTS_END$/{next}/^# HEAT_HOSTS_END$/{f=0}!f' "$file" > "$temp" - echo "INFO: Updating hosts file $file, check below for changes" - diff "$file" "$temp" || true - cat "$temp" > "$file" + ( + sed '/^# HEAT_HOSTS_START/,$d' "$file" + echo -ne "\n# HEAT_HOSTS_START - Do not edit manually within this section!\n" + echo "$entries" + echo -ne "# HEAT_HOSTS_END\n\n" + sed '1,/^# HEAT_HOSTS_END/d' "$file" + ) > "$temp" + echo "INFO: Updating hosts file $file, check below for changes" + diff "$file" "$temp" || true + cat "$temp" > "$file" else echo -ne "\n# HEAT_HOSTS_START - Do not edit manually within this section!\n" >> "$file" echo "$entries" >> "$file" @@ -30,7 +32,7 @@ write_entries() { } -ENTRIES=$(os-apply-config --key hosts --type raw --key-default '' | tr '[A-Z]' '[a-z]') +ENTRIES=$(os-apply-config --key hosts --type raw --key-default '' | tr '[A-Z]' '[a-z]' | sed -e 's/\\n/\n/g' -e '/^$/d') if [ ! -z "$ENTRIES" ]; then # cloud-init files are /etc/cloud/templates/hosts.OSNAME.tmpl DIST=$(lsb_release -is | tr -s [A-Z] [a-z])