Blame cloudinit/distros/rhel.py

Packit Service a04d08
# Copyright (C) 2012 Canonical Ltd.
Packit Service a04d08
# Copyright (C) 2012, 2013 Hewlett-Packard Development Company, L.P.
Packit Service a04d08
# Copyright (C) 2012 Yahoo! Inc.
Packit Service a04d08
#
Packit Service a04d08
# Author: Scott Moser <scott.moser@canonical.com>
Packit Service a04d08
# Author: Juerg Haefliger <juerg.haefliger@hp.com>
Packit Service a04d08
# Author: Joshua Harlow <harlowja@yahoo-inc.com>
Packit Service a04d08
#
Packit Service a04d08
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service a04d08
Packit Service a04d08
from cloudinit import distros
Packit Service a04d08
from cloudinit import helpers
Packit Service a04d08
from cloudinit import log as logging
Packit Service a04d08
from cloudinit import util
Packit Service a04d08
Packit Service a04d08
from cloudinit.distros import rhel_util
Packit Service a04d08
from cloudinit.settings import PER_INSTANCE
Packit Service a04d08
Packit Service a04d08
LOG = logging.getLogger(__name__)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def _make_sysconfig_bool(val):
Packit Service a04d08
    if val:
Packit Service a04d08
        return 'yes'
Packit Service a04d08
    else:
Packit Service a04d08
        return 'no'
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class Distro(distros.Distro):
Packit Service a04d08
    # See: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/sec-Network_Configuration_Using_sysconfig_Files.html # noqa
Packit Service a04d08
    clock_conf_fn = "/etc/sysconfig/clock"
Packit Service a04d08
    locale_conf_fn = '/etc/sysconfig/i18n'
Packit Service a04d08
    systemd_locale_conf_fn = '/etc/locale.conf'
Packit Service a04d08
    network_conf_fn = "/etc/sysconfig/network"
Packit Service a04d08
    hostname_conf_fn = "/etc/sysconfig/network"
Packit Service a04d08
    systemd_hostname_conf_fn = "/etc/hostname"
Packit Service a04d08
    network_script_tpl = '/etc/sysconfig/network-scripts/ifcfg-%s'
Packit Service a04d08
    resolve_conf_fn = "/etc/resolv.conf"
Packit Service a04d08
    tz_local_fn = "/etc/localtime"
Packit Service a04d08
    usr_lib_exec = "/usr/libexec"
Packit Service a04d08
    renderer_configs = {
Packit Service a04d08
        'sysconfig': {
Packit Service a04d08
            'control': 'etc/sysconfig/network',
Packit Service a04d08
            'iface_templates': '%(base)s/network-scripts/ifcfg-%(name)s',
Packit Service a04d08
            'route_templates': {
Packit Service a04d08
                'ipv4': '%(base)s/network-scripts/route-%(name)s',
Packit Service a04d08
                'ipv6': '%(base)s/network-scripts/route6-%(name)s'
Packit Service a04d08
            }
Packit Service a04d08
        }
Packit Service a04d08
    }
Packit Service a04d08
Packit Service a04d08
    def __init__(self, name, cfg, paths):
Packit Service a04d08
        distros.Distro.__init__(self, name, cfg, paths)
Packit Service a04d08
        # This will be used to restrict certain
Packit Service a04d08
        # calls from repeatly happening (when they
Packit Service a04d08
        # should only happen say once per instance...)
Packit Service a04d08
        self._runner = helpers.Runners(paths)
Packit Service a04d08
        self.osfamily = 'redhat'
Packit Service a04d08
        cfg['ssh_svcname'] = 'sshd'
Packit Service a04d08
Packit Service a04d08
    def install_packages(self, pkglist):
Packit Service a04d08
        self.package_command('install', pkgs=pkglist)
Packit Service a04d08
Packit Service a04d08
    def _write_network_config(self, netconfig):
Packit Service a04d08
        return self._supported_write_network_config(netconfig)
Packit Service a04d08
Packit Service a04d08
    def apply_locale(self, locale, out_fn=None):
Packit Service a04d08
        if self.uses_systemd():
Packit Service a04d08
            if not out_fn:
Packit Service a04d08
                out_fn = self.systemd_locale_conf_fn
Packit Service a04d08
            out_fn = self.systemd_locale_conf_fn
Packit Service a04d08
        else:
Packit Service a04d08
            if not out_fn:
Packit Service a04d08
                out_fn = self.locale_conf_fn
Packit Service a04d08
        locale_cfg = {
Packit Service a04d08
            'LANG': locale,
Packit Service a04d08
        }
Packit Service a04d08
        rhel_util.update_sysconfig_file(out_fn, locale_cfg)
Packit Service a04d08
Packit Service a04d08
    def _write_hostname(self, hostname, out_fn):
Packit Service a04d08
        # systemd will never update previous-hostname for us, so
Packit Service a04d08
        # we need to do it ourselves
Packit Service a04d08
        if self.uses_systemd() and out_fn.endswith('/previous-hostname'):
Packit Service a04d08
            util.write_file(out_fn, hostname)
Packit Service a04d08
        elif self.uses_systemd():
Packit Service 11b429
            util.subp(['hostnamectl', 'set-hostname', str(hostname)])
Packit Service a04d08
        else:
Packit Service a04d08
            host_cfg = {
Packit Service a04d08
                'HOSTNAME': hostname,
Packit Service a04d08
            }
Packit Service a04d08
            rhel_util.update_sysconfig_file(out_fn, host_cfg)
Packit Service a04d08
Packit Service a04d08
    def _select_hostname(self, hostname, fqdn):
Packit Service a04d08
        # Should be fqdn if we can use it
Packit Service a04d08
        # See: https://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-sysconfig.html#s2-sysconfig-network # noqa
Packit Service a04d08
        if fqdn:
Packit Service a04d08
            return fqdn
Packit Service a04d08
        return hostname
Packit Service a04d08
Packit Service a04d08
    def _read_system_hostname(self):
Packit Service a04d08
        if self.uses_systemd():
Packit Service a04d08
            host_fn = self.systemd_hostname_conf_fn
Packit Service a04d08
        else:
Packit Service a04d08
            host_fn = self.hostname_conf_fn
Packit Service a04d08
        return (host_fn, self._read_hostname(host_fn))
Packit Service a04d08
Packit Service a04d08
    def _read_hostname(self, filename, default=None):
Packit Service a04d08
        if self.uses_systemd() and filename.endswith('/previous-hostname'):
Packit Service a04d08
            return util.load_file(filename).strip()
Packit Service a04d08
        elif self.uses_systemd():
Packit Service 11b429
            (out, _err) = util.subp(['hostname'])
Packit Service a04d08
            if len(out):
Packit Service a04d08
                return out
Packit Service a04d08
            else:
Packit Service a04d08
                return default
Packit Service a04d08
        else:
Packit Service a04d08
            (_exists, contents) = rhel_util.read_sysconfig_file(filename)
Packit Service a04d08
            if 'HOSTNAME' in contents:
Packit Service a04d08
                return contents['HOSTNAME']
Packit Service a04d08
            else:
Packit Service a04d08
                return default
Packit Service a04d08
Packit Service a04d08
    def _bring_up_interfaces(self, device_names):
Packit Service a04d08
        if device_names and 'all' in device_names:
Packit Service a04d08
            raise RuntimeError(('Distro %s can not translate '
Packit Service a04d08
                                'the device name "all"') % (self.name))
Packit Service a04d08
        return distros.Distro._bring_up_interfaces(self, device_names)
Packit Service a04d08
Packit Service a04d08
    def set_timezone(self, tz):
Packit Service a04d08
        tz_file = self._find_tz_file(tz)
Packit Service a04d08
        if self.uses_systemd():
Packit Service a04d08
            # Currently, timedatectl complains if invoked during startup
Packit Service a04d08
            # so for compatibility, create the link manually.
Packit Service a04d08
            util.del_file(self.tz_local_fn)
Packit Service a04d08
            util.sym_link(tz_file, self.tz_local_fn)
Packit Service a04d08
        else:
Packit Service a04d08
            # Adjust the sysconfig clock zone setting
Packit Service a04d08
            clock_cfg = {
Packit Service a04d08
                'ZONE': str(tz),
Packit Service a04d08
            }
Packit Service a04d08
            rhel_util.update_sysconfig_file(self.clock_conf_fn, clock_cfg)
Packit Service a04d08
            # This ensures that the correct tz will be used for the system
Packit Service a04d08
            util.copy(tz_file, self.tz_local_fn)
Packit Service a04d08
Packit Service a04d08
    def package_command(self, command, args=None, pkgs=None):
Packit Service a04d08
        if pkgs is None:
Packit Service a04d08
            pkgs = []
Packit Service a04d08
Packit Service 11b429
        if util.which('dnf'):
Packit Service a04d08
            LOG.debug('Using DNF for package management')
Packit Service a04d08
            cmd = ['dnf']
Packit Service a04d08
        else:
Packit Service a04d08
            LOG.debug('Using YUM for package management')
Packit Service a04d08
            # the '-t' argument makes yum tolerant of errors on the command
Packit Service a04d08
            # line with regard to packages.
Packit Service a04d08
            #
Packit Service a04d08
            # For example: if you request to install foo, bar and baz and baz
Packit Service a04d08
            # is installed; yum won't error out complaining that baz is already
Packit Service a04d08
            # installed.
Packit Service a04d08
            cmd = ['yum', '-t']
Packit Service a04d08
        # Determines whether or not yum prompts for confirmation
Packit Service a04d08
        # of critical actions. We don't want to prompt...
Packit Service a04d08
        cmd.append("-y")
Packit Service a04d08
Packit Service a04d08
        if args and isinstance(args, str):
Packit Service a04d08
            cmd.append(args)
Packit Service a04d08
        elif args and isinstance(args, list):
Packit Service a04d08
            cmd.extend(args)
Packit Service a04d08
Packit Service a04d08
        cmd.append(command)
Packit Service a04d08
Packit Service a04d08
        pkglist = util.expand_package_list('%s-%s', pkgs)
Packit Service a04d08
        cmd.extend(pkglist)
Packit Service a04d08
Packit Service a04d08
        # Allow the output of this to flow outwards (ie not be captured)
Packit Service 11b429
        util.subp(cmd, capture=False)
Packit Service a04d08
Packit Service a04d08
    def update_package_sources(self):
Packit Service a04d08
        self._runner.run("update-sources", self.package_command,
Packit Service a04d08
                         ["makecache"], freq=PER_INSTANCE)
Packit Service a04d08
Packit Service a04d08
# vi: ts=4 expandtab