From 7e5e4dc029198d46705c2e8a4f3f3a06899ab450 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 --- .../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 c582a8bd6..32ac86a8c 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]')