diff options
Diffstat (limited to 'cloudinit/distros/debian.py')
| -rw-r--r-- | cloudinit/distros/debian.py | 137 | 
1 files changed, 73 insertions, 64 deletions
diff --git a/cloudinit/distros/debian.py b/cloudinit/distros/debian.py index da8c1a5b..7422f4f0 100644 --- a/cloudinit/distros/debian.py +++ b/cloudinit/distros/debian.py @@ -27,12 +27,20 @@ from cloudinit import helpers  from cloudinit import log as logging  from cloudinit import util +from cloudinit.distros.parsers.hostname import HostnameConf +  from cloudinit.settings import PER_INSTANCE  LOG = logging.getLogger(__name__)  class Distro(distros.Distro): +    hostname_conf_fn = "/etc/hostname" +    locale_conf_fn = "/etc/default/locale" +    network_conf_fn = "/etc/network/interfaces" +    tz_conf_fn = "/etc/timezone" +    tz_local_fn = "/etc/localtime" +    tz_zone_dir = "/usr/share/zoneinfo"      def __init__(self, name, cfg, paths):          distros.Distro.__init__(self, name, cfg, paths) @@ -43,94 +51,95 @@ class Distro(distros.Distro):      def apply_locale(self, locale, out_fn=None):          if not out_fn: -            out_fn = self._paths.join(False, '/etc/default/locale') +            out_fn = self.locale_conf_fn          util.subp(['locale-gen', locale], capture=False)          util.subp(['update-locale', locale], capture=False) -        contents = [ -            "# Created by cloud-init", +        # "" provides trailing newline during join +        lines = [ +            util.make_header(),              'LANG="%s"' % (locale), +            "",          ] -        util.write_file(out_fn, "\n".join(contents)) +        util.write_file(out_fn, "\n".join(lines))      def install_packages(self, pkglist):          self.update_package_sources()          self.package_command('install', pkglist)      def _write_network(self, settings): -        net_fn = self._paths.join(False, "/etc/network/interfaces") -        util.write_file(net_fn, settings) - -    def set_hostname(self, hostname): -        out_fn = self._paths.join(False, "/etc/hostname") -        self._write_hostname(hostname, out_fn) -        if out_fn == '/etc/hostname': -            # Only do this if we are running in non-adjusted root mode -            LOG.debug("Setting hostname to %s", hostname) -            util.subp(['hostname', hostname]) - -    def _write_hostname(self, hostname, out_fn): -        lines = [] -        lines.append("# Created by cloud-init") -        lines.append(str(hostname)) -        contents = "\n".join(lines) -        util.write_file(out_fn, contents, 0644) - -    def update_hostname(self, hostname, prev_fn): -        hostname_prev = self._read_hostname(prev_fn) -        read_fn = self._paths.join(True, "/etc/hostname") -        hostname_in_etc = self._read_hostname(read_fn) -        update_files = [] -        if not hostname_prev or hostname_prev != hostname: -            update_files.append(prev_fn) -        if (not hostname_in_etc or -            (hostname_in_etc == hostname_prev and -             hostname_in_etc != hostname)): -            write_fn = self._paths.join(False, "/etc/hostname") -            update_files.append(write_fn) -        for fn in update_files: -            try: -                self._write_hostname(hostname, fn) -            except: -                util.logexc(LOG, "Failed to write hostname %s to %s", -                            hostname, fn) -        if (hostname_in_etc and hostname_prev and -            hostname_in_etc != hostname_prev): -            LOG.debug(("%s differs from /etc/hostname." -                        " Assuming user maintained hostname."), prev_fn) -        if "/etc/hostname" in update_files: -            # Only do this if we are running in non-adjusted root mode -            LOG.debug("Setting hostname to %s", hostname) -            util.subp(['hostname', hostname]) +        util.write_file(self.network_conf_fn, settings) +        return ['all'] + +    def _bring_up_interfaces(self, device_names): +        use_all = False +        for d in device_names: +            if d == 'all': +                use_all = True +        if use_all: +            return distros.Distro._bring_up_interface(self, '--all') +        else: +            return distros.Distro._bring_up_interfaces(self, device_names) + +    def _select_hostname(self, hostname, fqdn): +        # Prefer the short hostname over the long +        # fully qualified domain name +        if not hostname: +            return fqdn +        return hostname + +    def _write_hostname(self, your_hostname, out_fn): +        conf = None +        try: +            # Try to update the previous one +            # so lets see if we can read it first. +            conf = self._read_hostname_conf(out_fn) +        except IOError: +            pass +        if not conf: +            conf = HostnameConf('') +        conf.set_hostname(your_hostname) +        util.write_file(out_fn, str(conf), 0644) + +    def _read_system_hostname(self): +        sys_hostname = self._read_hostname(self.hostname_conf_fn) +        return (self.hostname_conf_fn, sys_hostname) + +    def _read_hostname_conf(self, filename): +        conf = HostnameConf(util.load_file(filename)) +        conf.parse() +        return conf      def _read_hostname(self, filename, default=None): -        contents = util.load_file(filename, quiet=True) -        for line in contents.splitlines(): -            c_pos = line.find("#") -            # Handle inline comments -            if c_pos != -1: -                line = line[0:c_pos] -            line_c = line.strip() -            if line_c: -                return line_c -        return default +        hostname = None +        try: +            conf = self._read_hostname_conf(filename) +            hostname = conf.hostname +        except IOError: +            pass +        if not hostname: +            return default +        return hostname      def _get_localhost_ip(self):          # Note: http://www.leonardoborda.com/blog/127-0-1-1-ubuntu-debian/          return "127.0.1.1"      def set_timezone(self, tz): -        tz_file = os.path.join("/usr/share/zoneinfo", tz) +        # TODO(harlowja): move this code into +        # the parent distro... +        tz_file = os.path.join(self.tz_zone_dir, str(tz))          if not os.path.isfile(tz_file):              raise RuntimeError(("Invalid timezone %s,"                                  " no file found at %s") % (tz, tz_file)) +        # Note: "" provides trailing newline during join          tz_lines = [ -            "# Created by cloud-init", +            util.make_header(),              str(tz), +            "",          ] -        tz_contents = "\n".join(tz_lines) -        tz_fn = self._paths.join(False, "/etc/timezone") -        util.write_file(tz_fn, tz_contents) -        util.copy(tz_file, self._paths.join(False, "/etc/localtime")) +        util.write_file(self.tz_conf_fn, "\n".join(tz_lines)) +        # This ensures that the correct tz will be used for the system +        util.copy(tz_file, self.tz_local_fn)      def package_command(self, command, args=None):          e = os.environ.copy()  | 
