summaryrefslogtreecommitdiff
path: root/cloudinit/distros
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2017-06-08 15:42:12 -0500
committerScott Moser <smoser@brickies.net>2017-07-25 13:56:10 -0400
commit0ef61b289472665f4e3059a24a8b9b91246f06ee (patch)
tree4ff0d8911a5ce87fbc00d46b8de728fc7774d4e5 /cloudinit/distros
parent85c984c3c74b0a8751698e20915b89756580b09f (diff)
downloadvyos-cloud-init-0ef61b289472665f4e3059a24a8b9b91246f06ee.tar.gz
vyos-cloud-init-0ef61b289472665f4e3059a24a8b9b91246f06ee.zip
locale: Do not re-run locale-gen if provided locale is system default.
If the system configure default in /etc/default/locale is set to the same value that is provided for cloud-init's "locale" setting, then do not re-run locale-gen. This allows images built with a locale already generated to not re-run locale-gen (which can be very heavy). Also here is a fix to invoke update-locale correctly and remove the internal writing of /etc/default/locale. We were calling update-locale <locale> This ends up having no affect. The more correct invocation is: update-locale LANG=<locale> Also added some support here should we ever want to change setting LANG to setting LC_ALL (or any other key). Lastly, a test change to allow us to use assert_not_called from mock. Versions of mock in CentOS 6 do not have assert_not_called.
Diffstat (limited to 'cloudinit/distros')
-rw-r--r--cloudinit/distros/debian.py48
1 files changed, 37 insertions, 11 deletions
diff --git a/cloudinit/distros/debian.py b/cloudinit/distros/debian.py
index d06d46a6..abfb81f4 100644
--- a/cloudinit/distros/debian.py
+++ b/cloudinit/distros/debian.py
@@ -37,11 +37,11 @@ ENI_HEADER = """# This file is generated from information provided by
"""
NETWORK_CONF_FN = "/etc/network/interfaces.d/50-cloud-init.cfg"
+LOCALE_CONF_FN = "/etc/default/locale"
class Distro(distros.Distro):
hostname_conf_fn = "/etc/hostname"
- locale_conf_fn = "/etc/default/locale"
network_conf_fn = {
"eni": "/etc/network/interfaces.d/50-cloud-init.cfg",
"netplan": "/etc/netplan/50-cloud-init.yaml"
@@ -64,16 +64,8 @@ class Distro(distros.Distro):
def apply_locale(self, locale, out_fn=None):
if not out_fn:
- out_fn = self.locale_conf_fn
- util.subp(['locale-gen', locale], capture=False)
- util.subp(['update-locale', locale], capture=False)
- # "" provides trailing newline during join
- lines = [
- util.make_header(),
- 'LANG="%s"' % (locale),
- "",
- ]
- util.write_file(out_fn, "\n".join(lines))
+ out_fn = LOCALE_CONF_FN
+ apply_locale(locale, out_fn)
def install_packages(self, pkglist):
self.update_package_sources()
@@ -225,4 +217,38 @@ def _maybe_remove_legacy_eth0(path="/etc/network/interfaces.d/eth0.cfg"):
LOG.warning(msg)
+
+def apply_locale(locale, sys_path=LOCALE_CONF_FN, keyname='LANG'):
+ """Apply the locale.
+
+ Run locale-gen for the provided locale and set the default
+ system variable `keyname` appropriately in the provided `sys_path`.
+
+ If sys_path indicates that `keyname` is already set to `locale`
+ then no changes will be made and locale-gen not called.
+ This allows images built with a locale already generated to not re-run
+ locale-gen which can be very heavy.
+ """
+ if not locale:
+ raise ValueError('Failed to provide locale value.')
+
+ if not sys_path:
+ raise ValueError('Invalid path: %s' % sys_path)
+
+ if os.path.exists(sys_path):
+ locale_content = util.load_file(sys_path)
+ # if LANG isn't present, regen
+ sys_defaults = util.load_shell_content(locale_content)
+ sys_val = sys_defaults.get(keyname, "")
+ if sys_val.lower() == locale.lower():
+ LOG.debug(
+ "System has '%s=%s' requested '%s', skipping regeneration.",
+ keyname, sys_val, locale)
+ return
+
+ util.subp(['locale-gen', locale], capture=False)
+ util.subp(
+ ['update-locale', '--locale-file=' + sys_path,
+ '%s=%s' % (keyname, locale)], capture=False)
+
# vi: ts=4 expandtab