Steve Langasek has proposed merging ~vorlon/cloud-init:lp.1134036 into cloud-init:master.
Requested reviews: cloud-init commiters (cloud-init-dev) Related bugs: Bug #1134036 in maas (Ubuntu): "Failure when using ssh with a locale that is not configured on the server" https://bugs.launchpad.net/ubuntu/+source/maas/+bug/1134036 For more details, see: https://code.launchpad.net/~vorlon/cloud-init/+git/cloud-init/+merge/348101 -- Your team cloud-init commiters is requested to review the proposed merge of ~vorlon/cloud-init:lp.1134036 into cloud-init:master.
diff --git a/tools/Z99-cloud-locale-test.sh b/tools/Z99-cloud-locale-test.sh index 4978d87..38cfd05 100644 --- a/tools/Z99-cloud-locale-test.sh +++ b/tools/Z99-cloud-locale-test.sh @@ -3,16 +3,19 @@ # # Author: Ben Howard <ben.how...@canonical.com> # Author: Scott Moser <scott.mo...@ubuntu.com> -# (c) 2012, Canonical Group, Ltd. +# Author: Steve Langasek <steve.langa...@ubuntu.com> +# (c) 2012, 2018, Canonical Group, Ltd. # # This file is part of cloud-init. See LICENSE file for license information. -# Purpose: Detect invalid locale settings and inform the user -# of how to fix them. +# Purpose: Ensure the user has a valid locale upon remote login. -locale_warn() { +locale_fixup() { local bad_names="" bad_lcs="" key="" val="" var="" vars="" bad_kv="" local w1 w2 w3 w4 remain + # if we are given an invalid locale, try to set to a + # least-common-denominator UTF-8 locale for maximal compatibility. + local default_locale=C.UTF-8 # if shell is zsh, act like sh only for this function (-L). # The behavior change will not permenently affect user's shell. @@ -22,79 +25,42 @@ locale_warn() { # VARIABLE= # VARIABLE="value" # locale: Cannot set LC_SOMETHING to default locale + # glibc's 'locale' command outputs VARIABLE=foo for variables set in + # the environment, and VARIABLE="foo" for locale settings that are + # derived. Use this to minimize the set of variables we are overriding + # to those that are specifically detected to be broken. 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";; + case $val in + \"*\"|"") + # quoted means inferred; don't override it, + # nor an empty value + ;; + *) + set_vars="$key $set_vars" + ;; + esac esac done for bad in $bad_names; do - for var in ${vars}; do - [ "${bad}" = "${var%=*}" ] || continue - val=${var#*=} - [ "${bad_lcs#* ${val}}" = "${bad_lcs}" ] && - bad_lcs="${bad_lcs} ${val}" - bad_kv="${bad_kv} $bad=$val" - break - done - done - bad_lcs=${bad_lcs# } - bad_kv=${bad_kv# } - [ -n "$bad_lcs" ] || return 0 - - printf "_____________________________________________________________________\n" - printf "WARNING! Your environment specifies an invalid locale.\n" - printf " The unknown environment variables are:\n %s\n" "$bad_kv" - 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" + case $set_vars in + *$bad*) + echo "$bad=$default_locale" + echo export $bad + ;; + *LANG\ *) + echo "LANG=$default_locale" + echo export LANG + ;; + esac 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 +eval $(locale 2>&1 | locale_fixup) -unset locale_warn +unset locale_fixup # vi: ts=4 expandtab
_______________________________________________ Mailing list: https://launchpad.net/~cloud-init-dev Post to : cloud-init-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~cloud-init-dev More help : https://help.launchpad.net/ListHelp