From be4d5f0f5293760ce20614ba7da35278ef1932ab Mon Sep 17 00:00:00 2001 From: Ben Howard Date: Fri, 30 Mar 2012 17:22:12 -0600 Subject: Added a profile.d message to inform people about invalid locale setting. --- profile.d/Z99-cloud-locale-test.sh | 84 ++++++++++++++++++++++++++++++++++++++ setup.py | 1 + 2 files changed, 85 insertions(+) create mode 100755 profile.d/Z99-cloud-locale-test.sh diff --git a/profile.d/Z99-cloud-locale-test.sh b/profile.d/Z99-cloud-locale-test.sh new file mode 100755 index 00000000..b4a40a09 --- /dev/null +++ b/profile.d/Z99-cloud-locale-test.sh @@ -0,0 +1,84 @@ +export FOO=bar +#!/bin/sh +# vi: ts=4 noexpandtab +# +# Author: Ben Howard +# Author: Scott Moser +# (c) 2012, Canonical Group, Ltd. +# +# Purpose: Detect invalid locale settings and inform the user +# of how to fix them. +# + +locale_warn() { + local cr=" +" + local line bad_names="" bad_lcs="" key="" value="" var="" + local w1 w2 w3 w4 remain + # locale is expected to output either: + # VARIABLE= + # VARIABLE="value" + # locale: Cannot set LC_SOMETHING to default locale + while read -r w1 w2 w3 w4 remain; do + case "$w1" in + locale:) bad_names="${bad_names} ${w4}";; + *) + key=${w1%%=*} + val=${w1#*=} + val=${val#\"} + val=${val%\"} + vars="${vars} $key=$val";; + esac + done + for bad in $bad_names; do + for var in ${vars}; do + [ "${bad}" = "${var%=*}" ] && + bad_lcs="${bad_lcs} ${var#*=}" && break 2 + done + done + bad_lcs=${bad_lcs# } + [ -n "$bad_lcs" ] || return 0 + + printf "_____________________________________________________________________\n" + printf "WARNING! Your environment specifies an invalid locale.\n" + printf " This can affect your user experience significantly, including the\n" + printf " ability to manage packages. You may install the locales by running\n" + printf " the following command(s):\n\n" + + local bad invalid="" to_gen="" sfile="/usr/share/i18n/SUPPORTED" + if [ ! -e "$sfile" ]; then + printf " sudo apt-get install locales\n" + fi + if [ -e "$sfile" ]; then + for bad in ${bad_lcs}; do + grep -q -i "${bad}" "$sfile" && + to_gen="${to_gen} ${bad}" || + invalid="${invalid} ${bad}" + done + else + to_gen=$bad_lcs + fi + + for bad in ${to_gen}; do + printf " sudo apt-get install language-pack-${bad%%_*}\n" + printf " sudo locale-gen ${bad}\n" + done + printf "\n" + for bad in ${invalid}; do + printf "WARNING: '${bad}' is an invalid locale\n" + done + + printf "To see all available language packs, run:\n" + printf " apt-cache search \"^language-pack-*\"\n" + printf "To see the current locale settings, run 'locale'\n" + printf "This message can be disabled by running:\n" + printf " touch /var/lib/cloud/instance/locale.skip\n" + printf "_____________________________________________________________________\n\n" +} + +[ -f /var/lib/cloud/instance/locale.skip ] && return + +locale_warn <&1) +EOF +unset locale_warn diff --git a/setup.py b/setup.py index a01f2501..53898826 100755 --- a/setup.py +++ b/setup.py @@ -47,5 +47,6 @@ setup(name='cloud-init', ('/usr/share/doc/cloud-init', filter(is_f,glob('doc/*'))), ('/usr/share/doc/cloud-init/examples', filter(is_f,glob('doc/examples/*'))), ('/usr/share/doc/cloud-init/examples/seed', filter(is_f,glob('doc/examples/seed/*'))), + ('/etc/profile.d', filter(is_f,glob('profile.d/*'))) ], ) -- cgit v1.2.3 From b47e48251878e92931d06288c5e964041699f7e0 Mon Sep 17 00:00:00 2001 From: Ben Howard Date: Mon, 2 Apr 2012 17:02:30 -0600 Subject: Fixed deficiency in merge proposal. --- profile.d/Z99-cloud-locale-test.sh | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/profile.d/Z99-cloud-locale-test.sh b/profile.d/Z99-cloud-locale-test.sh index b4a40a09..bbd2ca7a 100755 --- a/profile.d/Z99-cloud-locale-test.sh +++ b/profile.d/Z99-cloud-locale-test.sh @@ -1,4 +1,3 @@ -export FOO=bar #!/bin/sh # vi: ts=4 noexpandtab # @@ -69,16 +68,15 @@ locale_warn() { done printf "To see all available language packs, run:\n" - printf " apt-cache search \"^language-pack-*\"\n" - printf "To see the current locale settings, run 'locale'\n" - printf "This message can be disabled by running:\n" - printf " touch /var/lib/cloud/instance/locale.skip\n" + printf " apt-cache search \"^language-pack-[a-z][a-z]$\"\n" + printf "To disable for all users, run:\n" + printf " sudo touch /var/lib/cloud/instance/locale-check.skip\n" + printf "To disable this check for this user only, run: \n" + printf " touch ~/.locale-test.skip \n" printf "_____________________________________________________________________\n\n" } -[ -f /var/lib/cloud/instance/locale.skip ] && return +[ -f /home/${USER}/.locale-test.skip -o -f /var/lib/cloud/instance/locale-check.skip ] || + locale 2>&1 | locale_warn -locale_warn <&1) -EOF unset locale_warn -- cgit v1.2.3 From 969aac2e95d4cb202450726cf0b7d4b16fba4211 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Wed, 4 Apr 2012 13:22:06 -0400 Subject: move Z99-cloud-locale-test.sh out of profile.d to tools Just to avoid an entry in top level directory, get rid of profile.d there and instead move Z99-cloud-locale-test.sh -> tools/Z99-cloud-locale-test.sh --- profile.d/Z99-cloud-locale-test.sh | 82 -------------------------------------- setup.py | 2 +- tools/Z99-cloud-locale-test.sh | 82 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 83 deletions(-) delete mode 100755 profile.d/Z99-cloud-locale-test.sh create mode 100755 tools/Z99-cloud-locale-test.sh diff --git a/profile.d/Z99-cloud-locale-test.sh b/profile.d/Z99-cloud-locale-test.sh deleted file mode 100755 index bbd2ca7a..00000000 --- a/profile.d/Z99-cloud-locale-test.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/sh -# vi: ts=4 noexpandtab -# -# Author: Ben Howard -# Author: Scott Moser -# (c) 2012, Canonical Group, Ltd. -# -# Purpose: Detect invalid locale settings and inform the user -# of how to fix them. -# - -locale_warn() { - local cr=" -" - local line bad_names="" bad_lcs="" key="" value="" var="" - local w1 w2 w3 w4 remain - # locale is expected to output either: - # VARIABLE= - # VARIABLE="value" - # locale: Cannot set LC_SOMETHING to default locale - while read -r w1 w2 w3 w4 remain; do - case "$w1" in - locale:) bad_names="${bad_names} ${w4}";; - *) - key=${w1%%=*} - val=${w1#*=} - val=${val#\"} - val=${val%\"} - vars="${vars} $key=$val";; - esac - done - for bad in $bad_names; do - for var in ${vars}; do - [ "${bad}" = "${var%=*}" ] && - bad_lcs="${bad_lcs} ${var#*=}" && break 2 - done - done - bad_lcs=${bad_lcs# } - [ -n "$bad_lcs" ] || return 0 - - printf "_____________________________________________________________________\n" - printf "WARNING! Your environment specifies an invalid locale.\n" - printf " This can affect your user experience significantly, including the\n" - printf " ability to manage packages. You may install the locales by running\n" - printf " the following command(s):\n\n" - - local bad invalid="" to_gen="" sfile="/usr/share/i18n/SUPPORTED" - if [ ! -e "$sfile" ]; then - printf " sudo apt-get install locales\n" - fi - if [ -e "$sfile" ]; then - for bad in ${bad_lcs}; do - grep -q -i "${bad}" "$sfile" && - to_gen="${to_gen} ${bad}" || - invalid="${invalid} ${bad}" - done - else - to_gen=$bad_lcs - fi - - for bad in ${to_gen}; do - printf " sudo apt-get install language-pack-${bad%%_*}\n" - printf " sudo locale-gen ${bad}\n" - done - printf "\n" - for bad in ${invalid}; do - printf "WARNING: '${bad}' is an invalid locale\n" - done - - printf "To see all available language packs, run:\n" - printf " apt-cache search \"^language-pack-[a-z][a-z]$\"\n" - printf "To disable for all users, run:\n" - printf " sudo touch /var/lib/cloud/instance/locale-check.skip\n" - printf "To disable this check for this user only, run: \n" - printf " touch ~/.locale-test.skip \n" - printf "_____________________________________________________________________\n\n" -} - -[ -f /home/${USER}/.locale-test.skip -o -f /var/lib/cloud/instance/locale-check.skip ] || - locale 2>&1 | locale_warn - -unset locale_warn diff --git a/setup.py b/setup.py index 53898826..f32662b8 100755 --- a/setup.py +++ b/setup.py @@ -47,6 +47,6 @@ setup(name='cloud-init', ('/usr/share/doc/cloud-init', filter(is_f,glob('doc/*'))), ('/usr/share/doc/cloud-init/examples', filter(is_f,glob('doc/examples/*'))), ('/usr/share/doc/cloud-init/examples/seed', filter(is_f,glob('doc/examples/seed/*'))), - ('/etc/profile.d', filter(is_f,glob('profile.d/*'))) + ('/etc/profile.d', ['tools/Z99-cloud-locale-test.sh']), ], ) diff --git a/tools/Z99-cloud-locale-test.sh b/tools/Z99-cloud-locale-test.sh new file mode 100755 index 00000000..bbd2ca7a --- /dev/null +++ b/tools/Z99-cloud-locale-test.sh @@ -0,0 +1,82 @@ +#!/bin/sh +# vi: ts=4 noexpandtab +# +# Author: Ben Howard +# Author: Scott Moser +# (c) 2012, Canonical Group, Ltd. +# +# Purpose: Detect invalid locale settings and inform the user +# of how to fix them. +# + +locale_warn() { + local cr=" +" + local line bad_names="" bad_lcs="" key="" value="" var="" + local w1 w2 w3 w4 remain + # locale is expected to output either: + # VARIABLE= + # VARIABLE="value" + # locale: Cannot set LC_SOMETHING to default locale + while read -r w1 w2 w3 w4 remain; do + case "$w1" in + locale:) bad_names="${bad_names} ${w4}";; + *) + key=${w1%%=*} + val=${w1#*=} + val=${val#\"} + val=${val%\"} + vars="${vars} $key=$val";; + esac + done + for bad in $bad_names; do + for var in ${vars}; do + [ "${bad}" = "${var%=*}" ] && + bad_lcs="${bad_lcs} ${var#*=}" && break 2 + done + done + bad_lcs=${bad_lcs# } + [ -n "$bad_lcs" ] || return 0 + + printf "_____________________________________________________________________\n" + printf "WARNING! Your environment specifies an invalid locale.\n" + printf " This can affect your user experience significantly, including the\n" + printf " ability to manage packages. You may install the locales by running\n" + printf " the following command(s):\n\n" + + local bad invalid="" to_gen="" sfile="/usr/share/i18n/SUPPORTED" + if [ ! -e "$sfile" ]; then + printf " sudo apt-get install locales\n" + fi + if [ -e "$sfile" ]; then + for bad in ${bad_lcs}; do + grep -q -i "${bad}" "$sfile" && + to_gen="${to_gen} ${bad}" || + invalid="${invalid} ${bad}" + done + else + to_gen=$bad_lcs + fi + + for bad in ${to_gen}; do + printf " sudo apt-get install language-pack-${bad%%_*}\n" + printf " sudo locale-gen ${bad}\n" + done + printf "\n" + for bad in ${invalid}; do + printf "WARNING: '${bad}' is an invalid locale\n" + done + + printf "To see all available language packs, run:\n" + printf " apt-cache search \"^language-pack-[a-z][a-z]$\"\n" + printf "To disable for all users, run:\n" + printf " sudo touch /var/lib/cloud/instance/locale-check.skip\n" + printf "To disable this check for this user only, run: \n" + printf " touch ~/.locale-test.skip \n" + printf "_____________________________________________________________________\n\n" +} + +[ -f /home/${USER}/.locale-test.skip -o -f /var/lib/cloud/instance/locale-check.skip ] || + locale 2>&1 | locale_warn + +unset locale_warn -- cgit v1.2.3 From aef06a1aa581ae0adbe53ff874916bd830870e0f Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Wed, 4 Apr 2012 13:26:14 -0400 Subject: Only show this message one time. --- tools/Z99-cloud-locale-test.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/Z99-cloud-locale-test.sh b/tools/Z99-cloud-locale-test.sh index bbd2ca7a..ae45c1da 100755 --- a/tools/Z99-cloud-locale-test.sh +++ b/tools/Z99-cloud-locale-test.sh @@ -69,14 +69,15 @@ locale_warn() { printf "To see all available language packs, run:\n" printf " apt-cache search \"^language-pack-[a-z][a-z]$\"\n" - printf "To disable for all users, run:\n" + printf "To disable this message for all users, run:\n" printf " sudo touch /var/lib/cloud/instance/locale-check.skip\n" - printf "To disable this check for this user only, run: \n" - printf " touch ~/.locale-test.skip \n" printf "_____________________________________________________________________\n\n" + + # only show the message once + : > ~/.cloud-locale-test.skip 2>/dev/null || : } -[ -f /home/${USER}/.locale-test.skip -o -f /var/lib/cloud/instance/locale-check.skip ] || +[ -f ~/.cloud-locale-test.skip -o -f /var/lib/cloud/instance/locale-check.skip ] || locale 2>&1 | locale_warn unset locale_warn -- cgit v1.2.3 From 5a849e4758fb92b66e45b6be80252812a2625b49 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Wed, 4 Apr 2012 14:22:29 -0400 Subject: minor cleanup to messages, combine commands to single line * remove unused 'line' variable * fix bug where multiple errant locales were not working correctly * only output each bad locale once in the list * you only need to run the apt-get install of the package *or* localegen --- tools/Z99-cloud-locale-test.sh | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/tools/Z99-cloud-locale-test.sh b/tools/Z99-cloud-locale-test.sh index ae45c1da..8ad485e8 100755 --- a/tools/Z99-cloud-locale-test.sh +++ b/tools/Z99-cloud-locale-test.sh @@ -12,7 +12,7 @@ locale_warn() { local cr=" " - local line bad_names="" bad_lcs="" key="" value="" var="" + local bad_names="" bad_lcs="" key="" value="" var="" local w1 w2 w3 w4 remain # locale is expected to output either: # VARIABLE= @@ -31,8 +31,11 @@ locale_warn() { done for bad in $bad_names; do for var in ${vars}; do - [ "${bad}" = "${var%=*}" ] && - bad_lcs="${bad_lcs} ${var#*=}" && break 2 + [ "${bad}" = "${var%=*}" ] || continue + value=${var#*=} + [ "${bad_lcs#* ${value}}" = "${bad_lcs}" ] && + bad_lcs="${bad_lcs} ${value}" + break done done bad_lcs=${bad_lcs# } @@ -41,13 +44,10 @@ locale_warn() { printf "_____________________________________________________________________\n" printf "WARNING! Your environment specifies an invalid locale.\n" printf " This can affect your user experience significantly, including the\n" - printf " ability to manage packages. You may install the locales by running\n" - printf " the following command(s):\n\n" + printf " ability to manage packages. You may install the locales by running:\n\n" local bad invalid="" to_gen="" sfile="/usr/share/i18n/SUPPORTED" - if [ ! -e "$sfile" ]; then - printf " sudo apt-get install locales\n" - fi + local pkgs="" if [ -e "$sfile" ]; then for bad in ${bad_lcs}; do grep -q -i "${bad}" "$sfile" && @@ -55,14 +55,23 @@ locale_warn() { invalid="${invalid} ${bad}" done else + printf " sudo apt-get install locales\n" to_gen=$bad_lcs fi + to_gen=${to_gen# } + local pkgs="" for bad in ${to_gen}; do - printf " sudo apt-get install language-pack-${bad%%_*}\n" - printf " sudo locale-gen ${bad}\n" + pkgs="${pkgs} language-pack-${bad%%_*}" done - printf "\n" + pkgs=${pkgs# } + + if [ -n "${pkgs}" ]; then + printf " sudo apt-get install ${pkgs# }\n" + printf " or\n" + printf " sudo locale-gen ${to_gen# }\n" + printf "\n" + fi for bad in ${invalid}; do printf "WARNING: '${bad}' is an invalid locale\n" done -- cgit v1.2.3