summaryrefslogtreecommitdiff
path: root/cloudinit
diff options
context:
space:
mode:
authorJoshua Harlow <harlowja@yahoo-inc.com>2012-06-15 17:49:28 -0700
committerJoshua Harlow <harlowja@yahoo-inc.com>2012-06-15 17:49:28 -0700
commitdb4614f3ea4eecd8283b75283effd3e369fb0e48 (patch)
treeb35c3a5f88a7141dafb4549dd70e297e5d790848 /cloudinit
parent136f3baf4bebc462a7b5f82ffbdd4b2f713b2709 (diff)
downloadvyos-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)
Diffstat (limited to 'cloudinit')
-rw-r--r--cloudinit/distros/ubuntu.py81
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