Blame tools/Z99-cloud-locale-test.sh

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