diff --git a/.gitignore b/.gitignore index 5148984..0449688 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ -grubby-*.tar.bz2 +*.tar.bz2 +*.tar.gz clog *.rpm -/8.40-1.tar.gz -grubby-*/ -.build*.log -.*sw? +.build*log +*/ diff --git a/0001-Change-return-type-in-getRootSpecifier.patch b/0001-Change-return-type-in-getRootSpecifier.patch deleted file mode 100644 index 0a6808b..0000000 --- a/0001-Change-return-type-in-getRootSpecifier.patch +++ /dev/null @@ -1,143 +0,0 @@ -From c1c46d21182974181f5b4c2ed0a02288b4bfd880 Mon Sep 17 00:00:00 2001 -From: Nathaniel McCallum -Date: Fri, 2 Mar 2018 14:59:32 -0500 -Subject: [PATCH 1/3] Change return type in getRootSpecifier() - -Rather than returning a new allocation of the prefix, just return the -length of the prefix. This change accomplishes a couple things. First, -it reduces some memory leaks since the return value was often never -freed. Second, it simplifies the caller who is usually only interested -in the length of the prefix. ---- - grubby.c | 54 +++++++++++++++++++++++++++--------------------------- - 1 file changed, 27 insertions(+), 27 deletions(-) - -diff --git a/grubby.c b/grubby.c -index d4ebb86..a062ef8 100644 ---- a/grubby.c -+++ b/grubby.c -@@ -675,7 +675,7 @@ static int lineWrite(FILE * out, struct singleLine * line, - struct configFileInfo * cfi); - static int getNextLine(char ** bufPtr, struct singleLine * line, - struct configFileInfo * cfi); --static char * getRootSpecifier(char * str); -+static size_t getRootSpecifier(const char *str); - static void requote(struct singleLine *line, struct configFileInfo * cfi); - static void insertElement(struct singleLine * line, - const char * item, int insertHere, -@@ -1840,7 +1840,7 @@ int suitableImage(struct singleEntry * entry, const char * bootPrefix, - char * fullName; - int i; - char * dev; -- char * rootspec; -+ size_t rs; - char * rootdev; - - if (skipRemoved && entry->skip) { -@@ -1866,12 +1866,11 @@ int suitableImage(struct singleEntry * entry, const char * bootPrefix, - - fullName = alloca(strlen(bootPrefix) + - strlen(line->elements[1].item) + 1); -- rootspec = getRootSpecifier(line->elements[1].item); -- int rootspec_offset = rootspec ? strlen(rootspec) : 0; -+ rs = getRootSpecifier(line->elements[1].item); - int hasslash = endswith(bootPrefix, '/') || -- beginswith(line->elements[1].item + rootspec_offset, '/'); -+ beginswith(line->elements[1].item + rs, '/'); - sprintf(fullName, "%s%s%s", bootPrefix, hasslash ? "" : "/", -- line->elements[1].item + rootspec_offset); -+ line->elements[1].item + rs); - if (access(fullName, R_OK)) { - notSuitablePrintf(entry, 0, "access to %s failed\n", fullName); - return 0; -@@ -1952,7 +1951,6 @@ struct singleEntry * findEntryByPath(struct grubConfig * config, - struct singleLine * line; - int i; - char * chptr; -- char * rootspec = NULL; - enum lineType_e checkType = LT_KERNEL; - - if (isdigit(*kernel)) { -@@ -2044,11 +2042,10 @@ struct singleEntry * findEntryByPath(struct grubConfig * config, - - if (line && line->type != LT_MENUENTRY && - line->numElements >= 2) { -- rootspec = getRootSpecifier(line->elements[1].item); -- if (!strcmp(line->elements[1].item + -- ((rootspec != NULL) ? strlen(rootspec) : 0), -- kernel + strlen(prefix))) -- break; -+ if (!strcmp(line->elements[1].item + -+ getRootSpecifier(line->elements[1].item), -+ kernel + strlen(prefix))) -+ break; - } - if(line->type == LT_MENUENTRY && - !strcmp(line->elements[1].item, kernel)) -@@ -2797,11 +2794,11 @@ struct singleLine * addLineTmpl(struct singleEntry * entry, - - /* but try to keep the rootspec from the template... sigh */ - if (tmplLine->type & (LT_HYPER|LT_KERNEL|LT_MBMODULE|LT_INITRD|LT_KERNEL_EFI|LT_INITRD_EFI|LT_KERNEL_16|LT_INITRD_16)) { -- char * rootspec = getRootSpecifier(tmplLine->elements[1].item); -- if (rootspec != NULL) { -- free(newLine->elements[1].item); -- newLine->elements[1].item = -- sdupprintf("%s%s", rootspec, val); -+ size_t rs = getRootSpecifier(tmplLine->elements[1].item); -+ if (rs > 0) { -+ free(newLine->elements[1].item); -+ newLine->elements[1].item = sdupprintf("%.*s%s", (int) rs, -+ tmplLine->elements[1].item, val); - } - } - } -@@ -3729,15 +3726,19 @@ int checkForElilo(struct grubConfig * config) { - return 1; - } - --static char * getRootSpecifier(char * str) { -- char * idx, * rootspec = NULL; -+static size_t getRootSpecifier(const char *str) -+{ -+ size_t rs = 0; - - if (*str == '(') { -- idx = rootspec = strdup(str); -- while(*idx && (*idx != ')') && (!isspace(*idx))) idx++; -- *(++idx) = '\0'; -+ for (; str[rs] != ')' && !isspace(str[rs]); rs++) { -+ if (!str[rs]) -+ return rs; -+ } -+ rs++; - } -- return rootspec; -+ -+ return rs; - } - - static char * getInitrdVal(struct grubConfig * config, -@@ -4616,7 +4617,7 @@ int main(int argc, const char ** argv) { - if (displayDefault) { - struct singleLine * line; - struct singleEntry * entry; -- char * rootspec; -+ size_t rs; - - if (config->defaultImage == -1) return 0; - if (config->defaultImage == DEFAULT_SAVED_GRUB2 && -@@ -4629,9 +4630,8 @@ int main(int argc, const char ** argv) { - line = getLineByType(LT_KERNEL|LT_HYPER|LT_KERNEL_EFI|LT_KERNEL_16, entry->lines); - if (!line) return 0; - -- rootspec = getRootSpecifier(line->elements[1].item); -- printf("%s%s\n", bootPrefix, line->elements[1].item + -- ((rootspec != NULL) ? strlen(rootspec) : 0)); -+ rs = getRootSpecifier(line->elements[1].item); -+ printf("%s%s\n", bootPrefix, line->elements[1].item + rs); - - return 0; - --- -2.14.3 - diff --git a/0002-Add-btrfs-subvolume-support-for-grub2.patch b/0002-Add-btrfs-subvolume-support-for-grub2.patch deleted file mode 100644 index d460c5d..0000000 --- a/0002-Add-btrfs-subvolume-support-for-grub2.patch +++ /dev/null @@ -1,209 +0,0 @@ -From 5dec033b19bb5b07a0a136a7357e16c8ca9f5dd6 Mon Sep 17 00:00:00 2001 -From: Nathaniel McCallum -Date: Fri, 2 Mar 2018 08:40:18 -0500 -Subject: [PATCH 2/3] Add btrfs subvolume support for grub2 - -In order to find the subvolume prefix from a given path, we parse -/proc/mounts. In cases where /proc/mounts doesn't contain the -filesystem, the caller can use the --mounts option to specify his own -mounts file. - -Btrfs subvolumes are already supported by grub2 and by grub2-mkconfig. - -Fixes #22 ---- - grubby.c | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 143 insertions(+), 5 deletions(-) - -diff --git a/grubby.c b/grubby.c -index a062ef8..96d252a 100644 ---- a/grubby.c -+++ b/grubby.c -@@ -68,6 +68,8 @@ int isEfi = 0; - - char *saved_command_line = NULL; - -+const char *mounts = "/proc/mounts"; -+ - /* comments get lumped in with indention */ - struct lineElement { - char * item; -@@ -1834,6 +1836,129 @@ static int endswith(const char *s, char c) - return s[slen] == c; - } - -+typedef struct { -+ const char *start; -+ size_t chars; -+} field; -+ -+static int iscomma(int c) -+{ -+ return c == ','; -+} -+ -+static int isequal(int c) -+{ -+ return c == '='; -+} -+ -+static field findField(const field *in, typeof(isspace) *isdelim, field *out) -+{ -+ field nxt = {}; -+ size_t off = 0; -+ -+ while (off < in->chars && isdelim(in->start[off])) -+ off++; -+ -+ if (off == in->chars) -+ return nxt; -+ -+ out->start = &in->start[off]; -+ out->chars = 0; -+ -+ while (off + out->chars < in->chars && !isdelim(out->start[out->chars])) -+ out->chars++; -+ -+ nxt.start = out->start + out->chars; -+ nxt.chars = in->chars - off - out->chars; -+ return nxt; -+} -+ -+static int fieldEquals(const field *in, const char *str) -+{ -+ return in->chars == strlen(str) && -+ strncmp(in->start, str, in->chars) == 0; -+} -+ -+/* Parse /proc/mounts to determine the subvolume prefix. */ -+static size_t subvolPrefix(const char *str) -+{ -+ FILE *file = NULL; -+ char *line = NULL; -+ size_t prfx = 0; -+ size_t size = 0; -+ -+ file = fopen(mounts, "r"); -+ if (!file) -+ return 0; -+ -+ for (ssize_t s; (s = getline(&line, &size, file)) >= 0; ) { -+ field nxt = { line, s }; -+ field dev = {}; -+ field path = {}; -+ field type = {}; -+ field opts = {}; -+ field opt = {}; -+ -+ nxt = findField(&nxt, isspace, &dev); -+ if (!nxt.start) -+ continue; -+ -+ nxt = findField(&nxt, isspace, &path); -+ if (!nxt.start) -+ continue; -+ -+ nxt = findField(&nxt, isspace, &type); -+ if (!nxt.start) -+ continue; -+ -+ nxt = findField(&nxt, isspace, &opts); -+ if (!nxt.start) -+ continue; -+ -+ if (!fieldEquals(&type, "btrfs")) -+ continue; -+ -+ /* We have found a btrfs mount point. */ -+ -+ nxt = opts; -+ while ((nxt = findField(&nxt, iscomma, &opt)).start) { -+ field key = {}; -+ field val = {}; -+ -+ opt = findField(&opt, isequal, &key); -+ if (!opt.start) -+ continue; -+ -+ opt = findField(&opt, isequal, &val); -+ if (!opt.start) -+ continue; -+ -+ if (!fieldEquals(&key, "subvol")) -+ continue; -+ -+ /* We have found a btrfs subvolume mount point. */ -+ -+ if (strncmp(val.start, str, val.chars)) -+ continue; -+ -+ if (val.start[val.chars - 1] != '/' && -+ str[val.chars] != '/') -+ continue; -+ -+ /* The subvolume mount point matches our input. */ -+ -+ if (prfx < val.chars) -+ prfx = val.chars; -+ } -+ } -+ -+ dbgPrintf("%s(): str: '%s', prfx: '%s'\n", __FUNCTION__, str, prfx); -+ -+ fclose(file); -+ free(line); -+ return prfx; -+} -+ - int suitableImage(struct singleEntry * entry, const char * bootPrefix, - int skipRemoved, int flags) { - struct singleLine * line; -@@ -2794,12 +2919,22 @@ struct singleLine * addLineTmpl(struct singleEntry * entry, - - /* but try to keep the rootspec from the template... sigh */ - if (tmplLine->type & (LT_HYPER|LT_KERNEL|LT_MBMODULE|LT_INITRD|LT_KERNEL_EFI|LT_INITRD_EFI|LT_KERNEL_16|LT_INITRD_16)) { -- size_t rs = getRootSpecifier(tmplLine->elements[1].item); -+ const char *prfx = tmplLine->elements[1].item; -+ size_t rs = getRootSpecifier(prfx); -+ if (isinitrd(tmplLine->type)) { -+ for (struct singleLine *l = entry->lines; -+ rs == 0 && l; l = l->next) { -+ if (iskernel(l->type)) { -+ prfx = l->elements[1].item; -+ rs = getRootSpecifier(prfx); -+ } -+ } -+ } - if (rs > 0) { - free(newLine->elements[1].item); -- newLine->elements[1].item = sdupprintf("%.*s%s", (int) rs, -- tmplLine->elements[1].item, val); -- } -+ newLine->elements[1].item = sdupprintf("%.*s%s", -+ (int) rs, prfx, val); -+ } - } - } - -@@ -3738,7 +3873,7 @@ static size_t getRootSpecifier(const char *str) - rs++; - } - -- return rs; -+ return rs + subvolPrefix(str + rs); - } - - static char * getInitrdVal(struct grubConfig * config, -@@ -4253,6 +4388,9 @@ int main(int argc, const char ** argv) { - { "mbargs", 0, POPT_ARG_STRING, &newMBKernelArgs, 0, - _("default arguments for the new multiboot kernel or " - "new arguments for multiboot kernel being updated"), NULL }, -+ { "mounts", 0, POPT_ARG_STRING, &mounts, 0, -+ _("path to fake /proc/mounts file (for testing only)"), -+ _("mounts") }, - { "bad-image-okay", 0, 0, &badImageOkay, 0, - _("don't sanity check images in boot entries (for testing only)"), - NULL }, --- -2.14.3 - diff --git a/0003-Add-tests-for-btrfs-support.patch b/0003-Add-tests-for-btrfs-support.patch deleted file mode 100644 index d274bb9..0000000 --- a/0003-Add-tests-for-btrfs-support.patch +++ /dev/null @@ -1,1871 +0,0 @@ -From 20d92194d03750d5d839c501d0539f9258614aae Mon Sep 17 00:00:00 2001 -From: Gene Czarcinski -Date: Mon, 9 Jun 2014 21:11:37 -0400 -Subject: [PATCH 3/3] Add tests for btrfs support - -The tests performed are: -- add kernel with /boot on btrfs subvol (20) -- update kernel/add initrd with /boot on btrfs subvol (21) -- add kernel with rootfs on btrfs subvol and /boot a directory (22) -- update kernel/add initrd with rootfs on btrfs subvol and - /boot a directory (23) -- add kernel and initrd with /boot on btrfs subvol (24) -- add kernel and initrd with rootfs on btrfs subvol and /boot - a directory (25) ---- - test.sh | 40 ++++++++++ - test/grub2-support_files/g2.20-mounts | 2 + - test/grub2-support_files/g2.21-mounts | 1 + - test/grub2-support_files/g2.22-mounts | 1 + - test/grub2-support_files/g2.23-mounts | 1 + - test/grub2-support_files/g2.24-mounts | 1 + - test/grub2-support_files/g2.25-mounts | 1 + - test/grub2.20 | 126 +++++++++++++++++++++++++++++ - test/grub2.21 | 140 +++++++++++++++++++++++++++++++++ - test/grub2.22 | 128 ++++++++++++++++++++++++++++++ - test/grub2.23 | 143 +++++++++++++++++++++++++++++++++ - test/grub2.24 | 126 +++++++++++++++++++++++++++++ - test/grub2.25 | 128 ++++++++++++++++++++++++++++++ - test/results/add/g2-1.20 | 140 +++++++++++++++++++++++++++++++++ - test/results/add/g2-1.21 | 141 +++++++++++++++++++++++++++++++++ - test/results/add/g2-1.22 | 143 +++++++++++++++++++++++++++++++++ - test/results/add/g2-1.23 | 144 ++++++++++++++++++++++++++++++++++ - test/results/add/g2-1.24 | 141 +++++++++++++++++++++++++++++++++ - test/results/add/g2-1.25 | 144 ++++++++++++++++++++++++++++++++++ - 19 files changed, 1691 insertions(+) - create mode 100644 test/grub2-support_files/g2.20-mounts - create mode 120000 test/grub2-support_files/g2.21-mounts - create mode 100644 test/grub2-support_files/g2.22-mounts - create mode 120000 test/grub2-support_files/g2.23-mounts - create mode 120000 test/grub2-support_files/g2.24-mounts - create mode 120000 test/grub2-support_files/g2.25-mounts - create mode 100644 test/grub2.20 - create mode 100644 test/grub2.21 - create mode 100644 test/grub2.22 - create mode 100644 test/grub2.23 - create mode 100644 test/grub2.24 - create mode 100644 test/grub2.25 - create mode 100644 test/results/add/g2-1.20 - create mode 100644 test/results/add/g2-1.21 - create mode 100644 test/results/add/g2-1.22 - create mode 100644 test/results/add/g2-1.23 - create mode 100644 test/results/add/g2-1.24 - create mode 100644 test/results/add/g2-1.25 - -diff --git a/test.sh b/test.sh -index 6379698..c35bfca 100755 ---- a/test.sh -+++ b/test.sh -@@ -629,6 +629,46 @@ if [ "$testgrub2" == "y" ]; then - --initrd /boot/initramfs-0-rescue-5a94251776a14678911d4ae0949500f5.img \ - --copy-default --title "Fedora 21 Rescue" --args=root=/fooooo \ - --remove-kernel=wtf --boot-filesystem=/boot/ -+ -+ testing="GRUB2 add kernel with boot on btrfs subvol" -+ grub2Test grub2.20 add/g2-1.20 --add-kernel=/boot/new-kernel.img \ -+ --title='title' \ -+ --boot-filesystem=/boot/ \ -+ --copy-default \ -+ --mounts='test/grub2-support_files/g2.20-mounts' -+ -+ testing="GRUB2 add initrd with boot on btrfs subvol" -+ grub2Test grub2.21 add/g2-1.21 --update-kernel=/boot/new-kernel.img \ -+ --initrd=/boot/new-initrd --boot-filesystem=/boot/ \ -+ --mounts='test/grub2-support_files/g2.21-mounts' -+ -+ testing="GRUB2 add kernel with rootfs on btrfs subvol and boot directory" -+ grub2Test grub2.22 add/g2-1.22 --add-kernel=/boot/new-kernel.img \ -+ --title='title' \ -+ --boot-filesystem= \ -+ --copy-default \ -+ --mounts='test/grub2-support_files/g2.22-mounts' -+ -+ testing="GRUB2 add initrd with rootfs on btrfs subvol and boot directory" -+ grub2Test grub2.23 add/g2-1.23 --update-kernel=/boot/new-kernel.img \ -+ --initrd=/boot/new-initrd --boot-filesystem= \ -+ --mounts='test/grub2-support_files/g2.23-mounts' -+ -+ testing="GRUB2 add kernel and initrd with boot on btrfs subvol" -+ grub2Test grub2.24 add/g2-1.24 --add-kernel=/boot/new-kernel.img \ -+ --title='title' \ -+ --initrd=/boot/new-initrd \ -+ --boot-filesystem=/boot/ \ -+ --copy-default \ -+ --mounts='test/grub2-support_files/g2.24-mounts' -+ -+ testing="GRUB2 add kernel and initrd with rootfs on btrfs subvol and boot directory" -+ grub2Test grub2.25 add/g2-1.25 --add-kernel=/boot/new-kernel.img \ -+ --title='title' \ -+ --initrd=/boot/new-initrd \ -+ --boot-filesystem= \ -+ --copy-default \ -+ --mounts='test/grub2-support_files/g2.25-mounts' - fi - fi - -diff --git a/test/grub2-support_files/g2.20-mounts b/test/grub2-support_files/g2.20-mounts -new file mode 100644 -index 0000000..00bdb48 ---- /dev/null -+++ b/test/grub2-support_files/g2.20-mounts -@@ -0,0 +1,2 @@ -+/dev/sda / btrfs subvol=/root6,defaults 0 0 -+/dev/sda /boot btrfs subvol=/boot6,defaults 0 0 -diff --git a/test/grub2-support_files/g2.21-mounts b/test/grub2-support_files/g2.21-mounts -new file mode 120000 -index 0000000..42ef3fd ---- /dev/null -+++ b/test/grub2-support_files/g2.21-mounts -@@ -0,0 +1 @@ -+g2.20-mounts -\ No newline at end of file -diff --git a/test/grub2-support_files/g2.22-mounts b/test/grub2-support_files/g2.22-mounts -new file mode 100644 -index 0000000..5b664e7 ---- /dev/null -+++ b/test/grub2-support_files/g2.22-mounts -@@ -0,0 +1 @@ -+/dev/sda / btrfs defaults,subvol=/root4,ro 0 0 -diff --git a/test/grub2-support_files/g2.23-mounts b/test/grub2-support_files/g2.23-mounts -new file mode 120000 -index 0000000..74f036f ---- /dev/null -+++ b/test/grub2-support_files/g2.23-mounts -@@ -0,0 +1 @@ -+g2.22-mounts -\ No newline at end of file -diff --git a/test/grub2-support_files/g2.24-mounts b/test/grub2-support_files/g2.24-mounts -new file mode 120000 -index 0000000..42ef3fd ---- /dev/null -+++ b/test/grub2-support_files/g2.24-mounts -@@ -0,0 +1 @@ -+g2.20-mounts -\ No newline at end of file -diff --git a/test/grub2-support_files/g2.25-mounts b/test/grub2-support_files/g2.25-mounts -new file mode 120000 -index 0000000..74f036f ---- /dev/null -+++ b/test/grub2-support_files/g2.25-mounts -@@ -0,0 +1 @@ -+g2.22-mounts -\ No newline at end of file -diff --git a/test/grub2.20 b/test/grub2.20 -new file mode 100644 -index 0000000..23b75fa ---- /dev/null -+++ b/test/grub2.20 -@@ -0,0 +1,126 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-81378818f7a24478b496ebef90e1dd69' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-0-rescue-81378818f7a24478b496ebef90e1dd69 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-0-rescue-81378818f7a24478b496ebef90e1dd69.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### END /etc/grub.d/30_os-prober ### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### -diff --git a/test/grub2.21 b/test/grub2.21 -new file mode 100644 -index 0000000..579c2f6 ---- /dev/null -+++ b/test/grub2.21 -@@ -0,0 +1,140 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'title' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/new-kernel.img root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+} -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-81378818f7a24478b496ebef90e1dd69' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-0-rescue-81378818f7a24478b496ebef90e1dd69 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-0-rescue-81378818f7a24478b496ebef90e1dd69.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### END /etc/grub.d/30_os-prober ### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### -diff --git a/test/grub2.22 b/test/grub2.22 -new file mode 100644 -index 0000000..9466bc3 ---- /dev/null -+++ b/test/grub2.22 -@@ -0,0 +1,128 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-20e7024f4e9c4b70b1042b91acd434c6' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-0-rescue-20e7024f4e9c4b70b1042b91acd434c6 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-0-rescue-20e7024f4e9c4b70b1042b91acd434c6.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### -diff --git a/test/grub2.23 b/test/grub2.23 -new file mode 100644 -index 0000000..5cb240f ---- /dev/null -+++ b/test/grub2.23 -@@ -0,0 +1,143 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'title' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/new-kernel.img root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+} -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-20e7024f4e9c4b70b1042b91acd434c6' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-0-rescue-20e7024f4e9c4b70b1042b91acd434c6 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-0-rescue-20e7024f4e9c4b70b1042b91acd434c6.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### -diff --git a/test/grub2.24 b/test/grub2.24 -new file mode 100644 -index 0000000..23b75fa ---- /dev/null -+++ b/test/grub2.24 -@@ -0,0 +1,126 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-81378818f7a24478b496ebef90e1dd69' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-0-rescue-81378818f7a24478b496ebef90e1dd69 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-0-rescue-81378818f7a24478b496ebef90e1dd69.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### END /etc/grub.d/30_os-prober ### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### -diff --git a/test/grub2.25 b/test/grub2.25 -new file mode 100644 -index 0000000..9466bc3 ---- /dev/null -+++ b/test/grub2.25 -@@ -0,0 +1,128 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-20e7024f4e9c4b70b1042b91acd434c6' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-0-rescue-20e7024f4e9c4b70b1042b91acd434c6 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-0-rescue-20e7024f4e9c4b70b1042b91acd434c6.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### -diff --git a/test/results/add/g2-1.20 b/test/results/add/g2-1.20 -new file mode 100644 -index 0000000..579c2f6 ---- /dev/null -+++ b/test/results/add/g2-1.20 -@@ -0,0 +1,140 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'title' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/new-kernel.img root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+} -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-81378818f7a24478b496ebef90e1dd69' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-0-rescue-81378818f7a24478b496ebef90e1dd69 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-0-rescue-81378818f7a24478b496ebef90e1dd69.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### END /etc/grub.d/30_os-prober ### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### -diff --git a/test/results/add/g2-1.21 b/test/results/add/g2-1.21 -new file mode 100644 -index 0000000..c0dded9 ---- /dev/null -+++ b/test/results/add/g2-1.21 -@@ -0,0 +1,141 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'title' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/new-kernel.img root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/new-initrd -+} -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-81378818f7a24478b496ebef90e1dd69' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-0-rescue-81378818f7a24478b496ebef90e1dd69 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-0-rescue-81378818f7a24478b496ebef90e1dd69.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### END /etc/grub.d/30_os-prober ### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### -diff --git a/test/results/add/g2-1.22 b/test/results/add/g2-1.22 -new file mode 100644 -index 0000000..5cb240f ---- /dev/null -+++ b/test/results/add/g2-1.22 -@@ -0,0 +1,143 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'title' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/new-kernel.img root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+} -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-20e7024f4e9c4b70b1042b91acd434c6' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-0-rescue-20e7024f4e9c4b70b1042b91acd434c6 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-0-rescue-20e7024f4e9c4b70b1042b91acd434c6.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### -diff --git a/test/results/add/g2-1.23 b/test/results/add/g2-1.23 -new file mode 100644 -index 0000000..c3e87cf ---- /dev/null -+++ b/test/results/add/g2-1.23 -@@ -0,0 +1,144 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'title' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/new-kernel.img root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/new-initrd -+} -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-20e7024f4e9c4b70b1042b91acd434c6' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-0-rescue-20e7024f4e9c4b70b1042b91acd434c6 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-0-rescue-20e7024f4e9c4b70b1042b91acd434c6.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### -diff --git a/test/results/add/g2-1.24 b/test/results/add/g2-1.24 -new file mode 100644 -index 0000000..c0dded9 ---- /dev/null -+++ b/test/results/add/g2-1.24 -@@ -0,0 +1,141 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'title' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/new-kernel.img root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/new-initrd -+} -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-81378818f7a24478b496ebef90e1dd69' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ else -+ search --no-floppy --fs-uuid --set=root 1bab15a4-93ce-4373-8d7d-b77f907fd0c6 -+ fi -+ linux16 /boot6/vmlinuz-0-rescue-81378818f7a24478b496ebef90e1dd69 root=UUID=1bab15a4-93ce-4373-8d7d-b77f907fd0c6 ro rootflags=subvol=root6 rhgb quiet -+ initrd16 /boot6/initramfs-0-rescue-81378818f7a24478b496ebef90e1dd69.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### END /etc/grub.d/30_os-prober ### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### -diff --git a/test/results/add/g2-1.25 b/test/results/add/g2-1.25 -new file mode 100644 -index 0000000..c3e87cf ---- /dev/null -+++ b/test/results/add/g2-1.25 -@@ -0,0 +1,144 @@ -+# -+# DO NOT EDIT THIS FILE -+# -+# It is automatically generated by grub2-mkconfig using templates -+# from /etc/grub.d and settings from /etc/default/grub -+# -+ -+### BEGIN /etc/grub.d/00_header ### -+set pager=1 -+ -+if [ -s $prefix/grubenv ]; then -+ load_env -+fi -+if [ "${next_entry}" ] ; then -+ set default="${next_entry}" -+ set next_entry= -+ save_env next_entry -+ set boot_once=true -+else -+ set default="${saved_entry}" -+fi -+ -+if [ x"${feature_menuentry_id}" = xy ]; then -+ menuentry_id_option="--id" -+else -+ menuentry_id_option="" -+fi -+ -+export menuentry_id_option -+ -+if [ "${prev_saved_entry}" ]; then -+ set saved_entry="${prev_saved_entry}" -+ save_env saved_entry -+ set prev_saved_entry= -+ save_env prev_saved_entry -+ set boot_once=true -+fi -+ -+function savedefault { -+ if [ -z "${boot_once}" ]; then -+ saved_entry="${chosen}" -+ save_env saved_entry -+ fi -+} -+ -+function load_video { -+ if [ x$feature_all_video_module = xy ]; then -+ insmod all_video -+ else -+ insmod efi_gop -+ insmod efi_uga -+ insmod ieee1275_fb -+ insmod vbe -+ insmod vga -+ insmod video_bochs -+ insmod video_cirrus -+ fi -+} -+ -+terminal_output console -+if [ x$feature_timeout_style = xy ] ; then -+ set timeout_style=menu -+ set timeout=15 -+# Fallback normal timeout code in case the timeout_style feature is -+# unavailable. -+else -+ set timeout=15 -+fi -+### END /etc/grub.d/00_header ### -+ -+### BEGIN /etc/grub.d/10_linux ### -+menuentry 'title' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/new-kernel.img root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/new-initrd -+} -+menuentry 'Fedora, with Linux 3.15.0-0.rc7.git2.1.fc21.x86_64' --class gnu-linux --class gnu --class os { -+ load_video -+ set gfxpayload=keep -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-3.15.0-0.rc7.git2.1.fc21.x86_64 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-3.15.0-0.rc7.git2.1.fc21.x86_64.img -+} -+menuentry 'Fedora, with Linux 0-rescue-20e7024f4e9c4b70b1042b91acd434c6' --class gnu-linux --class gnu --class os { -+ load_video -+ insmod gzio -+ insmod part_msdos -+ insmod part_msdos -+ insmod btrfs -+ set root='hd0,msdos1' -+ if [ x$feature_platform_search_hint = xy ]; then -+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' --hint='hd1,msdos3' 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ else -+ search --no-floppy --fs-uuid --set=root 54c6abc2-b1e7-4987-aa73-c79927be69eb -+ fi -+ linux16 /root4/boot/vmlinuz-0-rescue-20e7024f4e9c4b70b1042b91acd434c6 root=UUID=54c6abc2-b1e7-4987-aa73-c79927be69eb ro rootflags=subvol=root4 rhgb quiet -+ initrd16 /root4/boot/initramfs-0-rescue-20e7024f4e9c4b70b1042b91acd434c6.img -+} -+ -+### END /etc/grub.d/10_linux ### -+ -+### BEGIN /etc/grub.d/20_linux_xen ### -+ -+### END /etc/grub.d/20_linux_xen ### -+ -+### BEGIN /etc/grub.d/20_ppc_terminfo ### -+### END /etc/grub.d/20_ppc_terminfo ### -+ -+### BEGIN /etc/grub.d/30_os-prober ### -+### -+ -+### BEGIN /etc/grub.d/40_custom ### -+# This file provides an easy way to add custom menu entries. Simply type the -+# menu entries you want to add after this comment. Be careful not to change -+# the 'exec tail' line above. -+### END /etc/grub.d/40_custom ### -+ -+### BEGIN /etc/grub.d/41_custom ### -+if [ -f ${config_directory}/custom.cfg ]; then -+ source ${config_directory}/custom.cfg -+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then -+ source $prefix/custom.cfg; -+fi -+### END /etc/grub.d/41_custom ### --- -2.14.3 - diff --git a/0004-Honor-sbindir.patch b/0004-Honor-sbindir.patch deleted file mode 100644 index 5a2c5cf..0000000 --- a/0004-Honor-sbindir.patch +++ /dev/null @@ -1,36 +0,0 @@ -From a56df998177574ef2db332220c15f11bccd98f7e Mon Sep 17 00:00:00 2001 -From: Peter Jones -Date: Wed, 18 Jul 2018 13:41:02 -0400 -Subject: [PATCH] Honor sbindir - -Signed-off-by: Peter Jones ---- - Makefile | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/Makefile b/Makefile -index ac144046133..2b18dd6404b 100644 ---- a/Makefile -+++ b/Makefile -@@ -42,14 +42,14 @@ test: all - @./test.sh - - install: all -- mkdir -p $(DESTDIR)$(PREFIX)/sbin -+ mkdir -p $(DESTDIR)$(PREFIX)$(sbindir) - mkdir -p $(DESTDIR)/$(mandir)/man8 -- install -m 755 new-kernel-pkg $(DESTDIR)$(PREFIX)/sbin -+ install -m 755 new-kernel-pkg $(DESTDIR)$(PREFIX)$(sbindir) - install -m 644 new-kernel-pkg.8 $(DESTDIR)/$(mandir)/man8 -- install -m 755 installkernel $(DESTDIR)$(PREFIX)/sbin -+ install -m 755 installkernel $(DESTDIR)$(PREFIX)$(sbindir) - install -m 644 installkernel.8 $(DESTDIR)/$(mandir)/man8 - if [ -f grubby ]; then \ -- install -m 755 grubby $(DESTDIR)$(PREFIX)/sbin ; \ -+ install -m 755 grubby $(DESTDIR)$(PREFIX)$(sbindir) ; \ - install -m 644 grubby.8 $(DESTDIR)/$(mandir)/man8 ; \ - fi - --- -2.17.1 - diff --git a/0005-installkernel-use-kernel-install.patch b/0005-installkernel-use-kernel-install.patch deleted file mode 100644 index 2ec577d..0000000 --- a/0005-installkernel-use-kernel-install.patch +++ /dev/null @@ -1,48 +0,0 @@ -From f93a35be5bdec17044dd2a17980689d3cbf73d58 Mon Sep 17 00:00:00 2001 -From: Javier Martinez Canillas -Date: Tue, 31 Jul 2018 17:43:53 +0200 -Subject: [PATCH] Make installkernel to use kernel-install scripts on BLS - configuration - -The kernel make install target executes the arch/$ARCH/boot/install.sh -that in turns executes the distro specific installkernel script. This -script always uses new-kernel-pkg to install the kernel images. - -But on a BootLoaderSpec setup, the kernel-install scripts must be used -instead. Check if the system uses a BLS setup, and call kernel-install -add in that case instead of new-kernel-pkg. - -Reported-by: Hans de Goede -Signed-off-by: Javier Martinez Canillas ---- - installkernel | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/installkernel b/installkernel -index b887929c179..68dcfac16d2 100755 ---- a/installkernel -+++ b/installkernel -@@ -20,6 +20,8 @@ - # Author(s): tyson@rwii.com - # - -+[[ -f /etc/default/grub ]] && . /etc/default/grub -+ - usage() { - echo "Usage: `basename $0` " >&2 - exit 1 -@@ -77,6 +79,11 @@ cp $MAPFILE $INSTALL_PATH/System.map-$KERNEL_VERSION - ln -fs ${RELATIVE_PATH}$INSTALL_PATH/$KERNEL_NAME-$KERNEL_VERSION $LINK_PATH/$KERNEL_NAME - ln -fs ${RELATIVE_PATH}$INSTALL_PATH/System.map-$KERNEL_VERSION $LINK_PATH/System.map - -+if [ "x${GRUB_ENABLE_BLSCFG}" = "xtrue" ] || [ ! -f /sbin/new-kernel-pkg ]; then -+ kernel-install add $KERNEL_VERSION $INSTALL_PATH/$KERNEL_NAME-$KERNEL_VERSION -+ exit $? -+fi -+ - if [ -n "$cfgLoader" ] && [ -x /sbin/new-kernel-pkg ]; then - if [ -n "$(which dracut 2>/dev/null)" ]; then - new-kernel-pkg --mkinitrd --dracut --host-only --depmod --install --kernel-name $KERNEL_NAME $KERNEL_VERSION --- -2.17.1 - diff --git a/10-devicetree.install b/10-devicetree.install new file mode 100755 index 0000000..fdea5ec --- /dev/null +++ b/10-devicetree.install @@ -0,0 +1,73 @@ +#!/bin/bash + +# set -x + +if [[ "$(uname -m)" == arm* || "$(uname -m)" == aarch64 || "$(uname -m)" == riscv64 ]] +then +COMMAND="$1" +KERNEL_VERSION="$2" +#BOOT_DIR_ABS="$3" +#KERNEL_IMAGE="$4" + +[ -f /etc/u-boot.conf ] && source /etc/u-boot.conf || true +[ -z "$FIRMWAREDT" ] || FirmwareDT=$FIRMWAREDT + +if [[ $FirmwareDT == "True" ]] +then + # if we want to use firmware DT we remove symlink to current kernel DT + if [ -h /boot/dtb ]; then + rm -f /boot/dtb + fi + exit 0 +fi + +# Setup a /boot/dtb -> /boot/dtb-$newest_kernel_version symlink so that +# u-boot can find the correct dtb to load. +# +# If invoked to 'add' a new kernel, find the newest based on `sort`ing +# the kernel versions dtb. If 'remove', then follow basically the same +# procedure but exclude the version currently being removed. +# +# The theory of operation here is that, while newer kernels may add new +# dtb nodes and fields, as upstreaming hw support for some particular +# device progresses, it should never make backward incompatible changes. +# So it should always be safe to use a newer dtb with an older kernel. + + list_dtb_versions() { + excluded_version="$1" + for dtbdir in /boot/dtb-*; do + dtbver=${dtbdir#*-} + if [ "$dtbver" != "$excluded_version" ]; then + echo $dtbver + fi + done + } + + setup_dtb_link() { + ver=`list_dtb_versions $1 | sort -r --sort=version | head -1` + if [ -h /boot/dtb ]; then + rm -f /boot/dtb + fi + ln -s dtb-$ver /boot/dtb + } + + ret=0 + case "$COMMAND" in + add) + # If we're adding a kernel we want that version + if [ -h /boot/dtb ]; then + rm -f /boot/dtb + fi + ln -s dtb-$KERNEL_VERSION /boot/dtb + ret=$? + ;; + remove) + setup_dtb_link $KERNEL_VERSION + ret=$? + ;; + esac + exit $ret +else + # Just exit on non ARM + exit 0 +fi diff --git a/95-kernel-hooks.install b/95-kernel-hooks.install new file mode 100755 index 0000000..1313556 --- /dev/null +++ b/95-kernel-hooks.install @@ -0,0 +1,33 @@ +#!/usr/bin/bash + +if ! [[ $KERNEL_INSTALL_MACHINE_ID ]]; then + exit 0 +fi + +COMMAND="$1" +KERNEL_VERSION="$2" +BOOT_DIR_ABS="$3" + +# If $BOOT_DIR_ABS exists, some other boot loader is active. +[[ -d "$BOOT_DIR_ABS" ]] && exit 0 + +run_hooks() +{ + local f + local files="$1" + for f in $files ; do + [ -x "$f" ] || continue + "$f" "$KERNEL_VERSION" "/boot/vmlinuz-$KERNEL_VERSION" + done +} + +case "$COMMAND" in + add) + run_hooks "/etc/kernel/postinst.d/*[^~] /etc/kernel/postinst.d/$KERNEL_VERSION/*[^~]" + ;; + remove) + run_hooks "/etc/kernel/prerm.d/*[^~] /etc/kernel/prerm.d/$KERNEL_VERSION/*[^~]" + ;; + *) + exit 0 +esac diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..f90922e --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/drop-uboot-uImage-creation.patch b/drop-uboot-uImage-creation.patch deleted file mode 100644 index ee611f9..0000000 --- a/drop-uboot-uImage-creation.patch +++ /dev/null @@ -1,232 +0,0 @@ -From 3689d4cebedf115e41c192bf034b6f86fcb80acb Mon Sep 17 00:00:00 2001 -From: Dennis Gilmore -Date: Wed, 30 Aug 2017 14:03:45 -0500 -Subject: [PATCH] remove the old crufty u-boot support - -Fedora has only supported extlinux.conf for a few releases now -as a result it should be the only way we boot systems. Remove -the no longer needed uboot file - -Signed-off-by: Dennis Gilmore ---- - new-kernel-pkg | 116 --------------------------------------------------------- - uboot | 43 --------------------- - 2 files changed, 159 deletions(-) - delete mode 100644 uboot - -diff --git a/new-kernel-pkg b/new-kernel-pkg -index 64225de..0fe6caa 100755 ---- a/new-kernel-pkg -+++ b/new-kernel-pkg -@@ -37,7 +37,6 @@ else - fi - - [ -f /etc/sysconfig/kernel ] && . /etc/sysconfig/kernel --[ -f /etc/sysconfig/uboot ] && . /etc/sysconfig/uboot - - cfgGrub2="" - cfgGrub2Efi="" -@@ -50,7 +49,6 @@ grubConfig="" - grub2Config="" - grub2EfiConfig="" - extlinuxConfig="" --ubootScript="/boot/boot.scr" - - ARCH=$(uname -m) - -@@ -84,13 +82,6 @@ elif [[ ${ARCH} =~ armv[5|7].*l ]] ; then - liloConfig="" - bootPrefix=/boot - extlinuxConfig=$(readlink -f /etc/extlinux.conf 2>/dev/null) -- ubootDir=${UBOOT_DIR:-"/boot"} -- ubootScript=$ubootDir/${UBOOT_SCR:-"boot.scr"} -- ubootKList=${UBOOT_KLIST:-"klist.txt"} -- ubootDevice=/dev/${UBOOT_DEVICE:-"mmcblk0p1"} -- ubootDefaultImage=${UBOOT_UIMAGE:-"uImage"} -- ubootDefaultInitrd=${UBOOT_UINITRD:-"uInitrd"} -- ubootAddress=${UBOOT_IMGADDR:-"0x00008000"} - mounted="" - liloFlag="" - isx86="" -@@ -386,53 +377,6 @@ remove() { - [ -n "$verbose" ] && echo "$liloConfig does not exist, not running grubby" - fi - -- if [ -n "$cfguBoot" ]; then -- [ -n "$verbose" ] && echo "removing $version from $ubootDir..." -- -- if [ -f $ubootDir/$ubootKList ]; then -- tmpKList=`mktemp $ubootDir/$ubootKList.XXXX` -- curversion=`tail -n1 $ubootDir/$ubootKList` -- sed "/$version$/d" $ubootDir/$ubootKList > $tmpKList -- newversion=`tail -n1 $tmpKList` -- if [ -f $ubootDir/uImage-$newversion ] && [ -f $ubootDir/uInitrd-$newversion ]; then -- if [ "$curversion" != "$newversion" ]; then -- cp -fp $ubootDir/uImage-$newversion $ubootDir/${ubootDefaultImage} -- if [ $? -ne 0 ]; then -- [ -n "$verbose" ] && echo "copy uImage-$newversion error, default kernel not replaced!" && exit -- fi -- cp -fp $ubootDir/uInitrd-$newversion $ubootDir/${ubootDefaultInitrd} -- if [ $? -ne 0 ]; then -- [ -n "$verbose" ] && echo "copy uInitrd-$newversion error, default Initrd not replaced!" && exit -- fi -- fi -- -- [ -n "$verbose" ] && echo "removing uImage-$version" -- if [ -f $ubootDir/uImage-$version ]; then -- rm -f $ubootDir/uImage-$version -- else -- [ -n "$verbose" ] && echo "uImage-$version did not exist!" -- fi -- -- [ -n "$verbose" ] && echo "removing uInitrd-$version" -- if [ -f $ubootDir/uInitrd-$version ]; then -- rm -f $ubootDir/uInitrd-$version -- else -- [ -n "$verbose" ] && echo "uInitrd-$version did not exist!" -- fi -- -- mv $tmpKList $ubootDir/$ubootKList -- [ -x /sbin/a-b-c ] && /sbin/a-b-c -- else -- [ -n "$verbose" ] && echo "uImage $newversion does not exist!" -- [ -f $tmpKList ] && rm -f $tmpKList -- fi -- else -- [ -n "$verbose" ] && echo "No previous kernel version. U-Boot images not removed!" -- fi -- else -- [ -n "$verbose" ] && echo "$ubootScript does not exist, not modifying $ubootDir" -- fi -- - if [ -n "$cfgExtlinux" ]; then - [ -n "$verbose" ] && echo "removing $version from $extlinuxConfig" - $grubby --extlinux -c $extlinuxConfig \ -@@ -534,36 +478,6 @@ update() { - [ -n "$verbose" ] && echo "$liloConfig does not exist, not running grubby" - fi - -- if [ -n "$cfguBoot" ]; then -- [ -n "$verbose" ] && echo "adding $version to $ubootDir..." -- -- [ -n "$verbose" ] && echo "creating uImage-$version" -- mkimage -A arm -O linux -T kernel -C none -a $ubootAddress \ -- -e $ubootAddress -n $version \ -- -d $kernelImage $ubootDir/uImage-$version -- -- [ -n "$verbose" ] && echo "creating uInitrd-$version" -- mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 \ -- -n initramfs -d $initrdfile $ubootDir/uInitrd-$version -- -- if [ -f $ubootDir/uImage-$version ] && [ -f $ubootDir/uInitrd-$version ]; then -- cp -fp $ubootDir/uImage-$version $ubootDir/${ubootDefaultImage} -- if [ $? -ne 0 ]; then -- [ -n "$verbose" ] && echo "copy uImage-$version error, kernel not installed!" && exit -- fi -- cp -fp $ubootDir/uInitrd-$version $ubootDir/${ubootDefaultInitrd} -- if [ $? -ne 0 ]; then -- [ -n "$verbose" ] && echo "copy uInitrd-$version error, kernel not installed!" && exit -- fi -- echo $version >> $ubootDir/$ubootKList -- [ -x /sbin/a-b-c ] && /sbin/a-b-c -- else -- [ -n "$verbose" ] && echo "cannot make $version the default" -- fi -- else -- [ -n "$verbose" ] && echo "$ubootScript does not exist, not setting up $ubootDir" -- fi -- - if [ -n "$cfgExtlinux" ]; then - [ -n "$verbose" ] && echo "updating $version from $extlinuxConfig" - ARGS="--extlinux -c $extlinuxConfig --update-kernel=$kernelImage \ -@@ -874,33 +788,6 @@ fi - [ -n "$liloConfig" ] && [ -f "$liloConfig" ] && cfgLilo=1; - [ -n "$extlinuxConfig" ] && [ -f "$extlinuxConfig" ] && cfgExtlinux=1; - --# if we have a U-Boot directory, but no boot script, check if the directory --# is mounted. If not, mount it, and then check if a boot script exists. --if [ -n "$ubootDir" ]; then -- if [ -f "$ubootScript" ]; then -- cfguBoot=1 -- else -- mountEntry=`mount | grep $ubootDir` -- if [ -z "$mountEntry" ]; then -- mount $ubootDevice $ubootDir -- mounted=1 -- fi -- [ -f "$ubootScript" ] && cfguBoot=1; -- fi --fi -- --# if we're using U-Boot, check if the default load address should change --if [ -n "$cfguBoot" -a -z "$UBOOT_IMGADDR" ]; then -- [[ $version =~ .([^.]*)$ ]] -- platform=${BASH_REMATCH[1]} -- # A few platforms use an alternate kernel load address -- if [ "$platform" = "omap" ]; then -- ubootAddress=0x80008000 -- elif [ "$platform" = "imx" ]; then -- ubootAddress=0x90008000 -- fi --fi -- - # if we have a lilo config on an x86 box, see if the default boot loader - # is lilo to determine if it should be run - if [ -n "$cfgLilo" -a -n "$isx86" ]; then -@@ -920,7 +807,4 @@ elif [ "$mode" == "--rpmposttrans" ]; then - rpmposttrans - fi - --# if we mounted the U-Boot directory, unmount it. --[ -n "$mounted" ] && umount $ubootDir -- - exit 0 -diff --git a/uboot b/uboot -deleted file mode 100644 -index 07d8671..0000000 ---- a/uboot -+++ /dev/null -@@ -1,43 +0,0 @@ --# Settings for uBoot setup in /sbin/new-kernel-pkg --# --# Default values are provided below (as comments) --# --# WARNING: These values affect where grubby installs and removes --# uBoot kernel images. Changing these _after_ kernels have --# been installed may cause removing a kernel image to fail. -- --# directory where uBoot images and scripts are found --#UBOOT_DIR=/boot -- --# Override the load address when running mkimage on the kernel. --# OMAP such as Beagleboard and Pandaboard: Use 0x80008000 --# Tegra such as Trimslice: Use 0x00008000 --# IMX such as Efika mx51 smarttop: Use 0x90008000 --# Kirkwood such as Dreamplug, Guruplug, Sheevaplug: Use 0x00008000 --# If left undefined grubby will use defults for Tegra or OMAP depending --# upon the contents of /proc/cpuinfo. --#UBOOT_IMGADDR=0x0x00008000 -- --# name of the text file containing the list of installed kernel versions --# NOTE: The versions are in order of installation. The last entry should --# always be the default boot kernel version. --#UBOOT_KLIST=klist.txt -- --# device partition where uBoot images reside; mounted on $UBOOT_DIR --#UBOOT_DEVICE=mmcblk0p1 -- -- --# NOTE: Both of the following files are automatically overwritte --# when a kernel package is installed or removed. -- --# default kernel uImage file name --#UBOOT_UIMAGE=uImage -- --# default initrd uInitrd file name --#UBOOT_UINITRD=uInitrd -- --# defualt for platform shipping an onboard dtb. --#SHIPSDTB=no -- --# option to tell new-kernel-pkg a specific dtb file to load in extlinux.conf --#dtbfile=foo.dtb diff --git a/grubby-bls b/grubby-bls index d94415f..11b69b1 100755 --- a/grubby-bls +++ b/grubby-bls @@ -48,6 +48,10 @@ print_error() { exit 1 } +print_info() { + echo "$1" >&2 +} + if [[ ${#} = 0 ]]; then print_error "no action specified" fi @@ -56,7 +60,7 @@ get_bls_value() { local bls="$1" && shift local key="$1" && shift - echo "$(grep "^${key}[ \t]" "${bls}" | sed -e "s,^${key}[ \t]*,,")" + echo "$(grep "^${key}[ \t]" "${bls}" | sed -e "s!^${key}[ \t]*!!")" } set_bls_value() { @@ -64,7 +68,8 @@ set_bls_value() { local key="$1" && shift local value="$1" && shift - sed -i -e "s,^${key}.*,${key} ${value}," "${bls}" + value=$(echo $value | sed -e 's/\//\\\//g') + sed -i -e "s/^${key}.*/${key} ${value}/" "${bls}" } append_bls_value() { @@ -72,20 +77,32 @@ append_bls_value() { local key="$1" && shift local value="$1" && shift - old_value="$(get_bls_value ${bls} ${key})" + old_value="$(get_bls_value "${bls}" ${key})" set_bls_value "${bls}" "${key}" "${old_value}${value}" } get_bls_values() { count=0 - for bls in $(ls -vr ${blsdir}/*.conf 2> /dev/null); do - bls_file[$count]="${bls}" - bls_title[$count]="$(get_bls_value ${bls} title)" - bls_version[$count]="$(get_bls_value ${bls} version)" - bls_linux[$count]="$(get_bls_value ${bls} linux)" - bls_initrd[$count]="$(get_bls_value ${bls} initrd)" - bls_options[$count]="$(get_bls_value ${bls} options)" - bls_id[$count]="$(get_bls_value ${bls} id)" + local -a files + local IFS=$'\n' + files=($(for bls in ${blsdir}/*.conf ; do + if ! [[ -e "${bls}" ]] ; then + continue + fi + bls="${bls%.conf}" + bls="${bls##*/}" + echo "${bls}" + done | sort -Vr 2>/dev/null)) || : + + for bls in "${files[@]}" ; do + blspath="${blsdir}/${bls}.conf" + bls_file[$count]="${blspath}" + bls_title[$count]="$(get_bls_value ${blspath} title)" + bls_version[$count]="$(get_bls_value ${blspath} version)" + bls_linux[$count]="$(get_bls_value ${blspath} linux)" + bls_initrd[$count]="$(get_bls_value ${blspath} initrd)" + bls_options[$count]="$(get_bls_value ${blspath} options)" + bls_id[$count]="${bls}" count=$((count+1)) done @@ -108,16 +125,13 @@ get_default_index() { index="$default" fi - # GRUB2 and zipl use different fields to set the default entry - if [[ $bootloader = "grub2" ]]; then - title="$default" - else - version="$default" - fi - for i in ${!bls_file[@]}; do - if [[ $title = ${bls_title[$i]} || $version = ${bls_version[$i]} || - $i -eq $index ]]; then + if [[ $i -eq $index ]]; then + echo $i + return + fi + + if [[ $default = ${bls_id[$i]} || $default = ${bls_title[$i]} ]]; then echo $i return fi @@ -125,9 +139,11 @@ get_default_index() { } display_default_value() { + local prefix=$(get_prefix) + case "$display_default" in kernel) - echo "${bls_linux[$default_index]}" + echo "${prefix}${bls_linux[$default_index]}" exit 0 ;; index) @@ -159,7 +175,7 @@ param_to_indexes() { fi for i in ${!bls_file[@]}; do - if [[ $param = "${bls_linux[$i]}" ]]; then + if [[ $param = "${bls_linux[$i]}" || "/${param##*/}" = "${bls_linux[$i]}" ]]; then indexes="$indexes $i" fi @@ -180,15 +196,89 @@ param_to_indexes() { echo -n "-1" } +get_prefix() { + if [[ $bootloader = grub2 ]] && mountpoint -q /boot; then + echo "/boot" + else + echo "" + fi +} + +expand_var() { + local var=$1 + + if [[ $bootloader == "grub2" ]]; then + local value="$(grub2-editenv "${env}" list | grep ${var##$} | sed -e "s/${var##$}=//")" + value="$(echo ${value} | sed -e 's/\//\\\//g')" + if [[ -n $value ]]; then + var="$value" + fi + fi + + echo $var +} + +has_kernelopts() +{ + local args=${bls_options[$1]} + local opts=(${args}) + + for opt in ${opts[*]}; do + [[ $opt = "\$kernelopts" ]] && echo "true" + done + + echo "false" +} + +get_bls_args() { + local args=${bls_options[$1]} + local opts=(${args}) + + for opt in ${opts[*]}; do + if [[ $opt = "\$kernelopts" ]]; then + value="$(expand_var $opt)" + args="$(echo ${args} | sed -e "s/${opt}/${value}/")" + fi + done + + echo ${args} +} + display_info_values() { local indexes=($(param_to_indexes "$1")) + local prefix=$(get_prefix) + + if [[ $indexes = "-1" ]]; then + print_error "The param $1 is incorrect" + fi for i in ${indexes[*]}; do + local root="" + local value="" + local args="$(get_bls_args "$i")" + + local opts=(${args}) + + for opt in ${opts[*]}; do + if echo $opt | grep -q "^root="; then + root="$(echo $opt | sed -e 's/root=//')" + value="$(echo ${opt} | sed -e 's/\//\\\//g')" + args="$(echo ${args} | sed -e "s/${value}[ \t]*//")" + break + fi + done + echo "index=$i" - echo "kernel=${bls_linux[$i]}" - echo "args=\"${bls_options[$i]}\"" - echo "initrd=${bls_initrd[$i]}" - echo "title=${bls_title[$i]}" + echo "kernel=\"${prefix}${bls_linux[$i]}\"" + echo "args=\"${args}\"" + + if [[ -n $root ]]; then + echo "root=\"${root}\"" + fi + + echo "initrd=\"${prefix}${bls_initrd[$i]}\"" + echo "title=\"${bls_title[$i]}\"" + echo "id=\"${bls_id[$i]}\"" done exit 0 } @@ -200,6 +290,11 @@ mkbls() { local debugname="" local flavor="" + local prefix="" + + if [[ $(get_prefix) = "" ]]; then + prefix="/boot" + fi if [[ $kernelver == *\+* ]] ; then local flavor=-"${kernelver##*+}" @@ -213,7 +308,7 @@ mkbls() { title ${NAME} (${kernelver}) ${VERSION}${debugname} version ${kernelver}${debugid} linux ${kernel} -initrd /initramfs-${kernelver}.img +initrd ${prefix}/initramfs-${kernelver}.img options \$kernelopts id ${ID}-${datetime}-${kernelver}${debugid} grub_users \$grub_users @@ -222,18 +317,65 @@ grub_class kernel${flavor} EOF } +unset_default_bls() +{ + if [[ $bootloader = grub2 ]]; then + grub2-editenv "${env}" unset saved_entry + else + sed -i -e "/^default=.*/d" "${zipl_config}" + fi +} + remove_bls_fragment() { local indexes=($(param_to_indexes "$1")) if [[ $indexes = "-1" ]]; then - print_error "The param $1 is incorrect" + print_error "The param $(get_prefix)$1 is incorrect" fi - for i in ${indexes[*]}; do + for i in "${indexes[@]}"; do + if [[ $default_index = $i ]]; then + unset_default_bls + fi rm -f "${bls_file[$i]}" done get_bls_values + + update_grubcfg +} + +get_custom_bls_filename() { + local kernelver=$1 + local bls_target="${blsdir}/${MACHINE_ID}-${kernelver}.conf" + count=0 + local -a files + local IFS=$'\n' + + prefix="${bls_target%%.conf}" + prefix="${bls_target%%${arch}}" + prefix="${prefix%.*}" + + first_gap=$( + first=0 + for bls_entry in $(ls "${prefix}".*~custom*.conf 2>/dev/null | sort -V); do + if [[ -e ${bls_entry} ]]; then + bls_entry="${bls_entry##"${prefix}".}" + bls_entry="${bls_entry%%~custom*}" + if [[ "${bls_entry}" = "${first}" ]]; then + first=$((first+1)) + else + break + fi + fi + done + echo "${first}") || : + + if [[ -z "$first_gap" ]]; then + first_gap="0" + fi + + echo "${bls_target}" | sed -e "s!${prefix}!${prefix}.${first_gap}~custom!" } add_bls_fragment() { @@ -245,11 +387,12 @@ add_bls_fragment() { if [[ $kernel = *"vmlinuz-"* ]]; then kernelver="${kernel##*/vmlinuz-}" + prefix="vmlinuz-" else kernelver="${kernel##*/}" fi - if [[ ! -d "/lib/modules/${kernelver}" || ! -f "/boot/vmlinuz-${kernelver}" ]] && + if [[ ! -f "/boot/${prefix}${kernelver}" ]] && [[ $bad_image != "true" ]]; then print_error "The ${kernelver} kernel isn't installed in the machine" fi @@ -263,18 +406,20 @@ add_bls_fragment() { fi bls_target="${blsdir}/${MACHINE_ID}-${kernelver}.conf" - kernel_dir="/lib/modules/${kernelver}" - if [[ -f "${kernel_dir}/bls.conf" ]]; then - cp -aT "${kernel_dir}/bls.conf" "${bls_target}" || exit $? - else - if [[ -d $kernel_dir ]]; then - datetime="$(date -u +%Y%m%d%H%M%S -d "$(stat -c '%y' "${kernel_dir}")")" - else - datetime=0 - fi - mkbls "${kernel}" "${kernelver}" "${datetime}" > "${bls_target}" + + if [[ -e ${bls_target} ]]; then + bls_target="$(get_custom_bls_filename "${kernelver}")" + print_info "An entry for kernel ${kernelver} already exists, adding ${bls_target}" fi + kernel_dir="/lib/modules/${kernelver}" + if [[ -d $kernel_dir ]]; then + datetime="$(date -u +%Y%m%d%H%M%S -d "$(stat -c '%y' "${kernel_dir}")")" + else + datetime=0 + fi + mkbls "${kernel}" "${kernelver}" "${datetime}" > "${bls_target}" + if [[ -n $title ]]; then set_bls_value "${bls_target}" "title" "${title}" fi @@ -288,17 +433,16 @@ add_bls_fragment() { fi if [[ -n $extra_initrd ]]; then - append_bls_value "${bls_target}" "initrd" "${extra_initrd}" + append_bls_value "${bls_target}" "initrd" " ${extra_initrd}" fi if [[ $MAKEDEBUG = "yes" ]]; then - arch="$(uname -m)" - bls_debug="$(echo ${bls_target} | sed -e "s/\.${arch}/-debug.${arch}/")" + bls_debug="$(echo ${bls_target} | sed -e "s/${kernelver}/${kernelver}~debug/")" cp -aT "${bls_target}" "${bls_debug}" append_bls_value "${bls_debug}" "title" "${LINUX_DEBUG_TITLE_POSTFIX}" append_bls_value "${bls_debug}" "version" "${LINUX_DEBUG_VERSION_POSTFIX}" append_bls_value "${bls_debug}" "options" "${CMDLINE_LINUX_DEBUG}" - blsid="$(get_bls_value ${bls_debug} "id" | sed -e "s/\.${arch}/-debug.${arch}/")" + blsid="$(get_bls_value ${bls_debug} "id" | sed -e "s/${kernelver}/${kernelver}~debug/")" set_bls_value "${bls_debug}" "id" "${blsid}" fi @@ -308,6 +452,8 @@ add_bls_fragment() { set_default_bls "TITLE=${title}" fi + update_grubcfg + exit 0 } @@ -317,55 +463,103 @@ update_args() { local add_args=($1) && shift for arg in ${remove_args[*]}; do - args="$(echo $args | sed -e "s,$arg[^ ]*,,")" + arg="$(echo $arg | sed -e 's/\//\\\//g')" + if [[ $arg = *"="* ]]; then + args="$(echo $args | sed -E "s/(^|[[:space:]])$arg([[:space:]]|$)/ /")" + else + args="$(echo $args | sed -E "s/(^|[[:space:]])$arg(([[:space:]]|$)|([=][^ ]*([$]*)))/ /g")" + fi done for arg in ${add_args[*]}; do - if [[ $arg = *"="* ]]; then - value=${arg##*=} - key=${arg%%=$value} - exist=$(echo $args | grep "${key}=") - if [[ -n $exist ]]; then - args="$(echo $args | sed -e "s,$key=[^ ]*,$key=$value,")" - else - args="$args $key=$value" - fi - else - exist=$(echo $args | grep $arg) - if ! [[ -n $exist ]]; then - args="$args $arg" - fi - fi + arg="${arg%%=*}" + arg="$(echo $arg | sed -e 's/\//\\\//g')" + args="$(echo $args | sed -E "s/(^|[[:space:]])$arg(([[:space:]]|$)|([=][^ ]*([$]*)))/ /g")" + done + + for arg in ${add_args[*]}; do + args="$args $arg" done echo ${args} } update_bls_fragment() { + local param="$1" local indexes=($(param_to_indexes "$1")) && shift local remove_args=$1 && shift local add_args=$1 && shift local initrd=$1 && shift + local opts + + if [[ $indexes = "-1" ]]; then + print_error "The param $(get_prefix)${param} is incorrect" + fi + + if [[ $param = "ALL" && $bootloader = grub2 ]] && [[ -n $remove_args || -n $add_args ]]; then + local old_args="" + + if [[ -z $no_etc_update ]] && [[ -e ${grub_etc_default} ]]; then + old_args="$(source ${grub_etc_default}; echo ${GRUB_CMDLINE_LINUX})" + if [[ -n $old_args ]]; then + opts="$(update_args "${old_args}" "${remove_args}" "${add_args}")" + opts="$(echo "$opts" | sed -e 's/\//\\\//g')" + sed -i -e "s/^GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX=\\\"${opts}\\\"/" "${grub_etc_default}" + fi + fi + + old_args="$(grub2-editenv "${env}" list | grep kernelopts | sed -e "s/kernelopts=//")" + if [[ -n $old_args ]]; then + opts="$(update_args "${old_args}" "${remove_args}" "${add_args}")" + grub2-editenv "${env}" set kernelopts="${opts}" + fi + elif [[ $bootloader = grub2 ]]; then + opts="$(grub2-editenv "${env}" list | grep kernelopts | sed -e "s/kernelopts=//")" + fi for i in ${indexes[*]}; do if [[ -n $remove_args || -n $add_args ]]; then - local new_args="$(update_args "${bls_options[$i]}" "${remove_args}" "${add_args}")" - set_bls_value "${bls_file[$i]}" "options" "${new_args}" + local old_args="$(get_bls_args "$i")" + local new_args="$(update_args "${old_args}" "${remove_args}" "${add_args}")" + + if [[ $param != "ALL" || "$(has_kernelopts "$i")" = "false" ]]; then + set_bls_value "${bls_file[$i]}" "options" "${new_args}" + fi fi if [[ -n $initrd ]]; then set_bls_value "${bls_file[$i]}" "initrd" "${initrd}" fi done + + if [[ $param = "ALL" ]] && [[ -n $remove_args || -n $add_args ]]; then + if [[ ! -f /etc/kernel/cmdline ]]; then + # anaconda could pre-populate this file, but until then, most of + # the time we'll just want the most recent one. This is pretty + # close to the current almost-correct behavior of falling back to + # /proc/cmdline anyhow. + echo "$(get_bls_args -1)" > /etc/kernel/cmdline + fi + + read old_args < /etc/kernel/cmdline + local new_args="$(update_args "${old_args}" "${remove_args}" "${add_args}")" + echo "$new_args" > /etc/kernel/cmdline + fi + + update_grubcfg } set_default_bls() { local index=($(param_to_indexes "$1")) + if [[ $index = "-1" ]]; then + print_error "The param $1 is incorrect" + fi + if [[ $bootloader = grub2 ]]; then - grub2-editenv "${env}" set saved_entry="${bls_title[$index]}" + grub2-editenv "${env}" set saved_entry="${bls_id[$index]}" else - local default="${bls_version[$index]}" + local default="${bls_title[$index]}" local current="$(grep '^default=' ${zipl_config} | sed -e 's/^default=//')" if [[ -n $current ]]; then sed -i -e "s,^default=.*,default=${default}," "${zipl_config}" @@ -373,27 +567,61 @@ set_default_bls() { echo "default=${default}" >> "${zipl_config}" fi fi + update_grubcfg + print_info "The default is ${bls_file[$index]} with index $index and kernel $(get_prefix)${bls_linux[$index]}" } remove_var_prefix() { + local prefix="$1" + + [ -z "${prefix}" ] && return + if [[ -n $remove_kernel && $remove_kernel =~ ^/ ]]; then - remove_kernel="/${remove_kernel##*/}" + remove_kernel="/${remove_kernel##${prefix}/}" fi if [[ -n $initrd ]]; then - initrd="/${initrd##*/}" + initrd="/${initrd##${prefix}/}" fi if [[ -n $extra_initrd ]]; then - extra_initrd=" /${extra_initrd##*/}" + extra_initrd="/${extra_initrd##${prefix}/}" fi if [[ -n $kernel ]]; then - kernel="/${kernel##*/}" + kernel="/${kernel##${prefix}/}" fi if [[ -n $update_kernel && $update_kernel =~ ^/ ]]; then - update_kernel="/${update_kernel##*/}" + update_kernel="/${update_kernel##${prefix}/}" + fi +} + +update_grubcfg() +{ + # Turn on RUN_MKCONFIG on different archs/scenarios + if [[ "${arch}" = 's390' ]] || [[ "${arch}" = 's390x' ]]; then + # On s390/s390x systems, run mkconfig/zipl + RUN_MKCONFIG="true" + elif [[ "${arch}" = "ppc64le" ]] && [[ -d /sys/firmware/opal ]]; then + # Older ppc64le OPAL firmware don't have BLS support so grub2-mkconfig has to be run + # to generate a config with menuentry commands. + RUN_MKCONFIG="true" + elif [[ -e /sys/hypervisor/type ]] && grep -q "^xen$" /sys/hypervisor/type; then + if [ ! -e /sys/hypervisor/guest_type ] || ! grep -q "^HVM$" /sys/hypervisor/guest_type; then + # PV and PVH Xen DomU guests boot with pygrub that doesn't have BLS support, + # also Xen Dom0 use the menuentries from 20_linux_xen and not the ones from + # 10_linux. So grub2-mkconfig has to run for both Xen Dom0 and DomU. + RUN_MKCONFIG=true + fi + fi + + if [[ $RUN_MKCONFIG = "true" ]]; then + if [[ $bootloader = "zipl" ]]; then + zipl + else + grub2-mkconfig --no-grubenv-update -o "${grub_config}" &> /dev/null + fi fi } @@ -402,7 +630,7 @@ print_usage() cat <>/dev/stderr -exit 1 diff --git a/grubby.spec b/grubby.spec index d40677c..87b8787 100644 --- a/grubby.spec +++ b/grubby.spec @@ -1,120 +1,393 @@ +# What? No. +%define __brp_mangle_shebangs %{nil} + Name: grubby Version: 8.40 -Release: 16%{?dist} +Release: 86%{?dist} Summary: Command line tool for updating bootloader configs -License: GPLv2+ -URL: https://github.com/rhinstaller/grubby -# we only pull git snaps at the moment -# git clone git@github.com:rhinstaller/grubby.git -# git archive --format=tar --prefix=grubby-%%{version}/ HEAD |bzip2 > grubby-%%{version}.tar.bz2 -# Source0: %%{name}-%%{version}.tar.bz2 -Source0: https://github.com/rhboot/grubby/archive/%{version}-1.tar.gz +License: GPL-2.0-or-later Source1: grubby-bls -Source2: grubby.in -Source3: installkernel.in -Patch1: drop-uboot-uImage-creation.patch -Patch2: 0001-Change-return-type-in-getRootSpecifier.patch -Patch3: 0002-Add-btrfs-subvolume-support-for-grub2.patch -Patch4: 0003-Add-tests-for-btrfs-support.patch -Patch5: 0004-Honor-sbindir.patch -Patch6: 0005-installkernel-use-kernel-install.patch +# Source2: rpm-sort.c +Source3: COPYING +Source5: 95-kernel-hooks.install +Source6: 10-devicetree.install +Source7: grubby.8 +Source8: kernel.sysconfig -BuildRequires: pkgconfig glib2-devel popt-devel -BuildRequires: libblkid-devel git-core sed gcc make -# for make test / getopt: -BuildRequires: util-linux-ng -%ifarch aarch64 i686 x86_64 %{power64} +BuildRequires: gcc +BuildRequires: glib2-devel +BuildRequires: libblkid-devel +BuildRequires: make +BuildRequires: pkgconfig +BuildRequires: popt-devel +BuildRequires: rpm-devel +BuildRequires: sed +%ifarch aarch64 x86_64 %{power64} riscv64 BuildRequires: grub2-tools-minimal Requires: grub2-tools-minimal Requires: grub2-tools %endif %ifarch s390 s390x -Requires: s390utils-base +Requires: s390utils-core %endif +Requires: findutils +Requires: util-linux + +ExcludeArch: %{ix86} +Conflicts: uboot-tools < 2021.01-0.1.rc2 +Obsoletes: %{name}-bls < %{version}-%{release} +Obsoletes: %{name}-deprecated < %{version}-%{release} %description -grubby is a command line tool for updating and displaying information about -the configuration files for the grub, lilo, elilo (ia64), yaboot (powerpc) -and zipl (s390) boot loaders. It is primarily designed to be used from scripts -which install new kernels and need to find information about the current boot -environment. - -%global debug_package %{nil} +This package provides a grubby compatibility script that manages +BootLoaderSpec files and is meant to be backward compatible with +the previous grubby tool. %prep -%setup -q -n grubby-%{version}-1 - -git init -git config user.email "noone@example.com" -git config user.name "no one" -git add . -git commit -a -q -m "%{version} baseline" -git am %{patches} %{buildroot}%{_sbindir}/grubby -sed -e "s,@@LIBEXECDIR@@,%{_libexecdir}/installkernel,g" %{SOURCE3} \ - > %{buildroot}%{_sbindir}/installkernel +install -D -m 0755 -t %{buildroot}%{_prefix}/lib/kernel/install.d/ %{SOURCE5} +install -D -m 0755 -t %{buildroot}%{_prefix}/lib/kernel/install.d/ %{SOURCE6} -%package bls -Summary: Command line tool for updating BootLoaderSpec files -Conflicts: %{name} <= 8.40-13 -BuildArch: noarch +mkdir -p %{buildroot}%{_mandir}/man8 +install -m 0644 %{SOURCE7} %{buildroot}%{_mandir}/man8/ -%description bls -This package provides a grubby wrapper that manages BootLoaderSpec files and is -meant to only be used for legacy compatibility users with existing grubby users. +mkdir -p %{buildroot}%{_sysconfdir}/sysconfig +install -m 0644 %{SOURCE8} %{buildroot}%{_sysconfdir}/sysconfig/kernel + +%post +if [ "$1" = 2 ]; then + arch=$(uname -m) + [[ $arch == "s390x" ]] && \ + zipl-switch-to-blscfg --backup-suffix=.rpmsave &>/dev/null || : +fi %files -%{!?_licensedir:%global license %%doc} %license COPYING -%dir %{_libexecdir}/grubby -%attr(0755,root,root) %{_libexecdir}/grubby/grubby -%dir %{_libexecdir}/installkernel -%attr(0755,root,root) %{_libexecdir}/installkernel/installkernel %attr(0755,root,root) %{_sbindir}/grubby -%attr(0755,root,root) %{_sbindir}/installkernel -%attr(0755,root,root) %{_sbindir}/new-kernel-pkg -%{_mandir}/man8/*.8* - -%files bls -%{!?_licensedir:%global license %%doc} -%license COPYING -%dir %{_libexecdir}/grubby -%attr(0755,root,root) %{_libexecdir}/grubby/grubby-bls -%attr(0755,root,root) %{_sbindir}/grubby -%{_mandir}/man8/*.8* +%attr(0755,root,root) %{_prefix}/lib/kernel/install.d/10-devicetree.install +%attr(0755,root,root) %{_prefix}/lib/kernel/install.d/95-kernel-hooks.install +%{_mandir}/man8/grubby.8* +%config(noreplace) %{_sysconfdir}/sysconfig/kernel %changelog -* Fri Aug 03 2018 Javier Martinez Canillas - 8.40-16 +* Wed Dec 10 2025 Simon de Vlieger - 8.40-86 +- Own `/etc/sysconfig/kernel` which is used for `grubby` configuration + +* Wed Jul 30 2025 Leo Sandoval - 8.40-85 +- Update cfg when setting a default kernel + +* Thu Jul 24 2025 Fedora Release Engineering - 8.40-84 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + +* Thu Mar 20 2025 Leo Sandoval - 8.40-83 +- grubby-bls: in s390* systems, run zipl on grub cfg update event + Fixes previous commit and formats better the conditions that trigger grub cfg updates + +* Fri Jan 17 2025 Fedora Release Engineering - 8.40-82 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + +* Mon Jan 06 2025 Nicolas Frayer - 8.40-81 +- Fixups to custom kernel targets + +* Fri Dec 06 2024 Leo Sandoval - 8.40-80 +- grubby-bls: on PPC systems, remove petiboot's version checks + +* Fri Dec 06 2024 Leo Sandoval - 8.40-79 +- grubby-bls: in s390* systems, run zipl on grub cfg update event + +* Mon Dec 02 2024 David Abdurachmanov - 8.40-78 +- Add riscv64 support + +* Mon Nov 25 2024 Leo Sandoval - 8.40-77 +- On grub cfg updates, run grub2-mkconfig for Xen systems + +* Thu Jul 18 2024 Fedora Release Engineering - 8.40-76 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + +* Wed Jan 24 2024 Fedora Release Engineering - 8.40-75 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Sat Jan 20 2024 Fedora Release Engineering - 8.40-74 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Wed Jan 10 2024 Marta Lewandowska - 8.40-73 +- Do not overwrite all vars that start with GRUB_CMDLINE_LINUX + +* Mon Sep 11 2023 Zbigniew Jedrzejewski-Szmek - 8.40-72 +- Drop installkernel so that it can be provided by systemd + +* Thu Jul 20 2023 Fedora Release Engineering - 8.40-71 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Tue Feb 21 2023 Marta Lewandowska - 8.40-70 +- remove root= when not copying default + +* Thu Jan 19 2023 Fedora Release Engineering - 8.40-69 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Tue Nov 01 2022 Robbie Harwood - 8.40-68 +- Drop custom rpm-sort +- See-also: https://github.com/rpm-software-management/rpm/pull/2249 + +* Tue Oct 04 2022 Robbie Harwood - 8.40-67 +- Apply Marta's copy-default args fix + +* Mon Aug 22 2022 Robbie Harwood - 8.40-66 +- Give up and just pull the config from BLS +- Suggested-by: Bojan Smojver + +* Wed Aug 17 2022 Robbie Harwood - 8.40-65 +- Mark package as obsoleting -deprecated +- Resolves: #2117817 + +* Tue Aug 02 2022 Robbie Harwood - 8.40-64 +- Handle updating /etc/kernel/cmdline + +* Thu Jul 21 2022 Fedora Release Engineering - 8.40-63 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Tue Jul 19 2022 Robbie Harwood - 8.40-62 +- Clarify that grub files aren't used on s390x in man page + +* Wed Jun 22 2022 Robbie Harwood - 8.40-61 +- Revert previous change + +* Tue May 31 2022 Robbie Harwood - 8.40-60 +- Additionally write to /etc/kernel/cmdline + +* Wed Apr 27 2022 Robbie Harwood - 8.40-59 +- Remove upstream and layers of indirection around -bls + +* Thu Mar 10 2022 Robbie Harwood - 8.40-58 +- Remove grubby-deprecated + +* Mon Feb 07 2022 Robbie Harwood - 8.40-57 +- grubby-bls: wire up -h (help) + +* Thu Jan 20 2022 Fedora Release Engineering - 8.40-56 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Thu Jul 22 2021 Fedora Release Engineering - 8.40-55 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Wed Jun 23 2021 Javier Martinez Canillas - 8.40-54 +- Clarify package description + Resolves: rhbz#1913299 +- Update man page to not mention the GRUB config in the ESP anymore + Resolves: rhbz#1958458 + +* Wed Jun 09 2021 Javier Martinez Canillas - 8.40-53 +- grubby-bls: expand only the kernelopts variable + +* Mon Apr 26 2021 Javier Martinez Canillas - 8.40-52 +- grubby-bs: Fix changing kernel cmdline params not working on ppc64le + +* Tue Jan 26 2021 Fedora Release Engineering - 8.40-51 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Wed Dec 30 2020 Tom Stellard - 8.40-50 +- Use make_build macro instead of plain make +- https://docs.fedoraproject.org/en-US/packaging-guidelines/#_parallel_make + +* Fri Nov 20 2020 Peter Robinson - 8.40-49 +- Add device tree kernel install option + +* Mon Oct 26 2020 Josh Boyer - 8.40-48 +- Only require s390utils-core, not s390utils-base + +* Tue Jul 28 2020 Fedora Release Engineering - 8.40-47 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Fri Jun 26 2020 Javier Martinez Canillas - 8.40-46 +- fix build with rpm-4.16 +- grubby-bls: fix --extra-initrd option not adding the correct path + +* Wed May 13 2020 Javier Martinez Canillas - 8.40-45 +- grubby-bls: don't replace options with kernelopts if values are the same + +* Wed May 06 2020 Javier Martinez Canillas - 8.40-44 +- Fix installed man page file mode bits + +* Tue May 05 2020 Javier Martinez Canillas - 8.40-43 +- grubby-bls: always escape the delimiter character used in sed commands +- grubby-bls: add a --no-etc-grub-update option + +* Wed Apr 29 2020 Javier Martinez Canillas - 8.40-42 +- grubby-bls: fix corner case when a kernel param value contains a '=' +- grubby-bls: update man page to match options in current wrapper script + +* Mon Mar 30 2020 Javier Martinez Canillas - 8.40-41 +- Make grubby to also update GRUB_CMDLINE_LINUX in /etc/default/grub + Related: rhbz#1287854 + +* Mon Feb 10 2020 Javier Martinez Canillas - 8.40-40 +- Fix FTBFS + Resolves: rhbz#1799496 +- Fix wrong S-o-B tag in patch +- Fix warning about using unversioned Obsoletes + +* Wed Jan 29 2020 Fedora Release Engineering - 8.40-39 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Fri Nov 29 2019 Javier Martinez Canillas - 8.40-38 +- grubby-bls: don't update grubenv when generating grub.cfg for ppc64le + Related: rhbz#1726514 + +* Thu Nov 28 2019 Javier Martinez Canillas - 8.40-37 +- grubby-bls: don't print rpm-sort error messages + Resolves: rhbz#1731924 +- grubby-bls: remove -o option and support -c for ppc64le grub config + Resolves: rhbz#1758598 +- grubby-bls: fix logic to check if the kernelopts var is defined in a BLS + Resolves: rhbz#1726514 + +* Tue Aug 06 2019 Yuval Turgeman - 8.40-36 +- grubby-bls: strip only /boot from paths + +* Thu Jul 25 2019 Fedora Release Engineering - 8.40-35 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Mon Jun 17 2019 Javier Martinez Canillas - 8.40-34 +- Add a kernel-install plugin to execute hook scripts in /etc/kernel/ + Resolves: rhbz#1696202 + +* Mon Jun 10 22:13:19 CET 2019 Igor Gnatenko - 8.40-33 +- Rebuild for RPM 4.15 + +* Mon Jun 10 15:42:02 CET 2019 Igor Gnatenko - 8.40-32 +- Rebuild for RPM 4.15 + +* Fri May 03 2019 Javier Martinez Canillas - 8.40-31 +- Use mountpoint command to check whether /boot is a mount point + Resolves: rhbz#1706091 + +* Thu Mar 21 2019 Javier Martinez Canillas - 8.40-30 +- grubby-bls: fix --add-kernel not working when using the --args option + Resolves: rhbz#1691004 + +* Mon Mar 11 2019 Javier Martinez Canillas - 8.40-29 +- Only switch to BLS config for s390x / zipl + Related: rhbz#1652806 + +* Fri Mar 01 2019 Javier Martinez Canillas - 8.40-28 +- grubby-bls: make --update-kernel ALL to update kernelopts var in grubenv + +* Thu Feb 14 2019 Javier Martinez Canillas - 8.40-27 +- grubby-bls: error if args or remove-args is used without update-kernel + +* Tue Feb 05 2019 Javier Martinez Canillas - 8.40-26 +- Fix GCC warnings about possible string truncations and buffer overflows +- grubby-bls: unset default entry if is the one being removed +- grubby-bls: show absolute path when printing error about incorrect param + +* Fri Feb 01 2019 Fedora Release Engineering - 8.40-25 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Mon Jan 14 2019 Javier Martinez Canillas - 8.40-24 +- Correctly set LDFLAGS to include hardened flags (pjones) + Related: rhbz#1654936 +- grubby-bls: expand all variables in options field when updating it + Resolves: rhbz#1660700 + +* Tue Dec 11 2018 Javier Martinez Canillas - 8.40-23 +- grubby-bls: lookup default entry by either id or title on grub2 + Related: rhbz#1654936 + +* Fri Nov 30 2018 Javier Martinez Canillas - 8.40-22 +- grubby-bls: also print the absolute path in the --default-kernel option + Resolves: rhbz#1649778 +- grubby-bls: allow to specify the same kernel param multiple times + Resolves: rhbz#1652486 +- grubby-bls: expand kernel options if these are environment variables + Resolves: rhbz#1649785 +- grubby-bls: always generate the BLS snippets when adding new entries + Resolves: rhbz#1653365 +- Improve man page for --info option (jstodola) + Resolves: rhbz#1651672 +- Make the old grubby take precedence over grubby-bls if is installed + Related: rhbz#165484 + +* Wed Nov 21 2018 Javier Martinez Canillas - 8.40-21 +- installkernel-bls: remove unnecessary check for GRUB_ENABLE_BLSCFG=true + Resolves: rhbz#1647721 +- grubby-bls: use title field instead of version for zipl default entry + Related: rhbz#1645200 +- grubby-bls: print the absolute kernel and initramfs images paths + Resolves: rhbz#1649778 +- grubby-bls: make info print the root parameter if is present in cmdline + Resolves: rhbz#1649791 + +* Tue Nov 13 2018 Javier Martinez Canillas - 8.40-20 +- Switch to a BLS configuration on %%post + +* Tue Nov 06 2018 Javier Martinez Canillas - 8.40-19 +- Make the temporary config wrapper be what "grubby" contains, and put + traditional grubby in grubby-deprecated (pjones) +- Re-enable debuginfo generation (pjones) + Related: rhbz#1619344 +- Install installkernel-bls here as well, not just in the grub2 package, + since s390x doesn't have grubby packages (pjones) + Related: rhbz#1619344 +- Make grubby-bls execute grub2-mkconfig on ppc64 + Resolves: rhbz#1636039 +- grubby-bls should only check if kernel exists and not if was installed + Resolves: rhbz#1634740 +- Use ! instead of , as sed delimiter in grubby-bls script + Resolves: rhbz#1634744 +- Print information about the entry set as default + Resolves: rhbz#1636180 +- grubby-bls: make "id" be the filename, and include it in --info=ALL (pjones) + Related: rhbz#1638103 +- grubby-bls: Make grubby-bls sort everything the same way grub2 does (pjones) + Resolves: rhbz#1638103 +- grubby-bls: Consistently use the filename as the bls id + Related: rhbz#1638103 +- grubby-bls: check if entry exists before attempting to print its info + Resolves: rhbz#1634712 +- grubby-bls: make a copy of the cmdline if is modified for an entry + Resolves: rhbz#1629054 +- grubby-bls: escape delimiter character before replacing the options field + Resolves: rhbz#1640017 +- grubby-bls: grubby-bls: use id instead of title to get the default entry + Resolves: rhbz#1638103 +- grubby-bls: use ~debug instead of -debug as suffix to sort correctly + Related: rhbz#1638103 +- grubby-bls: allow to add many BLS entries for the same kernel image + Resolves: rhbz#1634752 +- grubby-bls: fix --default-* options for s390x + Resolves: rhbz#1644608 +- grubby-bls: only compare using relative paths if /boot is a mount point + Resolves: rhbz#1642078 + +* Fri Aug 10 2018 Javier Martinez Canillas - 8.40-18 - Make installkernel to use kernel-install scripts on BLS configuration -* Tue Jul 24 2018 Javier Martinez Canillas - 8.40-15 +* Tue Jul 24 2018 Javier Martinez Canillas - 8.40-17 - Fix grubby wrapper paths + Resolves: rhbz#1607981 -* Tue Jul 24 2018 Peter Jones - 8.40-14 +* Tue Jul 24 2018 Peter Jones - 8.40-16 - Fix permissions on /usr/sbin/grubby -* Fri Jul 13 2018 Javier Martinez Canillas - 8.40-13 +* Fri Jul 13 2018 Javier Martinez Canillas - 8.40-15 - Add a grubby-bls package that conflicts with grubby +* Fri Jul 13 2018 Fedora Release Engineering - 8.40-14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Thu Jun 14 2018 Peter Jones - 8.40-13 +- Use standard Fedora linker flags (rhbz#1543502) (rdossant) +- Switch zipl config to BLS configuration on %%postun for s390x (javierm) + * Tue Apr 10 2018 Javier Martinez Canillas - 8.40-12 - Use .rpmsave as backup suffix when switching to BLS configuration @@ -370,16 +643,16 @@ meant to only be used for legacy compatibility users with existing grubby users. * Thu Dec 08 2011 Adam Williamson - 8.4-1 - Update to 8.4: - + fix Loading... line for updated kernels - + Add new '--default-title' feature - + Add new '--default-index' feature - + add feature for testing the output of a grubby command - + Fix detection when comparing stage1 to MBR - + do not link against glib-2.0 - + Don't crash if grubConfig not found - + Adding extlinux support for new-kernel-pkg - + Look for Debian / Ubuntu grub config files (#703260) - + Make grubby recognize Ubuntu's spin of Grub2 (#703260) + + fix Loading... line for updated kernels + + Add new '--default-title' feature + + Add new '--default-index' feature + + add feature for testing the output of a grubby command + + Fix detection when comparing stage1 to MBR + + do not link against glib-2.0 + + Don't crash if grubConfig not found + + Adding extlinux support for new-kernel-pkg + + Look for Debian / Ubuntu grub config files (#703260) + + Make grubby recognize Ubuntu's spin of Grub2 (#703260) * Thu Sep 29 2011 Peter Jones - 8.3-1 - Fix new-kernel-pkg invocation of grubby for grub (patch from Mads Kiilerich) diff --git a/installkernel.in b/installkernel.in deleted file mode 100644 index 87b81ee..0000000 --- a/installkernel.in +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -if [[ -x @@LIBEXECDIR@@/installkernel ]] ; then - exec @@LIBEXECDIR@@/installkernel "${@}" -elif [[ -x @@LIBEXECDIR@@/installkernel-bls ]] ; then - exec @@LIBEXECDIR@@/installkernel-bls "${@}" -fi -echo "installkernel is not installed correctly." >>/dev/stderr -exit 1 diff --git a/kernel.sysconfig b/kernel.sysconfig new file mode 100644 index 0000000..8da1970 --- /dev/null +++ b/kernel.sysconfig @@ -0,0 +1,6 @@ +# UPDATEDEFAULT specifies if kernel-install should make +# new kernels the default +UPDATEDEFAULT=yes + +# DEFAULTKERNEL specifies the default kernel package type +DEFAULTKERNEL=kernel-core diff --git a/sources b/sources deleted file mode 100644 index 0f5ce7f..0000000 --- a/sources +++ /dev/null @@ -1 +0,0 @@ -SHA512 (8.40-1.tar.gz) = 956ea6ccec2e7285fc8ebbf1d7659c4f41b1e9eda913d99a9712af9103144a13e66e93dce4c089b64ab370d1fed63656e922eafb88a0a39f843a6a6d166f72c5