From c187cf6c1305d321ad115457abc854d3647ce0b7 Mon Sep 17 00:00:00 2001 From: Anders Ingemann Date: Mon, 1 Jul 2013 23:15:49 +0200 Subject: [PATCH] Implemented ConfigureGrub --- providers/ec2/__init__.py | 4 +- providers/ec2/assets/grub.d/40_custom | 81 +++++++++++++++++++++++++++ providers/ec2/tasks/boot.py | 35 ++++++++++++ 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 providers/ec2/assets/grub.d/40_custom create mode 100644 providers/ec2/tasks/boot.py diff --git a/providers/ec2/__init__.py b/providers/ec2/__init__.py index f182de5..a719590 100644 --- a/providers/ec2/__init__.py +++ b/providers/ec2/__init__.py @@ -8,6 +8,7 @@ from tasks import filesystem from tasks import bootstrap from tasks import locale from tasks import apt +from tasks import boot def initialize(): @@ -39,7 +40,8 @@ def tasks(tasklist, manifest): locale.GenerateLocale(), locale.SetTimezone(), apt.AptSources(), - apt.AptUpgrade()) + apt.AptUpgrade(), + boot.ConfigureGrub()) from common.tasks import TriggerRollback tasklist.add(TriggerRollback()) diff --git a/providers/ec2/assets/grub.d/40_custom b/providers/ec2/assets/grub.d/40_custom new file mode 100644 index 0000000..799e887 --- /dev/null +++ b/providers/ec2/assets/grub.d/40_custom @@ -0,0 +1,81 @@ +#!/bin/sh + +# This file generates the old menu.lst configuration with grub2 +# It was copied from tomheadys github repo: +# https://github.com/tomheady/ec2debian/blob/master/src/root/etc/grub.d/40_custom + +prefix=/usr +exec_prefix=${prefix} +bindir=${exec_prefix}/bin +libdir=${exec_prefix}/lib +. ${libdir}/grub/grub-mkconfig_lib + +export TEXTDOMAIN=grub +export TEXTDOMAINDIR=${prefix}/share/locale + +GRUB_DEVICE=/dev/xvda1 + + +cat << EOF +default ${GRUB_DEFAULT} +timeout ${GRUB_TIMEOUT} +EOF + +if ${GRUB_HIDDEN_TIMEOUT:-false}; then + printf "hiddenmenu\n" +fi + +linux_entry () +{ + os="$1" + version="$2" + args="$4" + + title="$(gettext_quoted "%s, with Linux %s")" + + cat << EOF +title ${version} + root (hd0) + kernel ${rel_dirname}/${basename} root=${GRUB_DEVICE} ro ${args} + initrd ${rel_dirname}/${initrd} +EOF +} + +list=`for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* ; do + if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi + done` +prepare_boot_cache= + +while [ "x$list" != "x" ] ; do + linux=`version_find_latest $list` + basename=`basename $linux` + dirname=`dirname $linux` + rel_dirname=`make_system_path_relative_to_its_root $dirname` + version=`echo $basename | sed -e "s,^[^0-9]*-,,g"` + alt_version=`echo $version | sed -e "s,\.old$,,g"` + linux_root_device_thisversion="${LINUX_ROOT_DEVICE}" + + initrd= + for i in "initrd.img-${version}" "initrd-${version}.img" \ + "initrd-${version}" "initramfs-${version}.img" \ + "initrd.img-${alt_version}" "initrd-${alt_version}.img" \ + "initrd-${alt_version}" "initramfs-${alt_version}.img"; do + if test -e "${dirname}/${i}" ; then + initrd="$i" + break + fi + done + + initramfs= + for i in "config-${version}" "config-${alt_version}"; do + if test -e "${dirname}/${i}" ; then + initramfs=`grep CONFIG_INITRAMFS_SOURCE= "${dirname}/${i}" | cut -f2 -d= | tr -d \"` + break + fi + done + + linux_entry "${OS}" "${version}" \ + "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" + + list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '` +done diff --git a/providers/ec2/tasks/boot.py b/providers/ec2/tasks/boot.py new file mode 100644 index 0000000..9de037f --- /dev/null +++ b/providers/ec2/tasks/boot.py @@ -0,0 +1,35 @@ +from base import Task +from common import phases +import os.path + + +class ConfigureGrub(Task): + description = 'Configuring grub' + phase = phases.system_modification + + def run(self, info): + import stat + rwxr_xr_x = (stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | + stat.S_IRGRP | stat.S_IXGRP | + stat.S_IROTH | stat.S_IXOTH) + x_all = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH + + import os + import glob + grub2_cfgs = glob.glob(os.path.join(info.root, 'etc/grub.d/*')) + for cfg in grub2_cfgs: + os.chmod(cfg, os.stat(cfg).st_mode & ~ x_all) + + from shutil import copy + script_src = os.path.normpath(os.path.join(os.path.dirname(__file__), '../assets/grub.d/40_custom')) + script_dst = os.path.join(info.root, 'etc/grub.d/40_custom') + copy(script_src, script_dst) + os.chmod(script_dst, rwxr_xr_x) + + from common.tools import sed_i + grub_def = os.path.join(info.root, 'etc/default/grub') + sed_i(grub_def, '^GRUB_TIMEOUT=[0-9]+', 'GRUB_TIMEOUT=0\nGRUB_HIDDEN_TIMEOUT=true') + + from common.tools import log_check_call + log_check_call(['chroot', info.root, 'update-grub']) + log_check_call(['chroot', info.root, 'ln', '-s', '/boot/grub/grub.cfg', '/boot/grub/menu.lst'])