diff options
author | Scott Moser <smoser@ubuntu.com> | 2012-04-04 14:26:29 -0400 |
---|---|---|
committer | Scott Moser <smoser@ubuntu.com> | 2012-04-04 14:26:29 -0400 |
commit | b39abf5bbe51d62d1ef1dd1e813720eafc1ddc85 (patch) | |
tree | ce5ba51738703a6f466b71ae0e61a41120d0a476 | |
parent | d168dc6358369de19c1a47312da29156427570ed (diff) | |
parent | 5a849e4758fb92b66e45b6be80252812a2625b49 (diff) | |
download | vyos-cloud-init-b39abf5bbe51d62d1ef1dd1e813720eafc1ddc85.tar.gz vyos-cloud-init-b39abf5bbe51d62d1ef1dd1e813720eafc1ddc85.zip |
Provide informative message when user logs in with unsupported locale
On the users's first login with a locale that is not supported (where 'locale'
would give errors), inform the user on how they can generate the locales
or install language support packages.
LP: #859814
-rw-r--r-- | ChangeLog | 2 | ||||
-rwxr-xr-x | setup.py | 1 | ||||
-rwxr-xr-x | tools/Z99-cloud-locale-test.sh | 92 |
3 files changed, 95 insertions, 0 deletions
@@ -40,6 +40,8 @@ - run resizefs in the background in order to not block boot (LP: #961226) - Fix bug in Chef support where validation_key was present in config, but 'validation_cert' was not (LP: #960547) + - Provide user friendly message when an invalid locale is set + [Ben Howard] (LP: #859814) 0.6.2: - fix bug where update was not done unless update was explicitly set. @@ -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', ['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..8ad485e8 --- /dev/null +++ b/tools/Z99-cloud-locale-test.sh @@ -0,0 +1,92 @@ +#!/bin/sh +# vi: ts=4 noexpandtab +# +# Author: Ben Howard <ben.howard@canonical.com> +# Author: Scott Moser <scott.moser@ubuntu.com> +# (c) 2012, Canonical Group, Ltd. +# +# Purpose: Detect invalid locale settings and inform the user +# of how to fix them. +# + +locale_warn() { + local cr=" +" + local 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%=*}" ] || continue + value=${var#*=} + [ "${bad_lcs#* ${value}}" = "${bad_lcs}" ] && + bad_lcs="${bad_lcs} ${value}" + break + 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\n" + + local bad invalid="" to_gen="" sfile="/usr/share/i18n/SUPPORTED" + local pkgs="" + 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 + printf " sudo apt-get install locales\n" + to_gen=$bad_lcs + fi + to_gen=${to_gen# } + + local pkgs="" + for bad in ${to_gen}; do + pkgs="${pkgs} language-pack-${bad%%_*}" + done + 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 + + printf "To see all available language packs, run:\n" + printf " apt-cache search \"^language-pack-[a-z][a-z]$\"\n" + printf "To disable this message for all users, run:\n" + printf " sudo touch /var/lib/cloud/instance/locale-check.skip\n" + printf "_____________________________________________________________________\n\n" + + # only show the message once + : > ~/.cloud-locale-test.skip 2>/dev/null || : +} + +[ -f ~/.cloud-locale-test.skip -o -f /var/lib/cloud/instance/locale-check.skip ] || + locale 2>&1 | locale_warn + +unset locale_warn |