diff options
author | Joshua Harlow <harlowja@yahoo-inc.com> | 2012-06-15 17:49:28 -0700 |
---|---|---|
committer | Joshua Harlow <harlowja@yahoo-inc.com> | 2012-06-15 17:49:28 -0700 |
commit | db4614f3ea4eecd8283b75283effd3e369fb0e48 (patch) | |
tree | b35c3a5f88a7141dafb4549dd70e297e5d790848 | |
parent | 136f3baf4bebc462a7b5f82ffbdd4b2f713b2709 (diff) | |
download | vyos-cloud-init-db4614f3ea4eecd8283b75283effd3e369fb0e48.tar.gz vyos-cloud-init-db4614f3ea4eecd8283b75283effd3e369fb0e48.zip |
Moved as many distro specific actions to here as should be needed.
Mainly this is the following:
1. Hostname updating
2. Package command invocation
3. Network settings writings
4. Timezone setting (needs cleanup)
-rw-r--r-- | cloudinit/distros/ubuntu.py | 81 |
1 files changed, 73 insertions, 8 deletions
diff --git a/cloudinit/distros/ubuntu.py b/cloudinit/distros/ubuntu.py index ccf2cec4..b8aff03c 100644 --- a/cloudinit/distros/ubuntu.py +++ b/cloudinit/distros/ubuntu.py @@ -20,36 +20,101 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. +from StringIO import StringIO + import os +import socket from cloudinit import distros from cloudinit import log as logging +from cloudinit import templater from cloudinit import util from cloudinit.settings import (PER_INSTANCE) - LOG = logging.getLogger(__name__) class Distro(distros.Distro): def install_packages(self, pkglist): - self.update_package_sources() - self.apt_get('install', pkglist) + self._update_package_sources() + self._apt_get('install', pkglist) - def apply_network(self, settings): + def _write_network(self, settings): util.write_file("/etc/network/interfaces", settings) + def package_command(self, command, args=None): + self._apt_get(command, args) + + def set_hostname(self, hostname): + util.write_file("/etc/hostname", "%s\n" % hostname, 0644) + LOG.debug("Setting hostname to %s", hostname) + util.subp(['hostname', hostname]) + + def update_hostname(self, hostname, prev_file): + hostname_prev = None + prev_name = self._read_hostname(prev_file) + hostname_in_etc = self._read_hostname("/etc/hostname") + update_files = [] + if not hostname_prev or hostname_prev != hostname: + update_files.append(prev_file) + if (not hostname_in_etc or + (hostname_in_etc == hostname_prev and hostname_in_etc != hostname)): + update_files.append("/etc/hostname") + for fn in update_files: + try: + util.write_file(fn, "%s\n" % hostname, 0644) + 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_file) + if "/etc/hostname" in update_files: + LOG.debug("Setting hostname to %s", hostname) + util.subp(['hostname', hostname]) + + def _read_hostname(filename, default=None): + contents = util.load_file(filename, quiet=True) + for line in contents.splitlines(): + hpos = line.find("#") + if hpos != -1: + line = line[0:hpos] + line = line.rstrip() + if line: + return line + return default + + 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) + if not os.path.isfile(tz_file): + raise Exception("Invalid timezone %s, no file found at %s" % (tz, tz_file)) + tz_contents = "%s\n" % tz + util.write_file("/etc/timezone", tz_contents) + # TODO, this should be in a rhel distro subclass?? + if os.path.exists("/etc/sysconfig/clock"): + tz_contents = '"%s"\n' % tz + util.write_file("/etc/sysconfig/clock", tz_contents) + # This ensures that the correct tz will be used for the system + util.copy(tz_file, "/etc/localtime") + + def name(self): + return "ubuntu" + # apt_get top level command (install, update...), and args to pass it - def apt_get(self, tlc, args=None): + def _apt_get(self, tlc, args=None): e = os.environ.copy() e['DEBIAN_FRONTEND'] = 'noninteractive' cmd = ['apt-get', '--option', 'Dpkg::Options::=--force-confold', '--assume-yes', tlc] if args: cmd.extend(args) - util.subp(cmd, env=e) + # Allow the output of this to flow outwards (ie not be captured) + util.subp(cmd, env=e, capture=False) - def update_package_sources(self): - self.cloud.run("update-sources", self.apt_get, ["update"], freq=PER_INSTANCE)
\ No newline at end of file + def _update_package_sources(self): + self.runner.run("update-sources", self._apt_get, ["update"], freq=PER_INSTANCE)
\ No newline at end of file |