From d0ec90f4913825e0300c1c2ea0beab8243b55659 Mon Sep 17 00:00:00 2001 From: Anders Ingemann Date: Sun, 15 Dec 2013 17:25:57 +0100 Subject: [PATCH] Support installation of VirtualBox Guest Additions --- manifests/virtualbox.manifest.json | 3 +- providers/virtualbox/__init__.py | 6 ++ providers/virtualbox/manifest-schema.json | 8 +++ providers/virtualbox/tasks/guest_additions.py | 55 +++++++++++++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 providers/virtualbox/tasks/guest_additions.py diff --git a/manifests/virtualbox.manifest.json b/manifests/virtualbox.manifest.json index cbd009b..a795c49 100644 --- a/manifests/virtualbox.manifest.json +++ b/manifests/virtualbox.manifest.json @@ -1,7 +1,8 @@ { "provider": "virtualbox", "bootstrapper": { - "workspace": "/target" + "workspace": "/target" + // "guest_additions": "/root/images/VBoxGuestAdditions.iso" }, "image": { "name": "debian-{release}-{architecture}-{%y}{%m}{%d}", diff --git a/providers/virtualbox/__init__.py b/providers/virtualbox/__init__.py index a358351..6681fcd 100644 --- a/providers/virtualbox/__init__.py +++ b/providers/virtualbox/__init__.py @@ -49,6 +49,12 @@ def resolve_tasks(tasklist, manifest): loopback.MoveImage) + if manifest.bootstrapper.get('guest_additions', False): + from tasks import guest_additions + tasklist.add(guest_additions.CheckGuestAdditionsPath, + guest_additions.AddGuestAdditionsPackages, + guest_additions.InstallGuestAdditions) + if manifest.bootstrapper.get('tarball', False): tasklist.add(bootstrap.MakeTarball) diff --git a/providers/virtualbox/manifest-schema.json b/providers/virtualbox/manifest-schema.json index 5fb8ebc..cf8a584 100644 --- a/providers/virtualbox/manifest-schema.json +++ b/providers/virtualbox/manifest-schema.json @@ -3,6 +3,14 @@ "title": "VirtualBox manifest", "type": "object", "properties": { + "bootstrapper": { + "type": "object", + "properties": { + "guest_additions": { + "type": "string" + } + } + }, "volume": { "type": "object", "properties": { diff --git a/providers/virtualbox/tasks/guest_additions.py b/providers/virtualbox/tasks/guest_additions.py new file mode 100644 index 0000000..3d1707d --- /dev/null +++ b/providers/virtualbox/tasks/guest_additions.py @@ -0,0 +1,55 @@ +from base import Task +from common import phases +from common.tasks.packages import ImagePackages +from common.tasks.host import CheckPackages +from common.tasks.filesystem import FStab +from common.exceptions import TaskError + + +class CheckGuestAdditionsPath(Task): + description = 'Checking whether the VirtualBox Guest Additions image exists' + phase = phases.preparation + + def run(self, info): + import os.path + guest_additions_path = info.manifest.bootstrapper['guest_additions'] + if not os.path.exists(guest_additions_path): + msg = 'The file {file} does not exist.'.format(file=guest_additions_path) + raise TaskError(msg) + + +class AddGuestAdditionsPackages(Task): + description = 'Adding packages to support Guest Additions installation' + phase = phases.preparation + predecessors = [ImagePackages] + successors = [CheckPackages] + + def run(self, info): + info.img_packages[0].update(['bzip2', + 'build-essential', + 'dkms', + ]) + + +class InstallGuestAdditions(Task): + description = 'Installing the VirtualBox Guest Additions' + phase = phases.system_modification + predecessors = [FStab] + + def run(self, info): + import os + from common.tools import log_call + guest_additions_path = info.manifest.bootstrapper['guest_additions'] + mount_dir = 'mnt/guest_additions' + mount_path = os.path.join(info.root, mount_dir) + os.mkdir(mount_path) + root = info.volume.partition_map.root + root.add_mount(guest_additions_path, mount_path, ['-o', 'loop']) + + install_script = os.path.join('/', mount_dir, 'VBoxLinuxAdditions.run') + # Install will exit with $?=1 because X11 isn't installed + log_call(['/usr/sbin/chroot', info.root, + install_script, '--nox11']) + + root.remove_mount(mount_path) + os.rmdir(mount_path)