|
Packit |
bc9a3a |
#!/bin/sh
|
|
Packit |
bc9a3a |
# Copyright (C) 2012, Canonical Group, Ltd.
|
|
Packit |
bc9a3a |
#
|
|
Packit |
bc9a3a |
# Author: Ben Howard <ben.howard@canonical.com>
|
|
Packit |
bc9a3a |
# Author: Scott Moser <scott.moser@ubuntu.com>
|
|
Packit |
bc9a3a |
# (c) 2012, Canonical Group, Ltd.
|
|
Packit |
bc9a3a |
#
|
|
Packit |
bc9a3a |
# This file is part of cloud-init. See LICENSE file for license information.
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
# Purpose: Detect invalid locale settings and inform the user
|
|
Packit |
bc9a3a |
# of how to fix them.
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
locale_warn() {
|
|
Packit |
bc9a3a |
command -v local >/dev/null && local _local="local" ||
|
|
Packit |
bc9a3a |
typeset _local="typeset"
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
$_local bad_names="" bad_lcs="" key="" val="" var="" vars="" bad_kv=""
|
|
Packit |
bc9a3a |
$_local w1 w2 w3 w4 remain
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
# if shell is zsh, act like sh only for this function (-L).
|
|
Packit |
bc9a3a |
# The behavior change will not permenently affect user's shell.
|
|
Packit |
bc9a3a |
[ "${ZSH_NAME+zsh}" = "zsh" ] && emulate -L sh
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
# locale is expected to output either:
|
|
Packit |
bc9a3a |
# VARIABLE=
|
|
Packit |
bc9a3a |
# VARIABLE="value"
|
|
Packit |
bc9a3a |
# locale: Cannot set LC_SOMETHING to default locale
|
|
Packit |
bc9a3a |
while read -r w1 w2 w3 w4 remain; do
|
|
Packit |
bc9a3a |
case "$w1" in
|
|
Packit |
bc9a3a |
locale:) bad_names="${bad_names} ${w4}";;
|
|
Packit |
bc9a3a |
*)
|
|
Packit |
bc9a3a |
key=${w1%%=*}
|
|
Packit |
bc9a3a |
val=${w1#*=}
|
|
Packit |
bc9a3a |
val=${val#\"}
|
|
Packit |
bc9a3a |
val=${val%\"}
|
|
Packit |
bc9a3a |
vars="${vars} $key=$val";;
|
|
Packit |
bc9a3a |
esac
|
|
Packit |
bc9a3a |
done
|
|
Packit |
bc9a3a |
for bad in $bad_names; do
|
|
Packit |
bc9a3a |
for var in ${vars}; do
|
|
Packit |
bc9a3a |
[ "${bad}" = "${var%=*}" ] || continue
|
|
Packit |
bc9a3a |
val=${var#*=}
|
|
Packit |
bc9a3a |
[ "${bad_lcs#* ${val}}" = "${bad_lcs}" ] &&
|
|
Packit |
bc9a3a |
bad_lcs="${bad_lcs} ${val}"
|
|
Packit |
bc9a3a |
bad_kv="${bad_kv} $bad=$val"
|
|
Packit |
bc9a3a |
break
|
|
Packit |
bc9a3a |
done
|
|
Packit |
bc9a3a |
done
|
|
Packit |
bc9a3a |
bad_lcs=${bad_lcs# }
|
|
Packit |
bc9a3a |
bad_kv=${bad_kv# }
|
|
Packit |
bc9a3a |
[ -n "$bad_lcs" ] || return 0
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
printf "_____________________________________________________________________\n"
|
|
Packit |
bc9a3a |
printf "WARNING! Your environment specifies an invalid locale.\n"
|
|
Packit |
bc9a3a |
printf " The unknown environment variables are:\n %s\n" "$bad_kv"
|
|
Packit |
bc9a3a |
printf " This can affect your user experience significantly, including the\n"
|
|
Packit |
bc9a3a |
printf " ability to manage packages. You may install the locales by running:\n\n"
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
$_local bad invalid="" to_gen="" sfile="/usr/share/i18n/SUPPORTED"
|
|
Packit |
bc9a3a |
$_local local pkgs=""
|
|
Packit |
bc9a3a |
if [ -e "$sfile" ]; then
|
|
Packit |
bc9a3a |
for bad in ${bad_lcs}; do
|
|
Packit |
bc9a3a |
grep -q -i "${bad}" "$sfile" &&
|
|
Packit |
bc9a3a |
to_gen="${to_gen} ${bad}" ||
|
|
Packit |
bc9a3a |
invalid="${invalid} ${bad}"
|
|
Packit |
bc9a3a |
done
|
|
Packit |
bc9a3a |
else
|
|
Packit |
bc9a3a |
printf " sudo apt-get install locales\n"
|
|
Packit |
bc9a3a |
to_gen=$bad_lcs
|
|
Packit |
bc9a3a |
fi
|
|
Packit |
bc9a3a |
to_gen=${to_gen# }
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
$_local pkgs=""
|
|
Packit |
bc9a3a |
for bad in ${to_gen}; do
|
|
Packit |
bc9a3a |
pkgs="${pkgs} language-pack-${bad%%_*}"
|
|
Packit |
bc9a3a |
done
|
|
Packit |
bc9a3a |
pkgs=${pkgs# }
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
if [ -n "${pkgs}" ]; then
|
|
Packit |
bc9a3a |
printf " sudo apt-get install ${pkgs# }\n"
|
|
Packit |
bc9a3a |
printf " or\n"
|
|
Packit |
bc9a3a |
printf " sudo locale-gen ${to_gen# }\n"
|
|
Packit |
bc9a3a |
printf "\n"
|
|
Packit |
bc9a3a |
fi
|
|
Packit |
bc9a3a |
for bad in ${invalid}; do
|
|
Packit |
bc9a3a |
printf "WARNING: '${bad}' is an invalid locale\n"
|
|
Packit |
bc9a3a |
done
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
printf "To see all available language packs, run:\n"
|
|
Packit |
bc9a3a |
printf " apt-cache search \"^language-pack-[a-z][a-z]$\"\n"
|
|
Packit |
bc9a3a |
printf "To disable this message for all users, run:\n"
|
|
Packit |
bc9a3a |
printf " sudo touch /var/lib/cloud/instance/locale-check.skip\n"
|
|
Packit |
bc9a3a |
printf "_____________________________________________________________________\n\n"
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
# only show the message once
|
|
Packit |
bc9a3a |
: > ~/.cloud-locale-test.skip 2>/dev/null || :
|
|
Packit |
bc9a3a |
}
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
[ -f ~/.cloud-locale-test.skip -o -f /var/lib/cloud/instance/locale-check.skip ] ||
|
|
Packit |
bc9a3a |
locale 2>&1 | locale_warn
|
|
Packit |
bc9a3a |
|
|
Packit |
bc9a3a |
unset locale_warn
|
|
Packit |
bc9a3a |
# vi: ts=4 expandtab
|