From a1da5fbe3095e055af1a0a520a91938a328a92f1 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]')