import grubby-8.40-49.el8

c8-beta imports/c8-beta/grubby-8.40-49.el8
MSVSphere Packaging Team 9 months ago
commit db9dcccb9e

1
.gitignore vendored

@ -0,0 +1 @@
SOURCES/8.40-1.tar.gz

@ -0,0 +1 @@
97ae8d113b74538c05f05083dcff4f44012fd0cd SOURCES/8.40-1.tar.gz

@ -0,0 +1,30 @@
From b5c0a31ae38c2c42f0dea8c2d7282694f020e976 Mon Sep 17 00:00:00 2001
From: "Brian C. Lane" <bcl@redhat.com>
Date: Mon, 13 Apr 2015 13:57:33 -0700
Subject: [PATCH 01/55] Set envFile from --env when bootloader is not specified
---
grubby.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/grubby.c b/grubby.c
index d4ebb86168d..53fe9250e27 100644
--- a/grubby.c
+++ b/grubby.c
@@ -4423,9 +4423,11 @@ int main(int argc, const char ** argv) {
}
if (!cfi) {
- if (grub2FindConfig(&grub2ConfigType))
+ if (grub2FindConfig(&grub2ConfigType)) {
cfi = &grub2ConfigType;
- else
+ if (envPath)
+ cfi->envFile = envPath;
+ } else
#ifdef __ia64__
cfi = &eliloConfigType;
#elif __powerpc__
--
2.17.1

@ -0,0 +1,91 @@
From 9c9587feca7413b34498064db19d796e1c402b51 Mon Sep 17 00:00:00 2001
From: Alexander Todorov <atodorov@redhat.com>
Date: Thu, 11 Jun 2015 08:45:37 -0400
Subject: [PATCH 02/55] add README with description of the test suite
---
README.rst | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 72 insertions(+)
create mode 100644 README.rst
diff --git a/README.rst b/README.rst
new file mode 100644
index 00000000000..a5743ff2f96
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,72 @@
+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.
+
+
+Testing grubby
+==============
+
+To execute the integrated test suite from inside the source directory run the
+command::
+
+ make test
+
+
+Test Suite Architecture
+------------------------
+
+grubby's test suite is written in Bash. The file `test.sh` contains several
+helper functions and a list of different test scenarios which are exercised
+upon execution. Important functions are:
+
+- oneTest() - test if the configuration generated by the supplied grubby
+ parameters matches a well known configuration file;
+
+- oneDisplayTest() - test grubby features that display some information,
+ checking grubby's output against well known values;
+
+- commandTest() - test if the output of some commands matches the provided
+ text. This function is only used for grub2 testing in a few places.
+
+
+Note: the test suite creates aliases for oneTest() and oneDisplayTest(), which
+are prefixed with the corresponding boot loader name. For example:
+grubTest(). eliloTest(), etc.
+
+The invocation syntax is::
+
+ testFunction config_file results_file --grubby --options
+
+For example the line::
+
+ grubTest grub.1 updargs/g1.1 --update-kernel=DEFAULT --args="root=/dev/hda1"
+
+means execute the command::
+
+ ./grubby --grub --config-file tests/grub.1 --update-kernel=DEFAULT \
+ --args="root=/dev/hda1"
+
+and compare the resulting configuration with the file
+`tests/results/updargs/g1.1`.
+
+
+The line::
+
+ grubDisplayTest grub.1 defaultindex/0 --default-index
+
+means execute::
+
+ ./grubby --grub --config-file tests/grub.1 --default-index
+
+and compare the output with the file `tests/results/defaultindex/0`.
+
+Writing New Test Cases
+----------------------
+
+To write a new test case for grubby you need a config file which matches the
+initial test conditions (either existing one or a new one), provide a
+results file (likely a new one) which contains the expected configuration or
+output and finally add a call to the test function(s) using the desired grubby
+parameters in an appropriate section of `test.sh`.
--
2.17.1

@ -0,0 +1,35 @@
From d4b710802da3d780799f1e01e18b613e77b95bb3 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Wed, 24 Jun 2015 09:20:35 -0400
Subject: [PATCH 03/55] Fix some stray whitespace
Signed-off-by: Peter Jones <pjones@redhat.com>
---
README.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.rst b/README.rst
index a5743ff2f96..754454b7bca 100644
--- a/README.rst
+++ b/README.rst
@@ -42,7 +42,7 @@ The invocation syntax is::
For example the line::
grubTest grub.1 updargs/g1.1 --update-kernel=DEFAULT --args="root=/dev/hda1"
-
+
means execute the command::
./grubby --grub --config-file tests/grub.1 --update-kernel=DEFAULT \
@@ -66,7 +66,7 @@ Writing New Test Cases
----------------------
To write a new test case for grubby you need a config file which matches the
-initial test conditions (either existing one or a new one), provide a
+initial test conditions (either existing one or a new one), provide a
results file (likely a new one) which contains the expected configuration or
output and finally add a call to the test function(s) using the desired grubby
parameters in an appropriate section of `test.sh`.
--
2.17.1

@ -0,0 +1,162 @@
From d58e447819e96d84560b16d7632bb7bdf88cc412 Mon Sep 17 00:00:00 2001
From: Nishanth Aravamudan <nacc@linux.vnet.ibm.com>
Date: Tue, 16 Jun 2015 10:43:21 -0700
Subject: [PATCH 04/55] grubby: properly handle mixed ' and " and nested quotes
The SLES12 grub2.cfg file on ppc64le by default contains a line like:
submenu "Bootable snapshot #$snapshot_num" {
menuentry "If OK, run 'snapper rollback $snapshot_num' reboot." { true; }
}
On any grubby (tested with 8.40) invocation that updates the config
file, the combination of nested quotes and mixed quotes leads to a
generated file content like:
submenu "Bootable snapshot #$snapshot_num" {
menuentry 'If OK, run snapper rollback $snapshot_num' rollback $snapshot_num' and reboot." { true; }
}
which includes both a change from " to ', but also improperly quoted
strings and trailing characters relative to the string. This actually
leads to a failure to boot from the disk by default when using grubby
(e.g., Autotest) on SLES12 ppc64le. Whether SLES12 should be adding an
entry like this by default or not is probably open to debate, but grubby
should be able to hand this input file.
To fix the issue, three changes were necessary:
1) grub2ExtractTitle needs to check that if the second element starts
with a quote, that the matching element found ends with the same
quote-type (' vs. ")
2) lineWrite needs to output the right kind of quote based upon if the
string to be outputted itself contains quotes. This is not currently
possible in the code, because quotes are stripped out normally by
readConfig, but with the change in 3), that only happens now for the
quotes that actually delineate a string.
3) readConfig needs to check that when it is extracting titles and
determining extras, it uses matching quotes.
With these changes, a simple grubby --set-default=SLES12 (for example),
now produces:
submenu "Bootable snapshot #$snapshot_num" {
menuentry "If OK, run 'snapper rollback $snapshot_num' and reboot." { true; }
}
as expected.
Signed-off-by: Nishanth Aravamudan <nacc@linux.vnet.ibm.com>
---
grubby.c | 42 +++++++++++++++++++++++++++++++++---------
1 file changed, 33 insertions(+), 9 deletions(-)
diff --git a/grubby.c b/grubby.c
index 53fe9250e27..440c6277935 100644
--- a/grubby.c
+++ b/grubby.c
@@ -451,6 +451,8 @@ char *grub2ExtractTitle(struct singleLine * line) {
* whose last character is also quote (assuming it's the closing one) */
int resultMaxSize;
char * result;
+ /* need to ensure that ' does not match " as we search */
+ char quote_char = *current;
resultMaxSize = sizeOfSingleLine(line);
result = malloc(resultMaxSize);
@@ -464,7 +466,7 @@ char *grub2ExtractTitle(struct singleLine * line) {
current_indent_len = strlen(current_indent);
strncat(result, current_indent, current_indent_len);
- if (!isquote(current[current_len-1])) {
+ if (current[current_len-1] != quote_char) {
strncat(result, current, current_len);
} else {
strncat(result, current, current_len - 1);
@@ -928,10 +930,23 @@ static int lineWrite(FILE * out, struct singleLine * line,
/* Need to handle this, because we strip the quotes from
* menuentry when read it. */
if (line->type == LT_MENUENTRY && i == 1) {
- if(!isquote(*line->elements[i].item))
- fprintf(out, "\'%s\'", line->elements[i].item);
- else
+ if(!isquote(*line->elements[i].item)) {
+ int substring = 0;
+ /* If the line contains nested quotes, we did not strip
+ * the "interna" quotes and we must use the right quotes
+ * again when writing the updated file. */
+ for (int j = i; j < line->numElements; j++) {
+ if (strchr(line->elements[i].item, '\'') != NULL) {
+ substring = 1;
+ fprintf(out, "\"%s\"", line->elements[i].item);
+ break;
+ }
+ }
+ if (!substring)
+ fprintf(out, "\'%s\'", line->elements[i].item);
+ } else {
fprintf(out, "%s", line->elements[i].item);
+ }
fprintf(out, "%s", line->elements[i].indent);
continue;
@@ -1267,6 +1282,8 @@ static struct grubConfig * readConfig(const char * inName,
len = 0;
char *extras;
char *title;
+ /* initially unseen value */
+ char quote_char = '\0';
for (int i = 1; i < line->numElements; i++) {
len += strlen(line->elements[i].item);
@@ -1283,13 +1300,16 @@ static struct grubConfig * readConfig(const char * inName,
for (int i = 0; i < line->numElements; i++) {
if (!strcmp(line->elements[i].item, "menuentry"))
continue;
- if (isquote(*line->elements[i].item))
+ if (isquote(*line->elements[i].item) && quote_char == '\0') {
+ /* ensure we properly pair off quotes */
+ quote_char = *line->elements[i].item;
title = line->elements[i].item + 1;
- else
+ } else {
title = line->elements[i].item;
+ }
len = strlen(title);
- if (isquote(title[len-1])) {
+ if (title[len-1] == quote_char) {
strncat(buf, title,len-1);
break;
} else {
@@ -1300,6 +1320,7 @@ static struct grubConfig * readConfig(const char * inName,
/* get extras */
int count = 0;
+ quote_char = '\0';
for (int i = 0; i < line->numElements; i++) {
if (count >= 2) {
strcat(extras, line->elements[i].item);
@@ -1310,12 +1331,15 @@ static struct grubConfig * readConfig(const char * inName,
continue;
/* count ' or ", there should be two in menuentry line. */
- if (isquote(*line->elements[i].item))
+ if (isquote(*line->elements[i].item) && quote_char == '\0') {
+ /* ensure we properly pair off quotes */
+ quote_char = *line->elements[i].item;
count++;
+ }
len = strlen(line->elements[i].item);
- if (isquote(line->elements[i].item[len -1]))
+ if (line->elements[i].item[len -1] == quote_char)
count++;
/* ok, we get the final ' or ", others are extras. */
--
2.17.1

@ -0,0 +1,34 @@
From 9659e65a9f7ccc2549b75262a4af50ed99cc4bb9 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Tue, 11 Nov 2014 10:46:08 -0500
Subject: [PATCH 05/55] Don't put spaces in debug entries on zipl platforms.
Because of course zipl can't handle spaces.
Related: rhbz#1152152
Signed-off-by: Peter Jones <pjones@redhat.com>
---
new-kernel-pkg | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/new-kernel-pkg b/new-kernel-pkg
index b634388a83f..1cdbbb99501 100755
--- a/new-kernel-pkg
+++ b/new-kernel-pkg
@@ -140,7 +140,11 @@ rungrubby() {
if [ "$1" == "--debug" ]; then
[ "$MAKEDEBUG" != "yes" ] && return 0
[ -n "$verbose" ] && echo "- First, making a debug entry."
- declare -x debugtitle=" with debugging"
+ if [ $ARCH = 's390' -o $ARCH = 's390x' ]; then
+ declare -x debugtitle="_with_debugging"
+ else
+ declare -x debugtitle=" with debugging"
+ fi
declare -x debugargs="$DEBUGARG"
shift
else
--
2.17.1

@ -0,0 +1,52 @@
From d9600e2dd1b35a6e74494c8c98ba399d06685041 Mon Sep 17 00:00:00 2001
From: Lubomir Rintel <lkundrak@v3.sk>
Date: Thu, 27 Feb 2014 10:35:59 +0100
Subject: [PATCH 06/55] Drop SEGV handler
The generated tracebacks are mostly useless without debuginfo (which is likely
not present if the crash is not anticipated) and prevent ABRT from doing a
better job.
Signed-off-by: Lubomir Rintel <lkundrak@v3.sk>
---
grubby.c | 17 -----------------
1 file changed, 17 deletions(-)
diff --git a/grubby.c b/grubby.c
index 440c6277935..649597ed92b 100644
--- a/grubby.c
+++ b/grubby.c
@@ -4211,21 +4211,6 @@ int addNewKernel(struct grubConfig * config, struct singleEntry * template,
return 0;
}
-static void traceback(int signum)
-{
- void *array[40];
- size_t size;
-
- signal(SIGSEGV, SIG_DFL);
- memset(array, '\0', sizeof (array));
- size = backtrace(array, 40);
-
- fprintf(stderr, "grubby received SIGSEGV! Backtrace (%ld):\n",
- (unsigned long)size);
- backtrace_symbols_fd(array, size, STDERR_FILENO);
- exit(1);
-}
-
int main(int argc, const char ** argv) {
poptContext optCon;
const char * grubConfig = NULL;
@@ -4368,8 +4353,6 @@ int main(int argc, const char ** argv) {
useextlinuxmenu=0;
- signal(SIGSEGV, traceback);
-
int i = 0;
for (int j = 1; j < argc; j++)
i += strlen(argv[j]) + 1;
--
2.17.1

@ -0,0 +1,183 @@
From 1da1f577419e85a4e2d717b73af67b79382ad93e Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Thu, 2 Jul 2015 12:34:30 -0400
Subject: [PATCH 07/55] Add a bunch of tests for various
--default-{kernel,title,index}.
... and fix some failures where we see them.
Related: rhbz#1184014
(though I can't actually replicate his failure.)
Signed-off-by: Peter Jones <pjones@redhat.com>
---
grubby.c | 52 ++++++++++++++++++++-------------
test.sh | 10 +++++++
test/results/defaultkernel/g.1 | 1 +
test/results/defaultkernel/l1.1 | 1 +
test/results/defaultkernel/z.1 | 1 +
test/results/defaulttitle/z.1 | 1 +
6 files changed, 45 insertions(+), 21 deletions(-)
create mode 100644 test/results/defaultkernel/g.1
create mode 100644 test/results/defaultkernel/l1.1
create mode 100644 test/results/defaultkernel/z.1
create mode 100644 test/results/defaulttitle/z.1
diff --git a/grubby.c b/grubby.c
index 649597ed92b..0bb486967bf 100644
--- a/grubby.c
+++ b/grubby.c
@@ -428,7 +428,7 @@ char *grub2ExtractTitle(struct singleLine * line) {
/* bail out if line does not start with menuentry */
if (strcmp(line->elements[0].item, "menuentry"))
- return NULL;
+ return NULL;
i = 1;
current = line->elements[i].item;
@@ -437,10 +437,12 @@ char *grub2ExtractTitle(struct singleLine * line) {
/* if second word is quoted, strip the quotes and return single word */
if (isquote(*current) && isquote(current[current_len - 1])) {
char *tmp;
-
- tmp = strdup(current);
- *(tmp + current_len - 1) = '\0';
- return ++tmp;
+
+ tmp = strdup(current+1);
+ if (!tmp)
+ return NULL;
+ tmp[strlen(tmp)-1] = '\0';
+ return tmp;
}
/* if no quotes, return second word verbatim */
@@ -453,11 +455,11 @@ char *grub2ExtractTitle(struct singleLine * line) {
char * result;
/* need to ensure that ' does not match " as we search */
char quote_char = *current;
-
+
resultMaxSize = sizeOfSingleLine(line);
result = malloc(resultMaxSize);
snprintf(result, resultMaxSize, "%s", ++current);
-
+
i++;
for (; i < line->numElements; ++i) {
current = line->elements[i].item;
@@ -4648,27 +4650,35 @@ int main(int argc, const char ** argv) {
struct singleLine * line;
struct singleEntry * entry;
- if (config->defaultImage == -1) return 0;
+ if (config->defaultImage == -1)
+ return 0;
if (config->defaultImage == DEFAULT_SAVED_GRUB2 &&
cfi->defaultIsSaved)
config->defaultImage = 0;
entry = findEntryByIndex(config, config->defaultImage);
- if (!entry) return 0;
+ if (!entry)
+ return 0;
if (!configureGrub2) {
- line = getLineByType(LT_TITLE, entry->lines);
- if (!line) return 0;
- printf("%s\n", line->elements[1].item);
-
- } else {
- char * title;
-
- dbgPrintf("This is GRUB2, default title is embeded in menuentry\n");
- line = getLineByType(LT_MENUENTRY, entry->lines);
- if (!line) return 0;
- title = grub2ExtractTitle(line);
- if (title)
+ char *title;
+ line = getLineByType(LT_TITLE, entry->lines);
+ if (!line)
+ return 0;
+ title = extractTitle(config, line);
+ if (!title)
+ return 0;
printf("%s\n", title);
+ free(title);
+ } else {
+ char * title;
+
+ dbgPrintf("This is GRUB2, default title is embeded in menuentry\n");
+ line = getLineByType(LT_MENUENTRY, entry->lines);
+ if (!line)
+ return 0;
+ title = grub2ExtractTitle(line);
+ if (title)
+ printf("%s\n", title);
}
return 0;
diff --git a/test.sh b/test.sh
index 6379698c6de..96e0087b1e2 100755
--- a/test.sh
+++ b/test.sh
@@ -298,6 +298,9 @@ grubDisplayTest grub.9 defaulttitle/g.9 --default-title
grubDisplayTest grub.10 defaulttitle/g.10 --default-title
grubDisplayTest grub.11 defaulttitle/g.11 --default-title
+testing="GRUB display default kernel"
+grubDisplayTest grub.1 defaultkernel/g.1 --default-kernel
+
testing="LILO default directive"
liloTest lilo.1 default/l1.1 --set-default=/boot/vmlinuz-2.4.18-4
liloTest lilo.1 default/l1.2 --remove-kernel=/boot/vmlinuz-2.4.18-4smp
@@ -305,10 +308,17 @@ liloTest lilo.1 default/l1.3 --add-kernel /boot/kernel --title label \
--copy-default
liloTest lilo.1 default/l1.4 --add-kernel /boot/kernel --title label \
--copy-default --make-default
+liloDisplayTest lilo.1 defaultkernel/l1.1 --default-kernel
testing="Z/IPL default directive"
ziplTest zipl.1 default/z1.1 --add-kernel /boot/new-kernel --title test
ziplTest zipl.1 default/z1.2 --add-kernel /boot/new-kernel --title test --make-default
+testing="Z/IPL display default index"
+ziplDisplayTest zipl.1 defaultindex/0 --default-index
+testing="Z/IPL display default title"
+ziplDisplayTest zipl.1 defaulttitle/z.1 --default-title
+testing="Z/IPL display default kernel"
+ziplDisplayTest zipl.1 defaultkernel/z.1 --default-kernel
testing="GRUB fallback directive"
grubTest grub.5 fallback/g5.1 --remove-kernel=/boot/vmlinuz-2.4.7-ac3 \
diff --git a/test/results/defaultkernel/g.1 b/test/results/defaultkernel/g.1
new file mode 100644
index 00000000000..2c3ac11ead6
--- /dev/null
+++ b/test/results/defaultkernel/g.1
@@ -0,0 +1 @@
+/boot/vmlinuz-2.4.7-2
diff --git a/test/results/defaultkernel/l1.1 b/test/results/defaultkernel/l1.1
new file mode 100644
index 00000000000..fd22b1be2b9
--- /dev/null
+++ b/test/results/defaultkernel/l1.1
@@ -0,0 +1 @@
+/boot/vmlinuz-2.4.18-4smp
diff --git a/test/results/defaultkernel/z.1 b/test/results/defaultkernel/z.1
new file mode 100644
index 00000000000..2c62e98d4d9
--- /dev/null
+++ b/test/results/defaultkernel/z.1
@@ -0,0 +1 @@
+/boot/vmlinuz-2.4.9-37
diff --git a/test/results/defaulttitle/z.1 b/test/results/defaulttitle/z.1
new file mode 100644
index 00000000000..a08e1f35eb7
--- /dev/null
+++ b/test/results/defaulttitle/z.1
@@ -0,0 +1 @@
+linux
--
2.17.1

@ -0,0 +1,28 @@
From 5de1b279749f02a126932f9e03ac62706efde699 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Thu, 2 Jul 2015 12:44:51 -0400
Subject: [PATCH 08/55] Emit better systemd debug settings on debug entries.
Resolves: rhbz#1212128
Signed-off-by: Peter Jones <pjones@redhat.com>
---
new-kernel-pkg | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/new-kernel-pkg b/new-kernel-pkg
index 1cdbbb99501..1f6ab39499f 100755
--- a/new-kernel-pkg
+++ b/new-kernel-pkg
@@ -121,7 +121,7 @@ mbkernel="$HYPERVISOR"
mbargs="$HYPERVISOR_ARGS"
adddracutargs=""
addplymouthinitrd=""
-DEBUGARG="systemd.debug"
+DEBUGARG="systemd.log_level=debug systemd.log_target=kmsg"
usage() {
echo "Usage: `basename $0` [-v] [--mkinitrd] [--rminitrd] [--dracut]" >&2
--
2.17.1

@ -0,0 +1,25 @@
From 80e43f6b8c8316075d8f9f6553ad271e168060b1 Mon Sep 17 00:00:00 2001
From: Chris Lumens <clumens@redhat.com>
Date: Wed, 22 Jul 2015 09:13:11 -0400
Subject: [PATCH 09/55] Add a new makefile target that does everything needed
for jenkins.
We should have as much of the logic of how the CI tests are run in source
control as possible, so that's what this target is for. Besides this, jenkins
just runs a "git clean" first.
---
Makefile | 1 +
1 file changed, 1 insertion(+)
diff --git a/Makefile b/Makefile
index ac144046133..ade4421aa25 100644
--- a/Makefile
+++ b/Makefile
@@ -84,3 +84,4 @@ archive:
upload: archive
@scp grubby-$(VERSION).tar.bz2 fedorahosted.org:grubby
+ci: test
--
2.17.1

@ -0,0 +1,41 @@
From ec969de50ea5fa31d98cd00afa6a3f8a43e606a4 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Thu, 2 Jul 2015 14:30:09 -0400
Subject: [PATCH 10/55] Make the grub1 "defaultkernel" test more reliable.
Basically just do it twice with various incarnations of
--boot-filesystem={/,/boot}
Related: rhbz#1184014
Signed-off-by: Peter Jones <pjones@redhat.com>
---
test.sh | 3 ++-
test/results/defaultkernel/g.2 | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 test/results/defaultkernel/g.2
diff --git a/test.sh b/test.sh
index 96e0087b1e2..2985fd62bf9 100755
--- a/test.sh
+++ b/test.sh
@@ -299,7 +299,8 @@ grubDisplayTest grub.10 defaulttitle/g.10 --default-title
grubDisplayTest grub.11 defaulttitle/g.11 --default-title
testing="GRUB display default kernel"
-grubDisplayTest grub.1 defaultkernel/g.1 --default-kernel
+grubDisplayTest grub.1 defaultkernel/g.1 --boot-filesystem=/boot --default-kernel
+grubDisplayTest grub.1 defaultkernel/g.2 --boot-filesystem=/ --default-kernel
testing="LILO default directive"
liloTest lilo.1 default/l1.1 --set-default=/boot/vmlinuz-2.4.18-4
diff --git a/test/results/defaultkernel/g.2 b/test/results/defaultkernel/g.2
new file mode 100644
index 00000000000..d15855e1b57
--- /dev/null
+++ b/test/results/defaultkernel/g.2
@@ -0,0 +1 @@
+/vmlinuz-2.4.7-2
--
2.17.1

@ -0,0 +1,85 @@
From 38d8178482ea7dabf7c4ab8c2973faa2b469e9c7 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Thu, 2 Jul 2015 16:26:59 -0400
Subject: [PATCH 11/55] Don't leak from one extractTitle() call.
Found by coverity.
Signed-off-by: Peter Jones <pjones@redhat.com>
---
grubby.c | 27 +++++++++++++++++----------
1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/grubby.c b/grubby.c
index 0bb486967bf..70477ba14ee 100644
--- a/grubby.c
+++ b/grubby.c
@@ -1510,13 +1510,14 @@ static struct grubConfig * readConfig(const char * inName,
return cfg;
}
-static void writeDefault(FILE * out, char * indent,
+static void writeDefault(FILE * out, char * indent,
char * separator, struct grubConfig * cfg) {
struct singleEntry * entry;
struct singleLine * line;
int i;
- if (!cfg->defaultImage && cfg->flags == GRUB_CONFIG_NO_DEFAULT) return;
+ if (!cfg->defaultImage && cfg->flags == GRUB_CONFIG_NO_DEFAULT)
+ return;
if (cfg->defaultImage == DEFAULT_SAVED)
fprintf(out, "%sdefault%ssaved\n", indent, separator);
@@ -1540,34 +1541,40 @@ static void writeDefault(FILE * out, char * indent,
fprintf(out, "%sset default=\"%d\"\n", indent,
cfg->defaultImage);
} else {
- fprintf(out, "%sdefault%s%d\n", indent, separator,
+ fprintf(out, "%sdefault%s%d\n", indent, separator,
cfg->defaultImage);
}
} else {
int image = cfg->defaultImage;
entry = cfg->entries;
- while (entry && entry->skip) entry = entry->next;
+ while (entry && entry->skip)
+ entry = entry->next;
i = 0;
while (entry && i < image) {
entry = entry->next;
- while (entry && entry->skip) entry = entry->next;
+ while (entry && entry->skip)
+ entry = entry->next;
i++;
}
- if (!entry) return;
+ if (!entry)
+ return;
line = getLineByType(LT_TITLE, entry->lines);
if (line && line->numElements >= 2)
- fprintf(out, "%sdefault%s%s\n", indent, separator,
+ fprintf(out, "%sdefault%s%s\n", indent, separator,
line->elements[1].item);
- else if (line && (line->numElements == 1) &&
+ else if (line && (line->numElements == 1) &&
cfg->cfi->titleBracketed) {
- fprintf(out, "%sdefault%s%s\n", indent, separator,
- extractTitle(cfg, line));
+ char *title = extractTitle(cfg, line);
+ if (title) {
+ fprintf(out, "%sdefault%s%s\n", indent, separator, title);
+ free(title);
+ }
}
}
}
--
2.17.1

@ -0,0 +1,42 @@
From 3a0171fd435765161406238c8df6f66e859ddd93 Mon Sep 17 00:00:00 2001
From: Don Zickus <dzickus@redhat.com>
Date: Wed, 22 Jul 2015 13:58:53 -0400
Subject: [PATCH 12/55] ppc64le sync grub.cfg changes to disk (#1212114)
After installing a new kernel, if a panic is induced, not all the kernel
pieces are on the disk (most importantly the grub.cfg changes). This can
lead to a hung system on a reboot because the older kernel can not be found.
Address this by forcing all the changes (mainly the fs meta data) to disk
before finishing the kernel package installation.
Tested by 'yum install kernel-...; echo c > /proc/sysrq-trigger'.
Before, the machine would panic and on reboot be stuck without a grub.cfg
to read. After, works as expected.
Resolves: rhbz#1212114
---
new-kernel-pkg | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/new-kernel-pkg b/new-kernel-pkg
index 1f6ab39499f..90652da06b7 100755
--- a/new-kernel-pkg
+++ b/new-kernel-pkg
@@ -927,4 +927,12 @@ fi
# if we mounted the U-Boot directory, unmount it.
[ -n "$mounted" ] && umount $ubootDir
+# make sure changes make it to the disk.
+# if /boot is a mountpoint, force the meta data on disk
+# to by-pass writeback delay.
+# PPC64LE-only to deal with Petitboot issues
+if [ "$ARCH" = "ppc64le" ]; then
+ sync && mountpoint -q /boot &&fsfreeze -f /boot && fsfreeze -u /boot
+fi
+
exit 0
--
2.17.1

@ -0,0 +1,38 @@
From 92adaf4e655c3e6833e6f3b96fe1f5b75f75fd64 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Thu, 6 Aug 2015 10:06:13 -0400
Subject: [PATCH 13/55] Make it possible to run "test.sh --verbose" from the
make command line.
Signed-off-by: Peter Jones <pjones@redhat.com>
---
Makefile | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
index ade4421aa25..cc7e823959f 100644
--- a/Makefile
+++ b/Makefile
@@ -26,6 +26,10 @@ CC = gcc
RPM_OPT_FLAGS ?= -O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector
CFLAGS += $(RPM_OPT_FLAGS) -std=gnu99 -Wall -Werror -Wno-error=unused-function -Wno-unused-function -ggdb
LDFLAGS :=
+VERBOSE_TEST :=
+ifneq ($(VERBOSE_TEST),)
+ VERBOSE_TEST="--verbose"
+endif
grubby_LIBS = -lblkid -lpopt
@@ -39,7 +43,7 @@ debug : clean
test: all
@export TOPDIR=$(TOPDIR)
- @./test.sh
+ @./test.sh $(VERBOSE_TEST)
install: all
mkdir -p $(DESTDIR)$(PREFIX)/sbin
--
2.17.1

File diff suppressed because it is too large Load Diff

@ -0,0 +1,586 @@
From 5c8744420dfc891b2422db8f0be4bad2368f9970 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Thu, 6 Aug 2015 10:07:11 -0400
Subject: [PATCH 15/55] Make SET_VARIABLE get handled individually in
GetNextLine()
Resolves: rhbz#1152550
Signed-off-by: Peter Jones <pjones@redhat.com>
---
grubby.c | 119 ++++++++++++++++++++++-----
.gitignore | 2 +
test.sh | 8 ++
test/grub2.16 | 156 +++++++++++++++++++++++++++++++++++
test/results/add/g2-1.16 | 170 +++++++++++++++++++++++++++++++++++++++
5 files changed, 433 insertions(+), 22 deletions(-)
create mode 100644 test/grub2.16
create mode 100644 test/results/add/g2-1.16
diff --git a/grubby.c b/grubby.c
index fe6595b8386..d66c1c5a40a 100644
--- a/grubby.c
+++ b/grubby.c
@@ -75,6 +75,7 @@ struct lineElement {
};
enum lineType_e {
+ LT_UNIDENTIFIED = 0,
LT_WHITESPACE = 1 << 0,
LT_TITLE = 1 << 1,
LT_KERNEL = 1 << 2,
@@ -747,6 +748,33 @@ static char *sdupprintf(const char *format, ...)
return buf;
}
+static inline int
+kwcmp(struct keywordTypes *kw, const char * label, int case_insensitive)
+{
+ int kwl = strlen(kw->key);
+ int ll = strlen(label);
+ int rc;
+ int (*snc)(const char *s1, const char *s2, size_t n) =
+ case_insensitive ? strncasecmp : strncmp;
+ int (*sc)(const char *s1, const char *s2) =
+ case_insensitive ? strcasecmp : strcmp;
+
+ rc = snc(kw->key, label, kwl);
+ if (rc)
+ return rc;
+
+ for (int i = kwl; i < ll; i++) {
+ if (isspace(label[i]))
+ return 0;
+ if (kw->separatorChar && label[i] == kw->separatorChar)
+ return 0;
+ else if (kw->nextChar && label[i] == kw->nextChar)
+ return 0;
+ return sc(kw->key+kwl, label+kwl);
+ }
+ return 0;
+}
+
static enum lineType_e preferredLineType(enum lineType_e type,
struct configFileInfo *cfi)
{
@@ -812,13 +840,8 @@ static enum lineType_e getTypeByKeyword(char *keyword,
struct configFileInfo *cfi)
{
for (struct keywordTypes * kw = cfi->keywords; kw->key; kw++) {
- if (cfi->caseInsensitive) {
- if (!strcasecmp(keyword, kw->key))
- return kw->type;
- } else {
- if (!strcmp(keyword, kw->key))
- return kw->type;
- }
+ if (!kwcmp(kw, keyword, cfi->caseInsensitive))
+ return kw->type;
}
return LT_UNKNOWN;
}
@@ -913,6 +936,7 @@ static int readFile(int fd, char **bufPtr)
static void lineInit(struct singleLine *line)
{
+ line->type = LT_UNIDENTIFIED;
line->indent = NULL;
line->elements = NULL;
line->numElements = 0;
@@ -995,7 +1019,7 @@ static int lineWrite(FILE * out, struct singleLine *line,
if (fprintf(out, "%s", line->elements[i].item) == -1)
return -1;
- if (i < line->numElements - 1)
+ if (i < line->numElements - 1 || line->type == LT_SET_VARIABLE)
if (fprintf(out, "%s", line->elements[i].indent) == -1)
return -1;
}
@@ -1050,6 +1074,8 @@ static int getNextLine(char **bufPtr, struct singleLine *line,
break;
chptr++;
}
+ if (line->type == LT_UNIDENTIFIED)
+ line->type = getTypeByKeyword(start, cfi);
element->item = strndup(start, chptr - start);
start = chptr;
@@ -1115,7 +1141,7 @@ static int getNextLine(char **bufPtr, struct singleLine *line,
line->type = LT_WHITESPACE;
line->numElements = 0;
}
- } else {
+ } else if (line->type == LT_INITRD) {
struct keywordTypes *kw;
kw = getKeywordByType(line->type, cfi);
@@ -1177,6 +1203,39 @@ static int getNextLine(char **bufPtr, struct singleLine *line,
}
}
}
+ } else if (line->type == LT_SET_VARIABLE) {
+ /* and if it's a "set blah=" we need to split it
+ * yet a third way to avoid rhbz# XXX FIXME :/
+ */
+ char *eq;
+ int l;
+ int numElements = line->numElements;
+ struct lineElement *newElements;
+ eq = strchr(line->elements[1].item, '=');
+ if (!eq)
+ return 0;
+ l = eq - line->elements[1].item;
+ if (eq[1] != 0)
+ numElements++;
+ newElements = calloc(numElements,sizeof (*newElements));
+ memcpy(&newElements[0], &line->elements[0],
+ sizeof (newElements[0]));
+ newElements[1].item =
+ strndup(line->elements[1].item, l);
+ newElements[1].indent = "=";
+ *(eq++) = '\0';
+ newElements[2].item = strdup(eq);
+ free(line->elements[1].item);
+ if (line->elements[1].indent)
+ newElements[2].indent = line->elements[1].indent;
+ for (int i = 2; i < line->numElements; i++) {
+ newElements[i+1].item = line->elements[i].item;
+ newElements[i+1].indent =
+ line->elements[i].indent;
+ }
+ free(line->elements);
+ line->elements = newElements;
+ line->numElements = numElements;
}
}
@@ -1282,13 +1341,12 @@ static struct grubConfig *readConfig(const char *inName,
getKeywordByType(LT_DEFAULT, cfi);
if (kwType && line->numElements == 3
&& !strcmp(line->elements[1].item, kwType->key)
- && !is_special_grub2_variable(line->elements[2].
- item)) {
+ && !is_special_grub2_variable(
+ line->elements[2].item)) {
dbgPrintf("Line sets default config\n");
cfg->flags &= ~GRUB_CONFIG_NO_DEFAULT;
defaultLine = line;
}
-
} else if (iskernel(line->type)) {
/* if by some freak chance this is multiboot and the
* "module" lines came earlier in the template, make
@@ -1542,16 +1600,33 @@ static struct grubConfig *readConfig(const char *inName,
}
}
} else if (cfi->defaultIsVariable) {
- char *value = defaultLine->elements[2].item;
- while (*value && (*value == '"' || *value == '\'' ||
- *value == ' ' || *value == '\t'))
- value++;
- cfg->defaultImage = strtol(value, &end, 10);
- while (*end && (*end == '"' || *end == '\'' ||
- *end == ' ' || *end == '\t'))
- end++;
- if (*end)
- cfg->defaultImage = -1;
+ if (defaultLine->numElements == 2) {
+ char *value = defaultLine->elements[1].item + 8;
+ while (*value && (*value == '"' ||
+ *value == '\'' ||
+ *value == ' ' ||
+ *value == '\t'))
+ value++;
+ cfg->defaultImage = strtol(value, &end, 10);
+ while (*end && (*end == '"' || *end == '\'' ||
+ *end == ' ' || *end == '\t'))
+ end++;
+ if (*end)
+ cfg->defaultImage = -1;
+ } else if (defaultLine->numElements == 3) {
+ char *value = defaultLine->elements[2].item;
+ while (*value && (*value == '"' ||
+ *value == '\'' ||
+ *value == ' ' ||
+ *value == '\t'))
+ value++;
+ cfg->defaultImage = strtol(value, &end, 10);
+ while (*end && (*end == '"' || *end == '\'' ||
+ *end == ' ' || *end == '\t'))
+ end++;
+ if (*end)
+ cfg->defaultImage = -1;
+ }
} else if (cfi->defaultSupportSaved &&
!strncmp(defaultLine->elements[1].item, "saved",
5)) {
diff --git a/.gitignore b/.gitignore
index e64d3bc0986..e78a392d601 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
grubby
version.h
*.o
+core.*
+vgcore.*
diff --git a/test.sh b/test.sh
index 2985fd62bf9..cd2d8707b5f 100755
--- a/test.sh
+++ b/test.sh
@@ -543,6 +543,14 @@ if [ "$testgrub2" == "y" ]; then
--copy-default --title "Fedora 21 Rescue" --args=root=/fooooo \
--remove-kernel=wtf --boot-filesystem=/boot/ --efi
+ # a grub2 add with a "set" of the form: set foo="bar=1,2". bz#1152550
+ # has this being emitted as: set foo="bar=1,2"=1,2"
+ # which is wrong.
+ grub2Test grub2.16 add/g2-1.16 \
+ --add-kernel=/boot/vmlinuz-foo \
+ --copy-default --title 'Red Hat Enterprise Linux Server' \
+ --args=root=/dev/mapper/foo--
+
testing="GRUB2 add initrd"
grub2Test grub2.2 add/g2-1.4 --update-kernel=/boot/new-kernel.img \
--initrd=/boot/new-initrd --boot-filesystem=/boot/
diff --git a/test/grub2.16 b/test/grub2.16
new file mode 100644
index 00000000000..136880a61ee
--- /dev/null
+++ b/test/grub2.16
@@ -0,0 +1,156 @@
+#
+# 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
+}
+
+serial --speed=115200
+terminal_input serial console
+terminal_output serial console
+if [ x$feature_timeout_style = xy ] ; then
+ set timeout_style=menu
+ set timeout=5
+# Fallback normal timeout code in case the timeout_style feature is
+# unavailable.
+else
+ set timeout=5
+fi
+### END /etc/grub.d/00_header ###
+
+### BEGIN /etc/grub.d/00_tuned ###
+set tuned_params="isolcpus=1,3"
+### END /etc/grub.d/00_tuned ###
+
+### BEGIN /etc/grub.d/01_users ###
+if [ -f ${prefix}/user.cfg ]; then
+ source ${prefix}/user.cfg
+ if [ -n ${GRUB2_PASSWORD} ]; then
+ set superusers="root"
+ export superusers
+ password_pbkdf2 root ${GRUB2_PASSWORD}
+ fi
+fi
+### END /etc/grub.d/01_users ###
+
+### BEGIN /etc/grub.d/10_linux ###
+menuentry 'Red Hat Enterprise Linux Server (3.10.0-297.el7.x86_64) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-296.el7.x86_64-advanced-ae7b3742-9092-4432-9f7f-8abdbf0dc3db' {
+ load_video
+ set gfxpayload=keep
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' cae02b39-f239-4d26-9032-674d261c93d8
+ else
+ search --no-floppy --fs-uuid --set=root cae02b39-f239-4d26-9032-674d261c93d8
+ fi
+ linux16 /vmlinuz-3.10.0-297.el7.x86_64 root=/dev/mapper/rhel_hp--dl380pgen8--02--vm--10-root ro crashkernel=auto rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/root rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/swap console=ttyS0,115200n81 $tuned_params LANG=en_US.UTF-8
+}
+menuentry 'Red Hat Enterprise Linux Server (3.10.0-296.el7.x86_64) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-296.el7.x86_64-advanced-ae7b3742-9092-4432-9f7f-8abdbf0dc3db' {
+ load_video
+ set gfxpayload=keep
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' cae02b39-f239-4d26-9032-674d261c93d8
+ else
+ search --no-floppy --fs-uuid --set=root cae02b39-f239-4d26-9032-674d261c93d8
+ fi
+ linux16 /vmlinuz-3.10.0-296.el7.x86_64 root=/dev/mapper/rhel_hp--dl380pgen8--02--vm--10-root ro crashkernel=auto rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/root rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/swap console=ttyS0,115200n81 $tuned_params
+ initrd16 /initramfs-3.10.0-296.el7.x86_64.img
+}
+menuentry 'Red Hat Enterprise Linux Server (0-rescue-cc21b92886f9ebbd3ed5a494639b7fd7) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-cc21b92886f9ebbd3ed5a494639b7fd7-advanced-ae7b3742-9092-4432-9f7f-8abdbf0dc3db' {
+ load_video
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' cae02b39-f239-4d26-9032-674d261c93d8
+ else
+ search --no-floppy --fs-uuid --set=root cae02b39-f239-4d26-9032-674d261c93d8
+ fi
+ linux16 /vmlinuz-0-rescue-cc21b92886f9ebbd3ed5a494639b7fd7 root=/dev/mapper/rhel_hp--dl380pgen8--02--vm--10-root ro crashkernel=auto rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/root rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/swap console=ttyS0,115200n81 $tuned_params
+ initrd16 /initramfs-0-rescue-cc21b92886f9ebbd3ed5a494639b7fd7.img
+}
+if [ "x$default" = 'Red Hat Enterprise Linux Server (3.10.0-296.el7.x86_64) 7.2 (Maipo)' ]; then default='Advanced options for Red Hat Enterprise Linux Server>Red Hat Enterprise Linux Server (3.10.0-296.el7.x86_64) 7.2 (Maipo)'; fi;
+### 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.16 b/test/results/add/g2-1.16
new file mode 100644
index 00000000000..fc98757f4fc
--- /dev/null
+++ b/test/results/add/g2-1.16
@@ -0,0 +1,170 @@
+#
+# 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
+}
+
+serial --speed=115200
+terminal_input serial console
+terminal_output serial console
+if [ x$feature_timeout_style = xy ] ; then
+ set timeout_style=menu
+ set timeout=5
+# Fallback normal timeout code in case the timeout_style feature is
+# unavailable.
+else
+ set timeout=5
+fi
+### END /etc/grub.d/00_header ###
+
+### BEGIN /etc/grub.d/00_tuned ###
+set tuned_params="isolcpus=1,3"
+### END /etc/grub.d/00_tuned ###
+
+### BEGIN /etc/grub.d/01_users ###
+if [ -f ${prefix}/user.cfg ]; then
+ source ${prefix}/user.cfg
+ if [ -n ${GRUB2_PASSWORD} ]; then
+ set superusers="root"
+ export superusers
+ password_pbkdf2 root ${GRUB2_PASSWORD}
+ fi
+fi
+### END /etc/grub.d/01_users ###
+
+### BEGIN /etc/grub.d/10_linux ###
+menuentry 'Red Hat Enterprise Linux Server' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-296.el7.x86_64-advanced-ae7b3742-9092-4432-9f7f-8abdbf0dc3db' {
+ load_video
+ set gfxpayload=keep
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' cae02b39-f239-4d26-9032-674d261c93d8
+ else
+ search --no-floppy --fs-uuid --set=root cae02b39-f239-4d26-9032-674d261c93d8
+ fi
+ linux16 /vmlinuz-foo root=/dev/mapper/foo-- ro crashkernel=auto rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/root rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/swap console=ttyS0,115200n81 $tuned_params LANG=en_US.UTF-8
+}
+menuentry 'Red Hat Enterprise Linux Server (3.10.0-297.el7.x86_64) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-296.el7.x86_64-advanced-ae7b3742-9092-4432-9f7f-8abdbf0dc3db' {
+ load_video
+ set gfxpayload=keep
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' cae02b39-f239-4d26-9032-674d261c93d8
+ else
+ search --no-floppy --fs-uuid --set=root cae02b39-f239-4d26-9032-674d261c93d8
+ fi
+ linux16 /vmlinuz-3.10.0-297.el7.x86_64 root=/dev/mapper/rhel_hp--dl380pgen8--02--vm--10-root ro crashkernel=auto rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/root rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/swap console=ttyS0,115200n81 $tuned_params LANG=en_US.UTF-8
+}
+menuentry 'Red Hat Enterprise Linux Server (3.10.0-296.el7.x86_64) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-296.el7.x86_64-advanced-ae7b3742-9092-4432-9f7f-8abdbf0dc3db' {
+ load_video
+ set gfxpayload=keep
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' cae02b39-f239-4d26-9032-674d261c93d8
+ else
+ search --no-floppy --fs-uuid --set=root cae02b39-f239-4d26-9032-674d261c93d8
+ fi
+ linux16 /vmlinuz-3.10.0-296.el7.x86_64 root=/dev/mapper/rhel_hp--dl380pgen8--02--vm--10-root ro crashkernel=auto rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/root rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/swap console=ttyS0,115200n81 $tuned_params
+ initrd16 /initramfs-3.10.0-296.el7.x86_64.img
+}
+menuentry 'Red Hat Enterprise Linux Server (0-rescue-cc21b92886f9ebbd3ed5a494639b7fd7) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-cc21b92886f9ebbd3ed5a494639b7fd7-advanced-ae7b3742-9092-4432-9f7f-8abdbf0dc3db' {
+ load_video
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' cae02b39-f239-4d26-9032-674d261c93d8
+ else
+ search --no-floppy --fs-uuid --set=root cae02b39-f239-4d26-9032-674d261c93d8
+ fi
+ linux16 /vmlinuz-0-rescue-cc21b92886f9ebbd3ed5a494639b7fd7 root=/dev/mapper/rhel_hp--dl380pgen8--02--vm--10-root ro crashkernel=auto rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/root rd.lvm.lv=rhel_hp-dl380pgen8-02-vm-10/swap console=ttyS0,115200n81 $tuned_params
+ initrd16 /initramfs-0-rescue-cc21b92886f9ebbd3ed5a494639b7fd7.img
+}
+if [ "x$default" = 'Red Hat Enterprise Linux Server (3.10.0-296.el7.x86_64) 7.2 (Maipo)' ]; then default='Advanced options for Red Hat Enterprise Linux Server>Red Hat Enterprise Linux Server (3.10.0-296.el7.x86_64) 7.2 (Maipo)'; fi;
+### 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 ###
--
2.17.1

@ -0,0 +1,31 @@
From c014354834f496ade11dda3f6406cbddbee25f75 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Tue, 1 Sep 2015 11:02:07 -0400
Subject: [PATCH 16/55] Specify bootloader directory in the test case for
1152550.
Because otherwise it blows up when built in mock without /boot mounted.
Related: rhbz#1152550
Signed-off-by: Peter Jones <pjones@redhat.com>
---
test.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test.sh b/test.sh
index cd2d8707b5f..ba466a50501 100755
--- a/test.sh
+++ b/test.sh
@@ -547,7 +547,7 @@ if [ "$testgrub2" == "y" ]; then
# has this being emitted as: set foo="bar=1,2"=1,2"
# which is wrong.
grub2Test grub2.16 add/g2-1.16 \
- --add-kernel=/boot/vmlinuz-foo \
+ --boot-filesystem=/boot --add-kernel=/boot/vmlinuz-foo \
--copy-default --title 'Red Hat Enterprise Linux Server' \
--args=root=/dev/mapper/foo--
--
2.17.1

@ -0,0 +1,63 @@
From a8fd0f15979d5f4632c337c8bcfbdbae2b957f67 Mon Sep 17 00:00:00 2001
From: marcosfrm <marcosfrm@users.noreply.github.com>
Date: Tue, 6 Oct 2015 08:29:02 -0300
Subject: [PATCH 17/55] Fix dracut cmdline options and conditionalize them to
--add-dracut-args
By default initramfs generated by dracut is HostOnly and has vconsole.conf and locale.conf included. Instead of killing this import section, conditionalize it to --add-dracut-args.
Reference: http://git.kernel.org/cgit/boot/dracut/dracut.git/tree/modules.d/10i18n/parse-i18n.sh
---
new-kernel-pkg | 35 ++++++++++++++---------------------
1 file changed, 14 insertions(+), 21 deletions(-)
diff --git a/new-kernel-pkg b/new-kernel-pkg
index 90652da06b7..997fb1f4987 100755
--- a/new-kernel-pkg
+++ b/new-kernel-pkg
@@ -825,28 +825,21 @@ if [[ ${ARCH} =~ armv[5|7].*l ]]; then
fi
[ -n "$verbose" ] && echo "devtreedir is $devtreedir"
-# add dracut i18n, keyboard and plymouth kernel args if requested
-if [ -n "$dracut" -o -n "$adddracutargs" ]; then
- if [ -r /etc/vconsole.conf ]; then
- . /etc/vconsole.conf
- elif [ -r /etc/sysconfig/keyboard ]; then
- . /etc/sysconfig/keyboard
- fi
+# add dracut kernel args if requested
+if [ -n "$dracut" -a -n "$adddracutargs" ]; then
+ [ -r /etc/vconsole.conf ] && . /etc/vconsole.conf
+ [ -r /etc/locale.conf ] && . /etc/locale.conf
- if [ -r /etc/locale.conf ]; then
- . /etc/locale.conf
- elif [ -r /etc/sysconfig/i18n ]; then
- . /etc/sysconfig/i18n
- fi
-
- for i in SYSFONT SYSFONTACM UNIMAP LANG KEYTABLE; do
- val=$(eval echo \$$i)
- [ -n "$val" ] && kernargs="$kernargs $i=$val"
- done
-
- if [ -n "$KEYBOARDTYPE" -a "$KEYBOARDTYPE" != "pc" ]; then
- kernargs="$kernargs KEYBOARDTYPE=$KEYBOARDTYPE"
- fi
+ while read opt rd_opt; do
+ [ -n "${!opt}" ] && kernargs="$kernargs $rd_opt=\"${!opt}\""
+ done <<< 'KEYMAP rd.vconsole.keymap
+ FONT rd.vconsole.font
+ FONT_MAP rd.vconsole.font.map
+ FONT_UNIMAP rd.vconsole.font.unimap
+ UNICODE rd.vconsole.font.unicode
+ EXT_KEYMAP rd.vconsole.keymap.ext
+ LANG rd.locale.LANG
+ LC_ALL rd.locale.LC_ALL'
fi
# set this as the default if we have the package and it matches
--
2.17.1

@ -0,0 +1,25 @@
From 7ee039e026fe02e01dd4c7fd2b18682b8737697c Mon Sep 17 00:00:00 2001
From: marcosfrm <marcosfrm@users.noreply.github.com>
Date: Tue, 6 Oct 2015 08:40:44 -0300
Subject: [PATCH 18/55] Add missing space
---
new-kernel-pkg | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/new-kernel-pkg b/new-kernel-pkg
index 997fb1f4987..9f56c470b4a 100755
--- a/new-kernel-pkg
+++ b/new-kernel-pkg
@@ -925,7 +925,7 @@ fi
# to by-pass writeback delay.
# PPC64LE-only to deal with Petitboot issues
if [ "$ARCH" = "ppc64le" ]; then
- sync && mountpoint -q /boot &&fsfreeze -f /boot && fsfreeze -u /boot
+ sync && mountpoint -q /boot && fsfreeze -f /boot && fsfreeze -u /boot
fi
exit 0
--
2.17.1

@ -0,0 +1,123 @@
From ae22f8322d2f2dccd19003fccd390fe19f7126c1 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Mon, 26 Oct 2015 14:22:39 -0400
Subject: [PATCH 19/55] Always do the "rungrubby --debug" after the normal
kernel on install.
This way the during an update, the right kernel is picked as "default"
for the command line arguments.
Related: rhbz#1212128
Signed-off-by: Peter Jones <pjones@redhat.com>
---
new-kernel-pkg | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/new-kernel-pkg b/new-kernel-pkg
index 9f56c470b4a..9574dbbf10b 100755
--- a/new-kernel-pkg
+++ b/new-kernel-pkg
@@ -243,8 +243,8 @@ install() {
--args=\"root=$rootdevice $kernargs \$debugargs\" \
--remove-kernel=\"TITLE=$title\$debugtitle\""
- rungrubby --debug ${ARGS}
rungrubby ${ARGS} $makedefault
+ rungrubby --debug ${ARGS}
else
[ -n "$verbose" ] && echo "$grubConfig does not exist, not running grubby for grub 0.97"
fi
@@ -257,8 +257,8 @@ install() {
${mbargs:+--mbargs=\"$mbargs\"} \
--args=\"root=$rootdevice $kernargs \$debugargs\" \
--remove-kernel=\"TITLE=$title\$debugtitle\""
- rungrubby --debug ${ARGS}
rungrubby ${ARGS} $makedefault
+ rungrubby --debug ${ARGS}
else
[ -n "$verbose" ] && echo "$grub2Config does not exist, not running grubby for grub 2"
fi
@@ -272,8 +272,8 @@ install() {
${mbargs:+--mbargs=\"$mbargs\"} \
--args=\"root=$rootdevice $kernargs \$debugargs\" \
--remove-kernel=\"TITLE=$title\$debugtitle\""
- rungrubby --debug ${ARGS}
rungrubby ${ARGS} $makedefault
+ rungrubby --debug ${ARGS}
else
[ -n "$verbose" ] && echo "$grub2EfiConfig does not exist, not running grubby for grub 2 with UEFI"
fi
@@ -288,8 +288,8 @@ install() {
--args=\"root=$rootdevice $kernargs \$debugargs\" \
--remove-kernel=\"TITLE=$version\""
- rungrubby --debug ${ARGS}
rungrubby ${ARGS} $makedefault
+ rungrubby --debug ${ARGS}
if [ -n "$runLilo" ]; then
[ -n "$verbose" ] && echo "running $lilo"
if [ ! -x $lilo ] ; then
@@ -313,8 +313,8 @@ install() {
--args=\"root=$rootdevice $kernargs \$debugargs\" \
--remove-kernel=\"TITLE=$title\$debugtitle\""
- rungrubby --debug ${ARGS}
rungrubby ${ARGS} $makedefault
+ rungrubby --debug ${ARGS}
else
[ -n "$verbose" ] && echo "$extlinuxConfig does not exist, not running grubby for extlinux"
fi
@@ -480,8 +480,8 @@ update() {
${mbkernel:+--add-multiboot=\"$mbkernel\"} \
--title=\"$title\$debugtitle\""
- rungrubby --debug ${ARGS}
rungrubby ${ARGS}
+ rungrubby --debug ${ARGS}
else
[ -n "$verbose" ] && echo "$grubConfig does not exist, not running grubby"
fi
@@ -493,8 +493,8 @@ update() {
${removeargs:+--remove-args=\"$removeargs\"} \
--title=\"$title\$debugtitle\""
- rungrubby --debug ${ARGS}
rungrubby ${ARGS}
+ rungrubby --debug ${ARGS}
else
[ -n "$verbose" ] && echo "$grub2Config does not exist, not running grubby"
fi
@@ -506,8 +506,8 @@ update() {
${removeargs:+--remove-args=\"$removeargs\"} \
--title=\"$title\$debugtitle\""
- rungrubby --debug ${ARGS}
rungrubby ${ARGS}
+ rungrubby --debug ${ARGS}
else
[ -n "$verbose" ] && echo "$grub2EfiConfig does not exist, not running grubby"
fi
@@ -519,8 +519,8 @@ update() {
${removeargs:+--remove-args=\"$removeargs\"} \
--title=\"$title\$debugtitle\""
- rungrubby --debug ${ARGS}
rungrubby ${ARGS}
+ rungrubby --debug ${ARGS}
if [ -n "$runLilo" ]; then
[ -n "$verbose" ] && echo "running $lilo"
@@ -571,8 +571,8 @@ update() {
${removeargs:+--remove-args=\"$removeargs\"} \
--title=\"$title\$debugtitle\""
- rungrubby --debug ${ARGS}
rungrubby ${ARGS}
+ rungrubby --debug ${ARGS}
else
[ -n "$verbose" ] && echo "$extlinuxConfig does not exist, not running grubby"
fi
--
2.17.1

@ -0,0 +1,298 @@
From 8efba98644f9262d74a42fac7ea39d197192443a Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Wed, 22 Jun 2016 14:07:49 -0400
Subject: [PATCH 20/55] grubby: add --set-index to specify which position to
add new entries as
This adds an option, "--set-index N", to grubby, and will cause creation
of any new entry to be at a particular zero-indexed position in the
resulting configuration file.
Related: rhbz#1285601
Signed-off-by: Peter Jones <pjones@redhat.com>
---
grubby.c | 26 +++++++++++++++++++++-----
.gitignore | 1 +
grubby.8 | 8 ++++++--
test.sh | 14 ++++++++++++++
test/grub.15 | 19 +++++++++++++++++++
test/results/add/g1.10 | 22 ++++++++++++++++++++++
test/results/add/g1.17 | 19 +++++++++++++++++++
test/results/add/g1.8 | 22 ++++++++++++++++++++++
test/results/add/g1.9 | 22 ++++++++++++++++++++++
9 files changed, 146 insertions(+), 7 deletions(-)
create mode 100644 test/grub.15
create mode 100644 test/results/add/g1.10
create mode 100644 test/results/add/g1.17
create mode 100644 test/results/add/g1.8
create mode 100644 test/results/add/g1.9
diff --git a/grubby.c b/grubby.c
index d66c1c5a40a..54625e7da0a 100644
--- a/grubby.c
+++ b/grubby.c
@@ -4207,9 +4207,9 @@ int addNewKernel(struct grubConfig *config, struct singleEntry *template,
const char *newKernelArgs, const char *newKernelInitrd,
const char **extraInitrds, int extraInitrdCount,
const char *newMBKernel, const char *newMBKernelArgs,
- const char *newDevTreePath)
+ const char *newDevTreePath, int newIndex)
{
- struct singleEntry *new;
+ struct singleEntry *new, *entry, *prev = NULL;
struct singleLine *newLine = NULL, *tmplLine = NULL, *masterLine = NULL;
int needs;
char *chptr;
@@ -4239,9 +4239,20 @@ int addNewKernel(struct grubConfig *config, struct singleEntry *template,
new = malloc(sizeof(*new));
new->skip = 0;
new->multiboot = 0;
- new->next = config->entries;
new->lines = NULL;
- config->entries = new;
+ entry = config->entries;
+ for (unsigned int i = 0; i < newIndex; i++) {
+ if (!entry)
+ break;
+ prev = entry;
+ entry = entry->next;
+ }
+ new->next = entry;
+
+ if (prev)
+ prev->next = new;
+ else
+ config->entries = new;
/* copy/update from the template */
needs = NEED_KERNEL | NEED_TITLE;
@@ -4734,6 +4745,7 @@ int main(int argc, const char **argv)
char *newDevTreePath = NULL;
char *newMBKernel = NULL;
char *newMBKernelArgs = NULL;
+ int newIndex = 0;
char *removeMBKernelArgs = NULL;
char *removeMBKernel = NULL;
char *bootPrefix = NULL;
@@ -4840,6 +4852,9 @@ int main(int argc, const char **argv)
{"set-default-index", 0, POPT_ARG_INT, &defaultIndex, 0,
_("make the given entry index the default entry"),
_("entry-index")},
+ {"set-index", 0, POPT_ARG_INT, &newIndex, 0,
+ _("use the given index when creating a new entry"),
+ _("entry-index")},
{"silo", 0, POPT_ARG_NONE, &configureSilo, 0,
_("configure silo bootloader")},
{"title", 0, POPT_ARG_STRING, &newKernelTitle, 0,
@@ -5255,7 +5270,8 @@ int main(int argc, const char **argv)
if (addNewKernel(config, template, bootPrefix, newKernelPath,
newKernelTitle, newKernelArgs, newKernelInitrd,
(const char **)extraInitrds, extraInitrdCount,
- newMBKernel, newMBKernelArgs, newDevTreePath))
+ newMBKernel, newMBKernelArgs, newDevTreePath,
+ newIndex))
return 1;
if (numEntries(config) == 0) {
diff --git a/.gitignore b/.gitignore
index e78a392d601..1c00ff7c5ed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@ version.h
*.o
core.*
vgcore.*
+*.tar.*
diff --git a/grubby.8 b/grubby.8
index 355b6eb6908..a4691f8ddb2 100644
--- a/grubby.8
+++ b/grubby.8
@@ -7,12 +7,12 @@ grubby \- command line tool for configuring grub, lilo, elilo, yaboot and zipl
[--bad-image-okay] [--boot-filesystem=\fIbootfs\fR]
[--bootloader-probe] [--config-file \fIpath\fR] [--copy-default]
[--debug] [--default-kernel] [--default-index] [--default-title]
- [--devtree=\fIdevicetree.dtb\fR]
+ [--devtree=\fIdevicetree.dtb\fR] [--set-entry=\fIentry-index\fR]
[--grub] [--lilo] [--yaboot] [--silo] [--zipl]
[--info=\fIkernel-path\fR] [--initrd=\fIinitrd-path\fR]
[--make-default] [-o path] [--version]
[--remove-kernel=\fIkernel-path\fR] [--remove-args=\fIargs\fR]
- [--set-default=\fIkernel-path\fR] [--set-default-index=\fientry-index\fR]
+ [--set-default=\fIkernel-path\fR] [--set-default-index=\fIentry-index\fR]
[--title=entry-title] [--add-multiboot=\fImultiboot-path\fR]
[--mbargs=\fIargs\fR] [--remove-multiboot=\fImultiboot-path\fR]
[--remove-mbargs=\fIargs\fR]
@@ -48,6 +48,10 @@ with that title are used.
\fB-\-add-kernel\fR=\fIkernel-path\fR
Add a new boot entry for the kernel located at \fIkernel-path\fR.
+.TP
+\fB-\-set-entry\fR=\fIentry-index\fR
+Set the position at which to add a new entry created with \fB-\-add-kernel\fR.
+
.TP
\fB-\-args\fR=\fIkernel-args\fR
When a new kernel is added, this specifies the command line arguments
diff --git a/test.sh b/test.sh
index ba466a50501..7d1794c83df 100755
--- a/test.sh
+++ b/test.sh
@@ -485,6 +485,20 @@ grubTest grub.8 add/g8.2 --add-kernel=/boot/new-kernel.img --title='title' \
grubTest grub.11 add/g11.1 --add-kernel=/boot/new-kernel.img --title='title' \
--initrd=/boot/new-initrd --boot-filesystem=/boot --copy-default \
--args='console=tty0 console=ttyS1,9600n81 single'
+grubTest grub.1 add/g1.1 --add-kernel=/boot/new-kernel.img --title='title' \
+ --initrd=/boot/new-initrd --boot-filesystem=/ --set-index 0
+grubTest grub.1 add/g1.17 --add-kernel=/boot/new-kernel.img --title='title' \
+ --initrd=/boot/new-initrd --boot-filesystem=/ --set-index 1
+grubTest grub.1 add/g1.17 --add-kernel=/boot/new-kernel.img --title='title' \
+ --initrd=/boot/new-initrd --boot-filesystem=/ --set-index 2
+grubTest grub.15 add/g1.10 --add-kernel=/boot/new-kernel.img --title='title' \
+ --initrd=/boot/new-initrd --boot-filesystem=/ --set-index 0
+grubTest grub.15 add/g1.8 --add-kernel=/boot/new-kernel.img --title='title' \
+ --initrd=/boot/new-initrd --boot-filesystem=/ --set-index 1
+grubTest grub.15 add/g1.9 --add-kernel=/boot/new-kernel.img --title='title' \
+ --initrd=/boot/new-initrd --boot-filesystem=/ --set-index 2
+grubTest grub.15 add/g1.9 --add-kernel=/boot/new-kernel.img --title='title' \
+ --initrd=/boot/new-initrd --boot-filesystem=/ --set-index 5
testgrub2=n
ARCH=$(uname -m | sed s,i[3456789]86,ia32,)
diff --git a/test/grub.15 b/test/grub.15
new file mode 100644
index 00000000000..e1c5f8a9b52
--- /dev/null
+++ b/test/grub.15
@@ -0,0 +1,19 @@
+# grub.conf generated by anaconda
+#
+# Note that you do not have to rerun grub after making changes to this file
+# NOTICE: You have a /boot partition. This means that
+# all kernel and initrd paths are relative to /boot/, eg.
+# root (hd0,0)
+# kernel /vmlinuz-version ro root=/dev/sda1
+# initrd /initrd-version.img
+#boot=/dev/hda
+default=1
+timeout=10
+splashimage=(hd0,0)/grub/splash.xpm.gz
+title Red Hat Linux (2.4.7-2)
+ root (hd0,0)
+ kernel /vmlinuz-2.4.7-2 ro root=/dev/sda1
+ initrd /initrd-2.4.7-2.img
+title zonk
+ kernel /boot/new-kernel.img
+ initrd /boot/new-initrd
diff --git a/test/results/add/g1.10 b/test/results/add/g1.10
new file mode 100644
index 00000000000..dcdd8a8ce10
--- /dev/null
+++ b/test/results/add/g1.10
@@ -0,0 +1,22 @@
+# grub.conf generated by anaconda
+#
+# Note that you do not have to rerun grub after making changes to this file
+# NOTICE: You have a /boot partition. This means that
+# all kernel and initrd paths are relative to /boot/, eg.
+# root (hd0,0)
+# kernel /vmlinuz-version ro root=/dev/sda1
+# initrd /initrd-version.img
+#boot=/dev/hda
+default=2
+timeout=10
+splashimage=(hd0,0)/grub/splash.xpm.gz
+title title
+ kernel /boot/new-kernel.img
+ initrd /boot/new-initrd
+title Red Hat Linux (2.4.7-2)
+ root (hd0,0)
+ kernel /vmlinuz-2.4.7-2 ro root=/dev/sda1
+ initrd /initrd-2.4.7-2.img
+title zonk
+ kernel /boot/new-kernel.img
+ initrd /boot/new-initrd
diff --git a/test/results/add/g1.17 b/test/results/add/g1.17
new file mode 100644
index 00000000000..6a388228768
--- /dev/null
+++ b/test/results/add/g1.17
@@ -0,0 +1,19 @@
+# grub.conf generated by anaconda
+#
+# Note that you do not have to rerun grub after making changes to this file
+# NOTICE: You have a /boot partition. This means that
+# all kernel and initrd paths are relative to /boot/, eg.
+# root (hd0,0)
+# kernel /vmlinuz-version ro root=/dev/sda1
+# initrd /initrd-version.img
+#boot=/dev/hda
+default=1
+timeout=10
+splashimage=(hd0,0)/grub/splash.xpm.gz
+title Red Hat Linux (2.4.7-2)
+ root (hd0,0)
+ kernel /vmlinuz-2.4.7-2 ro root=/dev/sda1
+ initrd /initrd-2.4.7-2.img
+title title
+ kernel /boot/new-kernel.img
+ initrd /boot/new-initrd
diff --git a/test/results/add/g1.8 b/test/results/add/g1.8
new file mode 100644
index 00000000000..5893a2f5af1
--- /dev/null
+++ b/test/results/add/g1.8
@@ -0,0 +1,22 @@
+# grub.conf generated by anaconda
+#
+# Note that you do not have to rerun grub after making changes to this file
+# NOTICE: You have a /boot partition. This means that
+# all kernel and initrd paths are relative to /boot/, eg.
+# root (hd0,0)
+# kernel /vmlinuz-version ro root=/dev/sda1
+# initrd /initrd-version.img
+#boot=/dev/hda
+default=2
+timeout=10
+splashimage=(hd0,0)/grub/splash.xpm.gz
+title Red Hat Linux (2.4.7-2)
+ root (hd0,0)
+ kernel /vmlinuz-2.4.7-2 ro root=/dev/sda1
+ initrd /initrd-2.4.7-2.img
+title title
+ kernel /boot/new-kernel.img
+ initrd /boot/new-initrd
+title zonk
+ kernel /boot/new-kernel.img
+ initrd /boot/new-initrd
diff --git a/test/results/add/g1.9 b/test/results/add/g1.9
new file mode 100644
index 00000000000..310623d13d2
--- /dev/null
+++ b/test/results/add/g1.9
@@ -0,0 +1,22 @@
+# grub.conf generated by anaconda
+#
+# Note that you do not have to rerun grub after making changes to this file
+# NOTICE: You have a /boot partition. This means that
+# all kernel and initrd paths are relative to /boot/, eg.
+# root (hd0,0)
+# kernel /vmlinuz-version ro root=/dev/sda1
+# initrd /initrd-version.img
+#boot=/dev/hda
+default=2
+timeout=10
+splashimage=(hd0,0)/grub/splash.xpm.gz
+title Red Hat Linux (2.4.7-2)
+ root (hd0,0)
+ kernel /vmlinuz-2.4.7-2 ro root=/dev/sda1
+ initrd /initrd-2.4.7-2.img
+title zonk
+ kernel /boot/new-kernel.img
+ initrd /boot/new-initrd
+title title
+ kernel /boot/new-kernel.img
+ initrd /boot/new-initrd
--
2.17.1

@ -0,0 +1,37 @@
From 0a4d6c3ae61bd6fd6a664b2b55b3e9453cf813ac Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Thu, 23 Jun 2016 14:47:35 -0400
Subject: [PATCH 21/55] Fix thinko on --set-index naming.
Related: rhbz#1285601
Signed-off-by: Peter Jones <pjones@redhat.com>
---
grubby.8 | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/grubby.8 b/grubby.8
index a4691f8ddb2..f1bfb9336e9 100644
--- a/grubby.8
+++ b/grubby.8
@@ -7,7 +7,7 @@ grubby \- command line tool for configuring grub, lilo, elilo, yaboot and zipl
[--bad-image-okay] [--boot-filesystem=\fIbootfs\fR]
[--bootloader-probe] [--config-file \fIpath\fR] [--copy-default]
[--debug] [--default-kernel] [--default-index] [--default-title]
- [--devtree=\fIdevicetree.dtb\fR] [--set-entry=\fIentry-index\fR]
+ [--devtree=\fIdevicetree.dtb\fR] [--set-index=\fIentry-index\fR]
[--grub] [--lilo] [--yaboot] [--silo] [--zipl]
[--info=\fIkernel-path\fR] [--initrd=\fIinitrd-path\fR]
[--make-default] [-o path] [--version]
@@ -49,7 +49,7 @@ with that title are used.
Add a new boot entry for the kernel located at \fIkernel-path\fR.
.TP
-\fB-\-set-entry\fR=\fIentry-index\fR
+\fB-\-set-index\fR=\fIentry-index\fR
Set the position at which to add a new entry created with \fB-\-add-kernel\fR.
.TP
--
2.17.1

@ -0,0 +1,386 @@
From a23da4b29281ca07b06aab0bb772fedfe1f8ce35 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Fri, 24 Jun 2016 16:13:41 -0400
Subject: [PATCH 22/55] Add a test case for a failure rmarshall saw in
--set-index=
Related: rhbz#1285601
Signed-off-by: Peter Jones <pjones@redhat.com>
---
test.sh | 9 ++
test/grub2-support_files/grubenv.3 | 3 +
test/grub2.18 | 154 ++++++++++++++++++++++++++
test/results/add/g2-1.18 | 168 +++++++++++++++++++++++++++++
4 files changed, 334 insertions(+)
create mode 100644 test/grub2-support_files/grubenv.3
create mode 100644 test/grub2.18
create mode 100644 test/results/add/g2-1.18
diff --git a/test.sh b/test.sh
index 7d1794c83df..fb7cd2381d5 100755
--- a/test.sh
+++ b/test.sh
@@ -565,6 +565,15 @@ if [ "$testgrub2" == "y" ]; then
--copy-default --title 'Red Hat Enterprise Linux Server' \
--args=root=/dev/mapper/foo--
+ # copy a stanza and add arguments as well, while using --set-index=
+ testing="GRUB2 add stanza and new args with --set-index="
+ grub2Test grub2.18 add/g2-1.18 --env grubenv.3 \
+ --add-kernel=/boot/vmlinuz-3.10.0-327.22.2.el7.x86_64.debug \
+ --boot-filesystem=/boot --copy-default \
+ --title "Red Hat Enterprise Linux Server (3.10.0-327.22.2.el7.x86_64.debug) 7.2 (Maipo) with debugging" \
+ --args="root=/dev/mapper/rhel_team--area--222-root systemd.log_level=debug systemd.log_target=kmsg" \
+ --set-index=1
+
testing="GRUB2 add initrd"
grub2Test grub2.2 add/g2-1.4 --update-kernel=/boot/new-kernel.img \
--initrd=/boot/new-initrd --boot-filesystem=/boot/
diff --git a/test/grub2-support_files/grubenv.3 b/test/grub2-support_files/grubenv.3
new file mode 100644
index 00000000000..b9a8c798328
--- /dev/null
+++ b/test/grub2-support_files/grubenv.3
@@ -0,0 +1,3 @@
+# GRUB Environment Block
+saved_entry=Red Hat Enterprise Linux Server (3.10.0-327.22.2.el7.x86_64.debug) 7.2 (Maipo) with debugging
+#############################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
\ No newline at end of file
diff --git a/test/grub2.18 b/test/grub2.18
new file mode 100644
index 00000000000..529608da773
--- /dev/null
+++ b/test/grub2.18
@@ -0,0 +1,154 @@
+#
+# 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=5
+# Fallback normal timeout code in case the timeout_style feature is
+# unavailable.
+else
+ set timeout=5
+fi
+### END /etc/grub.d/00_header ###
+
+### BEGIN /etc/grub.d/00_tuned ###
+set tuned_params=""
+### END /etc/grub.d/00_tuned ###
+
+### BEGIN /etc/grub.d/01_users ###
+if [ -f ${prefix}/user.cfg ]; then
+ source ${prefix}/user.cfg
+ if [ -n ${GRUB2_PASSWORD} ]; then
+ set superusers="root"
+ export superusers
+ password_pbkdf2 root ${GRUB2_PASSWORD}
+ fi
+fi
+### END /etc/grub.d/01_users ###
+
+### BEGIN /etc/grub.d/10_linux ###
+menuentry 'Red Hat Enterprise Linux Server (3.10.0-327.22.2.el7.x86_64.debug) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-91b16928-66bf-4801-8aed-fab3f1a6876c' {
+ load_video
+ set gfxpayload=keep
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ else
+ search --no-floppy --fs-uuid --set=root 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ fi
+ linux16 /vmlinuz-3.10.0-327.22.2.el7.x86_64.debug root=/dev/mapper/rhel_team--area--222-root ro crashkernel=auto rd.lvm.lv=rhel_team-area-222/root rd.lvm.lv=rhel_team-area-222/swap rhgb quiet LANG=en_US.UTF-8
+}
+menuentry 'Red Hat Enterprise Linux Server (3.10.0-327.el7.x86_64) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-91b16928-66bf-4801-8aed-fab3f1a6876c' {
+ load_video
+ set gfxpayload=keep
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ else
+ search --no-floppy --fs-uuid --set=root 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ fi
+ linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapper/rhel_team--area--222-root ro crashkernel=auto rd.lvm.lv=rhel_team-area-222/root rd.lvm.lv=rhel_team-area-222/swap rhgb quiet LANG=en_US.UTF-8
+ initrd16 /initramfs-3.10.0-327.el7.x86_64.img
+}
+menuentry 'Red Hat Enterprise Linux Server (0-rescue-925cd320373b6a4a9a66a26371afccd2) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-925cd320373b6a4a9a66a26371afccd2-advanced-91b16928-66bf-4801-8aed-fab3f1a6876c' {
+ load_video
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ else
+ search --no-floppy --fs-uuid --set=root 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ fi
+ linux16 /vmlinuz-0-rescue-925cd320373b6a4a9a66a26371afccd2 root=/dev/mapper/rhel_team--area--222-root ro crashkernel=auto rd.lvm.lv=rhel_team-area-222/root rd.lvm.lv=rhel_team-area-222/swap rhgb quiet
+ initrd16 /initramfs-0-rescue-925cd320373b6a4a9a66a26371afccd2.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.18 b/test/results/add/g2-1.18
new file mode 100644
index 00000000000..ca5fe2393d5
--- /dev/null
+++ b/test/results/add/g2-1.18
@@ -0,0 +1,168 @@
+#
+# 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=5
+# Fallback normal timeout code in case the timeout_style feature is
+# unavailable.
+else
+ set timeout=5
+fi
+### END /etc/grub.d/00_header ###
+
+### BEGIN /etc/grub.d/00_tuned ###
+set tuned_params=""
+### END /etc/grub.d/00_tuned ###
+
+### BEGIN /etc/grub.d/01_users ###
+if [ -f ${prefix}/user.cfg ]; then
+ source ${prefix}/user.cfg
+ if [ -n ${GRUB2_PASSWORD} ]; then
+ set superusers="root"
+ export superusers
+ password_pbkdf2 root ${GRUB2_PASSWORD}
+ fi
+fi
+### END /etc/grub.d/01_users ###
+
+### BEGIN /etc/grub.d/10_linux ###
+menuentry 'Red Hat Enterprise Linux Server (3.10.0-327.22.2.el7.x86_64.debug) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-91b16928-66bf-4801-8aed-fab3f1a6876c' {
+ load_video
+ set gfxpayload=keep
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ else
+ search --no-floppy --fs-uuid --set=root 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ fi
+ linux16 /vmlinuz-3.10.0-327.22.2.el7.x86_64.debug root=/dev/mapper/rhel_team--area--222-root ro crashkernel=auto rd.lvm.lv=rhel_team-area-222/root rd.lvm.lv=rhel_team-area-222/swap rhgb quiet LANG=en_US.UTF-8
+}
+menuentry 'Red Hat Enterprise Linux Server (3.10.0-327.22.2.el7.x86_64.debug) 7.2 (Maipo) with debugging' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-91b16928-66bf-4801-8aed-fab3f1a6876c' {
+ load_video
+ set gfxpayload=keep
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ else
+ search --no-floppy --fs-uuid --set=root 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ fi
+ linux16 /vmlinuz-3.10.0-327.22.2.el7.x86_64.debug root=/dev/mapper/rhel_team--area--222-root ro crashkernel=auto rd.lvm.lv=rhel_team-area-222/root rd.lvm.lv=rhel_team-area-222/swap rhgb quiet LANG=en_US.UTF-8 systemd.log_level=debug systemd.log_target=kmsg
+}
+menuentry 'Red Hat Enterprise Linux Server (3.10.0-327.el7.x86_64) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-91b16928-66bf-4801-8aed-fab3f1a6876c' {
+ load_video
+ set gfxpayload=keep
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ else
+ search --no-floppy --fs-uuid --set=root 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ fi
+ linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapper/rhel_team--area--222-root ro crashkernel=auto rd.lvm.lv=rhel_team-area-222/root rd.lvm.lv=rhel_team-area-222/swap rhgb quiet LANG=en_US.UTF-8
+ initrd16 /initramfs-3.10.0-327.el7.x86_64.img
+}
+menuentry 'Red Hat Enterprise Linux Server (0-rescue-925cd320373b6a4a9a66a26371afccd2) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-925cd320373b6a4a9a66a26371afccd2-advanced-91b16928-66bf-4801-8aed-fab3f1a6876c' {
+ load_video
+ insmod gzio
+ insmod part_msdos
+ insmod xfs
+ set root='hd0,msdos1'
+ if [ x$feature_platform_search_hint = xy ]; then
+ search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ else
+ search --no-floppy --fs-uuid --set=root 7e972fc0-6cf8-4a58-ace6-1b381e52733d
+ fi
+ linux16 /vmlinuz-0-rescue-925cd320373b6a4a9a66a26371afccd2 root=/dev/mapper/rhel_team--area--222-root ro crashkernel=auto rd.lvm.lv=rhel_team-area-222/root rd.lvm.lv=rhel_team-area-222/swap rhgb quiet
+ initrd16 /initramfs-0-rescue-925cd320373b6a4a9a66a26371afccd2.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 ###
--
2.17.1

@ -0,0 +1,46 @@
From f88808a37044c323e35eda49dbc326dcf260439b Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Fri, 24 Jun 2016 16:05:45 -0400
Subject: [PATCH 23/55] Ensure command line updates also honor --set-index
Related: rhbz#1285601
Signed-off-by: Peter Jones <pjones@redhat.com>
---
grubby.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/grubby.c b/grubby.c
index 54625e7da0a..d889399449b 100644
--- a/grubby.c
+++ b/grubby.c
@@ -4212,11 +4212,17 @@ int addNewKernel(struct grubConfig *config, struct singleEntry *template,
struct singleEntry *new, *entry, *prev = NULL;
struct singleLine *newLine = NULL, *tmplLine = NULL, *masterLine = NULL;
int needs;
+ char *indexs;
char *chptr;
+ int rc;
if (!newKernelPath)
return 0;
+ rc = asprintf(&indexs, "%d", newIndex);
+ if (rc < 0)
+ return 1;
+
/* if the newKernelTitle is too long silently munge it into something
* we can live with. truncating is first check, then we'll just mess with
* it until it looks better */
@@ -4715,7 +4721,7 @@ int addNewKernel(struct grubConfig *config, struct singleEntry *template,
abort();
}
- if (updateImage(config, "0", prefix, newKernelArgs, NULL,
+ if (updateImage(config, indexs, prefix, newKernelArgs, NULL,
newMBKernelArgs, NULL))
return 1;
--
2.17.1

@ -0,0 +1,67 @@
From fe9bc763507e849caa45926e49c1c324532ced6e Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Thu, 23 Jun 2016 14:41:12 -0400
Subject: [PATCH 24/55] Change debug entry insertion order (rhbz#1285601)
Customer reports indicated that it was confusing to have the debugging
entries before non-debugging entries. Altered the insertion code to use
the --set-index feature on the debug kernels to force them to insert
after the initial non-debugging entry.
Resolves: rhbz#1285601
---
new-kernel-pkg | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/new-kernel-pkg b/new-kernel-pkg
index 9574dbbf10b..64225deb06b 100755
--- a/new-kernel-pkg
+++ b/new-kernel-pkg
@@ -244,7 +244,7 @@ install() {
--remove-kernel=\"TITLE=$title\$debugtitle\""
rungrubby ${ARGS} $makedefault
- rungrubby --debug ${ARGS}
+ rungrubby --debug ${ARGS} --set-index=1
else
[ -n "$verbose" ] && echo "$grubConfig does not exist, not running grubby for grub 0.97"
fi
@@ -258,7 +258,7 @@ install() {
--args=\"root=$rootdevice $kernargs \$debugargs\" \
--remove-kernel=\"TITLE=$title\$debugtitle\""
rungrubby ${ARGS} $makedefault
- rungrubby --debug ${ARGS}
+ rungrubby --debug ${ARGS} --set-index=1
else
[ -n "$verbose" ] && echo "$grub2Config does not exist, not running grubby for grub 2"
fi
@@ -273,7 +273,7 @@ install() {
--args=\"root=$rootdevice $kernargs \$debugargs\" \
--remove-kernel=\"TITLE=$title\$debugtitle\""
rungrubby ${ARGS} $makedefault
- rungrubby --debug ${ARGS}
+ rungrubby --debug ${ARGS} --set-index=1
else
[ -n "$verbose" ] && echo "$grub2EfiConfig does not exist, not running grubby for grub 2 with UEFI"
fi
@@ -289,7 +289,7 @@ install() {
--remove-kernel=\"TITLE=$version\""
rungrubby ${ARGS} $makedefault
- rungrubby --debug ${ARGS}
+ rungrubby --debug ${ARGS} --set-index=1
if [ -n "$runLilo" ]; then
[ -n "$verbose" ] && echo "running $lilo"
if [ ! -x $lilo ] ; then
@@ -314,7 +314,7 @@ install() {
--remove-kernel=\"TITLE=$title\$debugtitle\""
rungrubby ${ARGS} $makedefault
- rungrubby --debug ${ARGS}
+ rungrubby --debug ${ARGS} --set-index=1
else
[ -n "$verbose" ] && echo "$extlinuxConfig does not exist, not running grubby for extlinux"
fi
--
2.17.1

@ -0,0 +1,356 @@
From 9073de7c059fcc9fd5ca837068d96cb0246f3c99 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Fri, 1 Jul 2016 14:03:38 -0400
Subject: [PATCH 25/55] Reorganize grubby man page (#1232168)
Broke the grubby man page into clearer sections and re-organized the
content by general use case for easier reading.
Related: rhbz#1232168
---
grubby.8 | 220 ++++++++++++++++++++++++++++++-------------------------
1 file changed, 120 insertions(+), 100 deletions(-)
diff --git a/grubby.8 b/grubby.8
index f1bfb9336e9..a3033d87254 100644
--- a/grubby.8
+++ b/grubby.8
@@ -1,15 +1,18 @@
.TH GRUBBY 8 "Tue Jan 18 2005"
+
.SH NAME
+
grubby \- command line tool for configuring grub, lilo, elilo, yaboot and zipl
.SH SYNOPSIS
-\fBgrubby\fR [--add-kernel=\fIkernel-path\fR] [--args=\fIargs\fR]
- [--bad-image-okay] [--boot-filesystem=\fIbootfs\fR]
+
+\fBgrubby\fR [--add-kernel=\fIkernel-path\fR] [--args=\fIargs\fR]
+ [--bad-image-okay] [--boot-filesystem=\fIbootfs\fR]
[--bootloader-probe] [--config-file \fIpath\fR] [--copy-default]
[--debug] [--default-kernel] [--default-index] [--default-title]
[--devtree=\fIdevicetree.dtb\fR] [--set-index=\fIentry-index\fR]
[--grub] [--lilo] [--yaboot] [--silo] [--zipl]
- [--info=\fIkernel-path\fR] [--initrd=\fIinitrd-path\fR]
+ [--info=\fIkernel-path\fR] [--initrd=\fIinitrd-path\fR]
[--make-default] [-o path] [--version]
[--remove-kernel=\fIkernel-path\fR] [--remove-args=\fIargs\fR]
[--set-default=\fIkernel-path\fR] [--set-default-index=\fIentry-index\fR]
@@ -18,12 +21,17 @@ grubby \- command line tool for configuring grub, lilo, elilo, yaboot and zipl
[--remove-mbargs=\fIargs\fR]
.SH DESCRIPTION
+
+.SS General Information
+
\fBgrubby\fR is a command line tool for updating and displaying information
about the configuration files for the \fBgrub\fR, \fBlilo\fR, \fBelilo\fR
(ia64), \fByaboot\fR (powerpc) and \fBzipl\fR (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.
+.SS Architecture Support
+
On BIOS-based Intel x86 platforms, \fBgrub2\fR is the default bootloader and
the configuration file is in \fB/boot/grub2/grub.cfg\fR. On UEFI-based Intel
x86 platforms, \fBgrub2\fR is the default bootloader, and the configuration
@@ -35,6 +43,8 @@ config stored in \fB/boot/grub2/grub.cfg\fR. The earlier Power7 systems use \fBy
parsing and the configuration file should be in \fB/etc/yaboot.conf\fR. On
s390 platforms the \fBzipl bootloader\fR will read from \fB/etc/zipl.conf\fR.
+.SS Special Arguments
+
There are a number of ways to specify the kernel used for \fB-\-info\fR,
\fB-\-remove-kernel\fR, and \fB-\-update-kernel\fR. Specificying \fBDEFAULT\fR
or \fBALL\fR selects the default entry and all of the entries, respectively.
@@ -44,13 +54,24 @@ be specified by using \fBTITLE=\fItitle\fR as the argument; all entries
with that title are used.
.SH OPTIONS
+
+.SS Basic Options
+
.TP
\fB-\-add-kernel\fR=\fIkernel-path\fR
Add a new boot entry for the kernel located at \fIkernel-path\fR.
.TP
-\fB-\-set-index\fR=\fIentry-index\fR
-Set the position at which to add a new entry created with \fB-\-add-kernel\fR.
+\fB-\-remove-kernel\fR=\fIkernel-path\fR
+Removes all boot entries which match \fIkernel-path\fR. This may be used
+along with -\-add-kernel, in which case the new kernel being added will
+never be removed.
+
+.TP
+\fB-\-update-kernel\fR=\fIkernel-path\fR
+The entries for kernels matching \fRkernel-path\fR are updated. Currently
+the only items that can be updated is the kernel argument list, which is
+modified via the \fB-\-args\fR and \fB-\-remove-args\fR options.
.TP
\fB-\-args\fR=\fIkernel-args\fR
@@ -65,38 +86,11 @@ file has special handling for specifying the root filesystem (like
lilo.conf does).
.TP
-\fB-\-bad-image-okay\fR
-When \fBgrubby\fR is looking for a entry to use for something (such
-as a template or a default boot entry) it uses sanity checks, such as
-ensuring that the kernel exists in the filesystem, to make sure
-entries that obviously won't work aren't selected. This option overrides
-that behavior, and is designed primarily for testing.
-
-.TP
-\fB-\-boot-filesystem\fR=\fIbootfs\fR
-The \fBgrub\fR boot loader expects file paths listed in it's configuration
-path to be relative to the top of the filesystem they are on, rather then
-relative to the current root filesystem. By default \fBgrubby\fR searches
-the list of currently mounted filesystems to determine this. If this option
-is given \fBgrubby\fR acts as if the specified filesystem was the filesystem
-containing the kernel (this option is designed primarily for testing).
-
-.TP
-\fB-\-bootloader-probe\fR
-\fBgrubby\fR tries to determine if \fBgrub\fR or \fBlilo\fR is currently
-installed. When one of those bootloaders is found the name of that bootloader
-is displayed on stdout. Both could be installed (on different devices), and
-grubby will print out the names of both bootloaders, one per line. The probe
-for \fBgrub\fR requires a commented out boot directive \fBgrub.conf\fR
-identical to the standard directive in the lilo configuration file. If this
-is not present \fBgrubby\fR will assume grub is not installed (note
-that \fBanaconda\fR places this directive in \fBgrub.conf\fR files it creates).
-This option is only available on ia32 platforms.
-
-
-.TP
-\fB-\-config-file\fR=\fIpath\fR
-Use \fIpath\fR as the configuration file rather then the default.
+\fB-\-remove-args\fR=\fIkernel-args\fR
+The arguments specified by \fIkernel-args\fR are removed from the
+kernels specified by \fB-\-update-kernel\fR. The \fBroot\fR argument
+gets special handling for configuration files that support separate root
+filesystem configuration.
.TP
\fB-\-copy-default\fR
@@ -104,10 +98,41 @@ Use \fIpath\fR as the configuration file rather then the default.
root device) as possible from the current default kernel. The kernel path
and initrd path will never be copied.
+.TP
+\fB-\-title\fR=\fIentry-title\fR
+When a new kernel entry is added \fIentry-title\fR is used as the title
+(\fBlilo\fR label) for the entry. If \fIentry-title\fR is longer then maximum
+length allowed by the bootloader (15 for lilo, unlimited for grub and elilo)
+the title is shortened to a (unique) entry.
+
+.TP
+\fB-\-initrd\fR=\fIinitrd-path\fR
+Use \fIinitrd-path\fR as the path to an initial ram disk for a new kernel
+being added.
+
+.TP
+\fB-\-set-default\fR=\fIkernel-path\fR
+The first entry which boots the specified kernel is made the default
+boot entry.
+
+.TP
+\fB-\-set-default-index\fR=\fIentry-index\fR
+Makes the given entry number the default boot entry.
+
+.TP
+\fB-\-make-default\fR
+Make the new kernel entry being added the default entry.
+
+.TP
+\fB-\-set-index\fR=\fIentry-index\fR
+Set the position at which to add a new entry created with \fB-\-add-kernel\fR.
+
.TP
\fB-\-debug\fR
Display extra debugging information for failures.
+.SS Display Options
+
.TP
\fB-\-default-kernel\fR
Display the full path to the current default kernel and exit.
@@ -121,9 +146,26 @@ Display the numeric index of the current default boot entry and exit.
Display the title of the current default boot entry and exit.
.TP
-\fB-\-devtree\fR=\fIpath\fR
-Use \fIpath\fR for device tree path in place of the path of any devicetree
-directive found in the template stanza.
+\fB-\-info\fR=\fIkernel-path\fR
+Display information on all boot entries which match \fIkernel-path\fR. I
+
+.TP
+\fB-\-bootloader-probe\fR
+\fBgrubby\fR tries to determine if \fBgrub\fR or \fBlilo\fR is currently
+installed. When one of those bootloaders is found the name of that bootloader
+is displayed on stdout. Both could be installed (on different devices), and
+grubby will print out the names of both bootloaders, one per line. The probe
+for \fBgrub\fR requires a commented out boot directive \fBgrub.conf\fR
+identical to the standard directive in the lilo configuration file. If this
+is not present \fBgrubby\fR will assume grub is not installed (note
+that \fBanaconda\fR places this directive in \fBgrub.conf\fR files it creates).
+This option is only available on ia32 platforms.
+
+.TP
+\fB-\-version\fR
+Display the version of \fBgrubby\fR being run and then exit immediately.
+
+.SS Output Format Options
.TP
\fB-\-elilo\fR
@@ -134,62 +176,10 @@ Use an \fBelilo\fR style configuration file.
Use a \fBgrub\fR style configuration file instead of \fBlilo\fR style. This
is the default on ia32 platforms.
-.TP
-\fB-\-info\fR=\fIkernel-path\fR
-Display information on all boot entries which match \fIkernel-path\fR. I
-
-.TP
-\fB-\-initrd\fR=\fIinitrd-path\fR
-Use \fIinitrd-path\fR as the path to an initial ram disk for a new kernel
-being added.
-
.TP
\fB-\-lilo\fR
Use a \fBlilo\fR style configuration file.
-.TP
-\fB-\-make-default\fR
-Make the new kernel entry being added the default entry.
-
-.TP
-\fB-\-remove-args\fR=\fIkernel-args\fR
-The arguments specified by \fIkernel-args\fR are removed from the
-kernels specified by \fB-\-update-kernel\fR. The \fBroot\fR argument
-gets special handling for configuration files that support separate root
-filesystem configuration.
-
-.TP
-\fB-\-remove-kernel\fR=\fIkernel-path\fR
-Removes all boot entries which match \fIkernel-path\fR. This may be used
-along with -\-add-kernel, in which case the new kernel being added will
-never be removed.
-
-.TP
-\fB-\-set-default\fR=\fIkernel-path\fR
-The first entry which boots the specified kernel is made the default
-boot entry.
-
-.TP
-\fB-\-set-default-index\fR=\fIentry-index\fR
-Makes the given entry number the default boot entry.
-
-.TP
-\fB-\-title\fR=\fIentry-title\fR
-When a new kernel entry is added \fIentry-title\fR is used as the title
-(\fBlilo\fR label) for the entry. If \fIentry-title\fR is longer then maximum
-length allowed by the bootloader (15 for lilo, unlimited for grub and elilo)
-the title is shortened to a (unique) entry.
-
-.TP
-\fB-\-update-kernel\fR=\fIkernel-path\fR
-The entries for kernels matching \fRkernel-path\fR are updated. Currently
-the only items that can be updated is the kernel argument list, which is
-modified via the \fB-\-args\fR and \fB-\-remove-args\fR options.
-
-.TP
-\fB-\-version\fR
-Display the version of \fBgrubby\fR being run and then exit immediately.
-
.TP
\fB-\-yaboot\fR
Use an \fByaboot\fR style configuration file.
@@ -198,7 +188,35 @@ Use an \fByaboot\fR style configuration file.
\fB-\-zipl\fR
Use an \fBzipl\fR style configuration file.
-.SH MULTIBOOT OPTIONS
+.SS Override Options
+
+.TP
+\fB-\-bad-image-okay\fR
+When \fBgrubby\fR is looking for a entry to use for something (such
+as a template or a default boot entry) it uses sanity checks, such as
+ensuring that the kernel exists in the filesystem, to make sure
+entries that obviously won't work aren't selected. This option overrides
+that behavior, and is designed primarily for testing.
+
+.TP
+\fB-\-boot-filesystem\fR=\fIbootfs\fR
+The \fBgrub\fR boot loader expects file paths listed in it's configuration
+path to be relative to the top of the filesystem they are on, rather then
+relative to the current root filesystem. By default \fBgrubby\fR searches
+the list of currently mounted filesystems to determine this. If this option
+is given \fBgrubby\fR acts as if the specified filesystem was the filesystem
+containing the kernel (this option is designed primarily for testing).
+
+.TP
+\fB-\-config-file\fR=\fIpath\fR
+Use \fIpath\fR as the configuration file rather then the default.
+
+\fB-\-devtree\fR=\fIpath\fR
+Use \fIpath\fR for device tree path in place of the path of any devicetree
+directive found in the template stanza.
+
+.SS Multiboot Options
+
The Multiboot Specification provides a genreic interface for boot
loaders and operating systems. It is supported by the GRUB bootloader.
@@ -210,34 +228,36 @@ Add a new boot entry for the multiboot kernel located at
.TP
\fB-\-remove-multiboot\fR=\fImultiboot-path\fR
-Removes all boot entries which match \fImultiboot-path\fR.
+Removes all boot entries which match \fImultiboot-path\fR.
.TP
\fB-\-mbargs\fR=\fImultiboot-args\fR
-When a new multiboot kernel is added, this specifies the command line
-arguments which should be passed to that kernel by default
+When a new multiboot kernel is added, this specifies the command line
+arguments which should be passed to that kernel by default
When \fB-\-update-kernel\fR is used, this specifies new arguments to add
to the argument list. Multiple, space separated arguments may be used. If
-an argument already exists the new value replaces the old values.
+an argument already exists the new value replaces the old values.
.TP
\fB-\-remove-mbargs\fR=\fImultiboot-args\fR
-The arguments specified by \fImultiboot-args\fR are removed from the
-kernels specified by \fB-\-update-kernel\fR.
-
+The arguments specified by \fImultiboot-args\fR are removed from the
+kernels specified by \fB-\-update-kernel\fR.
.SH "BUGS"
+
The command line syntax is more than a little baroque. This probably
won't be fixed as \fBgrubby\fR is only intended to be called from shell
scripts which can get it right.
.SH "SEE ALSO"
+
.BR grub (8),
.BR lilo (8),
.BR yaboot (8),
.BR mkinitrd (8)
.SH AUTHORS
+
.nf
Erik Troan
Jeremy Katz
--
2.17.1

@ -0,0 +1,369 @@
From e08236e8d15ff0fc581d56efaf4d855c57d6d994 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Fri, 1 Jul 2016 15:03:13 -0400
Subject: [PATCH 26/55] Update grubby man page contents (#bz1232168)
The grubby man page was missing several options that were added in
previous releases. Added those to the man page as well as updated the
text on others to provide further clarity.
Added an EXAMPLE section containing some basic use cases.
Resolves: rhbz#1232168
---
grubby.8 | 218 +++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 173 insertions(+), 45 deletions(-)
diff --git a/grubby.8 b/grubby.8
index a3033d87254..64a6984fba0 100644
--- a/grubby.8
+++ b/grubby.8
@@ -2,51 +2,69 @@
.SH NAME
-grubby \- command line tool for configuring grub, lilo, elilo, yaboot and zipl
+grubby \- command line tool used to configure bootloader menu entries across multiple architectures
.SH SYNOPSIS
-\fBgrubby\fR [--add-kernel=\fIkernel-path\fR] [--args=\fIargs\fR]
- [--bad-image-okay] [--boot-filesystem=\fIbootfs\fR]
- [--bootloader-probe] [--config-file \fIpath\fR] [--copy-default]
- [--debug] [--default-kernel] [--default-index] [--default-title]
- [--devtree=\fIdevicetree.dtb\fR] [--set-index=\fIentry-index\fR]
- [--grub] [--lilo] [--yaboot] [--silo] [--zipl]
- [--info=\fIkernel-path\fR] [--initrd=\fIinitrd-path\fR]
- [--make-default] [-o path] [--version]
- [--remove-kernel=\fIkernel-path\fR] [--remove-args=\fIargs\fR]
- [--set-default=\fIkernel-path\fR] [--set-default-index=\fIentry-index\fR]
- [--title=entry-title] [--add-multiboot=\fImultiboot-path\fR]
- [--mbargs=\fIargs\fR] [--remove-multiboot=\fImultiboot-path\fR]
- [--remove-mbargs=\fIargs\fR]
+\fBgrubby\fR [\fIOPTIONS...\fR]
.SH DESCRIPTION
.SS General Information
\fBgrubby\fR is a command line tool for updating and displaying information
-about the configuration files for the \fBgrub\fR, \fBlilo\fR, \fBelilo\fR
-(ia64), \fByaboot\fR (powerpc) and \fBzipl\fR (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.
+about the configuration files for various architecture specific bootloaders.
+It is primarily designed to be used from scripts which install new kernels
+and need to find information about the current boot environment.
.SS Architecture Support
-On BIOS-based Intel x86 platforms, \fBgrub2\fR is the default bootloader and
-the configuration file is in \fB/boot/grub2/grub.cfg\fR. On UEFI-based Intel
-x86 platforms, \fBgrub2\fR is the default bootloader, and the configuration
-file is in \fB/boot/efi/EFI/redhat/grub.cfg\fR. On Intel ia64 platforms,
-\fBelilo\fR mode is used and the default location for the configuration file
-is \fB/boot/efi/EFI/redhat/elilo.conf\fR. On PowerPC platforms, systems based
-on Power8 now support \fBgrub2\fR as a bootloader and store using a default
-config stored in \fB/boot/grub2/grub.cfg\fR. The earlier Power7 systems use \fByaboot\fR
-parsing and the configuration file should be in \fB/etc/yaboot.conf\fR. On
-s390 platforms the \fBzipl bootloader\fR will read from \fB/etc/zipl.conf\fR.
+The \fBgrubby\fR executable has full support for the \fBgrub2\fR
+bootloader on \fBx86_64\fR systems using legacy BIOS or modern
+UEFI firmware and \fBppc64\fR and \fBppc64le\fR hardware using
+OPAL or SLOF as firmware.
+
+Legacy \fBs390\fR and the current \fBs390x\fR architectures
+and their \fBzipl\fR bootloader are fully supported.
+
+Support for \fByaboot\fR has been deprecated as all ppc architecture
+hardware since the Power8 system uses \fBgrub2\fR or petitboot
+which both use the grub2 configuration file format.
+
+Legacy bootloaders \fBLILO\fR, \fBSILO\fR, and \fBELILO\fR
+are deprecated in favor of previously mentioned bootloaders. The
+\fBSILO\fR bootloader should also be considered unsupported.
+
+.SS Default Behavior
+
+The default architecture is chosen at compile time. The grubby executable
+has a series of built in assumptions about what bootloader is being used and
+where its configuration file lives. If no output format option is specified
+on the command line then grubby will use these default settings to first
+search for an existing configuration and, if it is not found, assume that
+it should be placed in the standard location. These default assumptions are
+listed in the table below.
+
+.TS
+allbox;
+lbw6 lbw10 lbw18
+l l l.
+ Arch Bootloader Configuration File
+ x86_64 [BIOS] grub2 /boot/grub2/grub.cfg
+ x86_64 [UEFI] grub2 /boot/efi/EFI/redhat/grub.cfg
+ i386 grub2 /boot/grub2/grub.cfg
+ ia64 elilo /boot/efi/EFI/redhat/elilo.conf
+ ppc [>=Power8] grub2 /boot/grub2/grub.cfg
+ ppc [<=Power7] yaboot /etc/yaboot.conf
+ s390 zipl /etc/zipl.conf
+ s390x zipl /etc/zipl.conf
+.TE
+
.SS Special Arguments
There are a number of ways to specify the kernel used for \fB-\-info\fR,
-\fB-\-remove-kernel\fR, and \fB-\-update-kernel\fR. Specificying \fBDEFAULT\fR
+\fB-\-remove-kernel\fR, and \fB-\-update-kernel\fR. Specifying \fBDEFAULT\fR
or \fBALL\fR selects the default entry and all of the entries, respectively.
If a comma separated list of numbers is given, the boot entries indexed
by those numbers are selected. Finally, the title of a boot entry may
@@ -59,12 +77,17 @@ with that title are used.
.TP
\fB-\-add-kernel\fR=\fIkernel-path\fR
-Add a new boot entry for the kernel located at \fIkernel-path\fR.
+Add a new boot entry for the kernel located at \fIkernel-path\fR. A title for
+the boot entry must be set using \fB-\-title\fR. Most invocations should also
+include \fB-\-initrd\fR with memtest86 as a notable exception.
+
+The \fB-\-update-kernel\fR
+option may not be used in the same invocation.
.TP
\fB-\-remove-kernel\fR=\fIkernel-path\fR
Removes all boot entries which match \fIkernel-path\fR. This may be used
-along with -\-add-kernel, in which case the new kernel being added will
+along with \fB-\-add-kernel\fR, in which case the new kernel being added will
never be removed.
.TP
@@ -110,14 +133,19 @@ the title is shortened to a (unique) entry.
Use \fIinitrd-path\fR as the path to an initial ram disk for a new kernel
being added.
+.TP
+\fB-\-efi\fR
+Use linuxefi and initrdefi when constructing bootloader stanzas instead of linux and initrd.
+
.TP
\fB-\-set-default\fR=\fIkernel-path\fR
The first entry which boots the specified kernel is made the default
-boot entry.
+boot entry. This may not be invoked with \fB-\-set-default-index\fR.
.TP
\fB-\-set-default-index\fR=\fIentry-index\fR
-Makes the given entry number the default boot entry.
+Makes the given entry number the default boot entry. This may not
+be invoked with \fB-\-set-default\fR.
.TP
\fB-\-make-default\fR
@@ -131,8 +159,17 @@ Set the position at which to add a new entry created with \fB-\-add-kernel\fR.
\fB-\-debug\fR
Display extra debugging information for failures.
+.TP
+\fB-i\fR, \fB-\-extra-initrd\fR=\fIinitrd-path\fR
+Use \fIinitrd-path\fR as the path for an auxiliary initrd image.
+
.SS Display Options
+Passing the display option to grubby will cause it to print out the
+requested information about the current bootloader configuration and
+then immediately exit. These options should not be used in any
+script intended to update the bootloader configuration.
+
.TP
\fB-\-default-kernel\fR
Display the full path to the current default kernel and exit.
@@ -159,34 +196,56 @@ for \fBgrub\fR requires a commented out boot directive \fBgrub.conf\fR
identical to the standard directive in the lilo configuration file. If this
is not present \fBgrubby\fR will assume grub is not installed (note
that \fBanaconda\fR places this directive in \fBgrub.conf\fR files it creates).
-This option is only available on ia32 platforms.
+
+\fIThis option is only available on i386 platforms.\fR
.TP
-\fB-\-version\fR
+\fB-v\fR, \fB-\-version\fR
Display the version of \fBgrubby\fR being run and then exit immediately.
.SS Output Format Options
+Sane default options for the current platform are compiled into grubby on
+a per platform basis. These defaults determine the format and layout of
+the generated bootloader configuration file. A different configuration file
+format may be specified on the command line if the system uses a supported
+alternative bootloader.
+
.TP
\fB-\-elilo\fR
-Use an \fBelilo\fR style configuration file.
+Use an \fBelilo\fR style configuration file. This is the default on ia64 platforms. This format is deprecated.
+
+.TP
+\fB-\-extlinux\fR
+Use an \fBextlinux\fR style configuration file. This format is deprecated.
.TP
\fB-\-grub\fR
-Use a \fBgrub\fR style configuration file instead of \fBlilo\fR style. This
-is the default on ia32 platforms.
+Use a \fBgrub\fR style configuration file. This is the default on ia32 platforms.
+
+.TP
+\fB-\-grub2\fR
+Use a \fBgrub2\fR style configuration file. This is the default on \fBx86_64\fR
+architecture as well as the \fBppc64\fR and \fBppc64le\fR architectures
+running on Power8 or later hardware.
.TP
\fB-\-lilo\fR
Use a \fBlilo\fR style configuration file.
+.TP
+\fB-\-silo\fR
+Use a \fBsilo\fR style configuration file. This is the default on SPARC systems. This format is legacy, deprecated, and unsupported.
+
.TP
\fB-\-yaboot\fR
-Use an \fByaboot\fR style configuration file.
+Use a \fByaboot\fR style configuration file. This is the default for
+the \fBppc\fR architecture on on Power7 and earlier hardware.
.TP
\fB-\-zipl\fR
-Use an \fBzipl\fR style configuration file.
+Use a \fBzipl\fR style configuration file. This is the default on the
+legacy s390 and current s390x architectures.
.SS Override Options
@@ -200,7 +259,7 @@ that behavior, and is designed primarily for testing.
.TP
\fB-\-boot-filesystem\fR=\fIbootfs\fR
-The \fBgrub\fR boot loader expects file paths listed in it's configuration
+The \fBgrub\fR boot loader expects file paths listed in its configuration
path to be relative to the top of the filesystem they are on, rather then
relative to the current root filesystem. By default \fBgrubby\fR searches
the list of currently mounted filesystems to determine this. If this option
@@ -208,23 +267,39 @@ is given \fBgrubby\fR acts as if the specified filesystem was the filesystem
containing the kernel (this option is designed primarily for testing).
.TP
-\fB-\-config-file\fR=\fIpath\fR
+\fB-\-env\fR=\fIpath\fR
+Path for the file where grub environment data is stored.
+
+.TP
+\fB-c\fR, \fB-\-config-file\fR=\fIpath\fR
Use \fIpath\fR as the configuration file rather then the default.
-\fB-\-devtree\fR=\fIpath\fR
+.TP
+\fB-o\fR, \fB-\-output-file\fR=\fIfile_path\fR
+The destination path for the updated configuration file. Use "-" to
+send it to stdout.
+
+.TP
+\fB-\-devtree\fR=\fIfile_path\fR
Use \fIpath\fR for device tree path in place of the path of any devicetree
directive found in the template stanza.
+.TP
+\fB-\-devtreedir\fR=\fIfile_path\fR
+Use the specified \fIfile path\fR to load the devicetree definition. This is for
+platforms where a flat file is used instead of firmware to instruct the kernel
+how to communicate with devices.
+
.SS Multiboot Options
-The Multiboot Specification provides a genreic interface for boot
+The Multiboot Specification provides a generic interface for boot
loaders and operating systems. It is supported by the GRUB bootloader.
.TP
\fB-\-add-multiboot\fR=\fImultiboot-path\fR
Add a new boot entry for the multiboot kernel located at
\fImultiboot-path\fR. Note that this is generally accompanied with a
-\fI--add-kernel\fR option.
+\fB--add-kernel\fR option.
.TP
\fB-\-remove-multiboot\fR=\fImultiboot-path\fR
@@ -249,11 +324,63 @@ The command line syntax is more than a little baroque. This probably
won't be fixed as \fBgrubby\fR is only intended to be called from shell
scripts which can get it right.
+.SH EXAMPLE
+
+The following examples assume the following:
+
+.TS
+allbox;
+rbw15 l.
+cfg_file Full path to bootloader config file
+new_kernel Full path to kernel image to be installed
+old_kernel Full path to old kernel image to be removed
+current_kernel Full path to a currently installed kernel
+entry_title Title that appears on bootloader menu
+new_initrd Full path to initrd for a new kernel
+kernel_args Set of arguments for the kernel
+menu_index Index number of a menu entry
+.TE
+
+The examples below quote strings that may have spaces or other whitespace in them. It is also
+perfectly valid to backslash escape these strings if that is more convenient.
+
+.PP
+Add a new kernel entry and copy all options from the current default kernel. This is the behavior
+that most users will want.
+.IP
+\fBgrubby\fR --add-kernel=\fInew_kernel\fR --title="\fIentry_title\fR" --initrd="\fInew_initrd\fR" --copy-default
+.PP
+Add a new kernel entry with custom arguments
+.IP
+\fBgrubby\fR --add-kernel=\fInew_kernel\fR --title="\fIentry_title\fR" --initrd="\fInew_initrd\fR" --args=\fIkernel_args\fR
+.PP
+Remove \fBall menu entries\fR for a specified kernel.
+.IP
+\fBgrubby\fR --remove-kernel=\fIold_kernel\fR
+.PP
+Target a single menu entry to remove without targetting other entries with the same kernel.
+.IP
+\fBgrubby\fR --info=\fIold_kernel\fR
+
+\fBgrubby\fR --remove-kernel=\fImenu_index\fR
+.PP
+Update the arguments for all entries of a specific kernel. New arguments get added while existing arguments get updated values.
+.IP
+\fBgrubby\fR --update-kernel=\fIcurrent_kernel\fR --args="\fIkernel_args\fR"
+.PP
+Remove the arguments for a single entry of a specific kernel.
+.IP
+\fBgrubby\fR --info=\fIcurrent_kernel\fR
+
+\fBgrubby\fR --remove-args=\fImenu_index\fR --args="\fIkernel_args\fR"
+
.SH "SEE ALSO"
.BR grub (8),
.BR lilo (8),
.BR yaboot (8),
+.BR zipl (8),
+.BR dracut (8),
.BR mkinitrd (8)
.SH AUTHORS
@@ -262,4 +389,5 @@ scripts which can get it right.
Erik Troan
Jeremy Katz
Peter Jones
+Robert Marshall
.fi
--
2.17.1

@ -0,0 +1,29 @@
From 850fbd8b0dcc728653993661b92349f3eb2b39a6 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Tue, 28 Jun 2016 16:26:32 -0400
Subject: [PATCH 27/55] Fix inline help typo (#1232168)
Discovered a typo while synchronizing the inline help with the man pages
and fixed it.
Related: rhbz#1232168
---
grubby.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/grubby.c b/grubby.c
index d889399449b..e2384c55898 100644
--- a/grubby.c
+++ b/grubby.c
@@ -4786,7 +4786,7 @@ int main(int argc, const char **argv)
NULL},
{"boot-filesystem", 0, POPT_ARG_STRING, &bootPrefix, 0,
_
- ("filestystem which contains /boot directory (for testing only)"),
+ ("filesystem which contains /boot directory (for testing only)"),
_("bootfs")},
#if defined(__i386__) || defined(__x86_64__) || defined (__powerpc64__) || defined (__ia64__)
{"bootloader-probe", 0, POPT_ARG_NONE, &bootloaderProbe, 0,
--
2.17.1

@ -0,0 +1,213 @@
From b24cd1c5c8467ac6f7c5680db3a49ef6adc8df21 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Tue, 28 Jun 2016 16:50:37 -0400
Subject: [PATCH 28/55] More edits for grubby.8 (#1232168)
- Don't switch between the passive and active voice between the option
descriptions
- keep the same point of view between options ("[it] removes all
entries" vs "remove all entries")
- line wrap everywhere except the example envocations at <80 columns,
not 100.
- consistent use of i386 vs ia32
Signed-off-by: Peter Jones <pjones@redhat.com>
Related: rhbz#1232168
---
grubby.8 | 88 ++++++++++++++++++++++++++++++--------------------------
1 file changed, 48 insertions(+), 40 deletions(-)
diff --git a/grubby.8 b/grubby.8
index 64a6984fba0..690676858ca 100644
--- a/grubby.8
+++ b/grubby.8
@@ -2,11 +2,12 @@
.SH NAME
-grubby \- command line tool used to configure bootloader menu entries across multiple architectures
+grubby \- command line tool used to configure bootloader menu entries across
+multiple architectures
.SH SYNOPSIS
-\fBgrubby\fR [\fIOPTIONS...\fR]
+\fBgrubby\fR [\fIOPTIONS\fR]
.SH DESCRIPTION
@@ -37,13 +38,13 @@ are deprecated in favor of previously mentioned bootloaders. The
.SS Default Behavior
-The default architecture is chosen at compile time. The grubby executable
-has a series of built in assumptions about what bootloader is being used and
-where its configuration file lives. If no output format option is specified
-on the command line then grubby will use these default settings to first
-search for an existing configuration and, if it is not found, assume that
-it should be placed in the standard location. These default assumptions are
-listed in the table below.
+The default bootloader target is primarily determined by the architecture
+for which grubby has been built. Each architecture has a preferred
+bootloader, and each bootloader has its own configuration file. If no
+bootloader is selected on the command line, grubby will use these default
+settings to search for an existing configuration. If no bootloader
+configuration file is found, grubby will use the default value for that
+architecture. These defaults are listed in the table below.
.TS
allbox;
@@ -81,19 +82,18 @@ Add a new boot entry for the kernel located at \fIkernel-path\fR. A title for
the boot entry must be set using \fB-\-title\fR. Most invocations should also
include \fB-\-initrd\fR with memtest86 as a notable exception.
-The \fB-\-update-kernel\fR
-option may not be used in the same invocation.
+The \fB-\-update-kernel\fR option may not be used in the same invocation.
.TP
\fB-\-remove-kernel\fR=\fIkernel-path\fR
-Removes all boot entries which match \fIkernel-path\fR. This may be used
-along with \fB-\-add-kernel\fR, in which case the new kernel being added will
-never be removed.
+Remove all boot entries which match \fIkernel-path\fR. This may be used
+along with \fB-\-add-kernel\fR, in which case the new entry being added will
+not be removed.
.TP
\fB-\-update-kernel\fR=\fIkernel-path\fR
-The entries for kernels matching \fRkernel-path\fR are updated. Currently
-the only items that can be updated is the kernel argument list, which is
+Update the entries for kernels matching \fRkernel-path\fR. Currently
+the only item that can be updated is the kernel argument list, which is
modified via the \fB-\-args\fR and \fB-\-remove-args\fR options.
.TP
@@ -135,7 +135,7 @@ being added.
.TP
\fB-\-efi\fR
-Use linuxefi and initrdefi when constructing bootloader stanzas instead of linux and initrd.
+Use appropriate bootloader commands for EFI on this architecture.
.TP
\fB-\-set-default\fR=\fIkernel-path\fR
@@ -188,16 +188,18 @@ Display information on all boot entries which match \fIkernel-path\fR. I
.TP
\fB-\-bootloader-probe\fR
+Attempt to probe for installed bootloaders. If this option is specified,
\fBgrubby\fR tries to determine if \fBgrub\fR or \fBlilo\fR is currently
-installed. When one of those bootloaders is found the name of that bootloader
-is displayed on stdout. Both could be installed (on different devices), and
-grubby will print out the names of both bootloaders, one per line. The probe
-for \fBgrub\fR requires a commented out boot directive \fBgrub.conf\fR
-identical to the standard directive in the lilo configuration file. If this
-is not present \fBgrubby\fR will assume grub is not installed (note
-that \fBanaconda\fR places this directive in \fBgrub.conf\fR files it creates).
+installed. When one of those bootloaders is found the name of that
+bootloader is displayed on stdout. Both could be installed (on different
+devices), and grubby will print out the names of both bootloaders, one per
+line. The probe for \fBgrub\fR requires a commented out boot directive
+\fBgrub.conf\fR identical to the standard directive in the lilo
+configuration file. If this is not present \fBgrubby\fR will assume grub is
+not installed (note that \fBanaconda\fR places this directive in
+\fBgrub.conf\fR files it creates).
-\fIThis option is only available on i386 platforms.\fR
+\fIThis option is only available on x86 BIOS platforms.\fR
.TP
\fB-v\fR, \fB-\-version\fR
@@ -213,7 +215,8 @@ alternative bootloader.
.TP
\fB-\-elilo\fR
-Use an \fBelilo\fR style configuration file. This is the default on ia64 platforms. This format is deprecated.
+Use an \fBelilo\fR style configuration file. This is the default on ia64
+platforms. This format is deprecated.
.TP
\fB-\-extlinux\fR
@@ -221,13 +224,14 @@ Use an \fBextlinux\fR style configuration file. This format is deprecated.
.TP
\fB-\-grub\fR
-Use a \fBgrub\fR style configuration file. This is the default on ia32 platforms.
+Use a \fBgrub\fR style configuration file. This is the default on the i386
+architecture.
.TP
\fB-\-grub2\fR
-Use a \fBgrub2\fR style configuration file. This is the default on \fBx86_64\fR
-architecture as well as the \fBppc64\fR and \fBppc64le\fR architectures
-running on Power8 or later hardware.
+Use a \fBgrub2\fR style configuration file. This is the default on
+\fBx86_64\fR architecture as well as the \fBppc64\fR and \fBppc64le\fR
+architectures running on Power8 or later hardware.
.TP
\fB-\-lilo\fR
@@ -235,7 +239,8 @@ Use a \fBlilo\fR style configuration file.
.TP
\fB-\-silo\fR
-Use a \fBsilo\fR style configuration file. This is the default on SPARC systems. This format is legacy, deprecated, and unsupported.
+Use a \fBsilo\fR style configuration file. This is the default on SPARC
+systems. This format is legacy, deprecated, and unsupported.
.TP
\fB-\-yaboot\fR
@@ -286,9 +291,9 @@ directive found in the template stanza.
.TP
\fB-\-devtreedir\fR=\fIfile_path\fR
-Use the specified \fIfile path\fR to load the devicetree definition. This is for
-platforms where a flat file is used instead of firmware to instruct the kernel
-how to communicate with devices.
+Use the specified \fIfile path\fR to load the devicetree definition. This is
+for platforms where a flat file is used instead of firmware to instruct the
+kernel how to communicate with devices.
.SS Multiboot Options
@@ -341,12 +346,13 @@ kernel_args Set of arguments for the kernel
menu_index Index number of a menu entry
.TE
-The examples below quote strings that may have spaces or other whitespace in them. It is also
-perfectly valid to backslash escape these strings if that is more convenient.
+The examples below quote strings that may have spaces or other whitespace in
+them. It is also perfectly valid to backslash escape these strings if that
+is more convenient.
.PP
-Add a new kernel entry and copy all options from the current default kernel. This is the behavior
-that most users will want.
+Add a new kernel entry and copy all options from the current default kernel.
+This is the behavior that most users will want.
.IP
\fBgrubby\fR --add-kernel=\fInew_kernel\fR --title="\fIentry_title\fR" --initrd="\fInew_initrd\fR" --copy-default
.PP
@@ -358,13 +364,15 @@ Remove \fBall menu entries\fR for a specified kernel.
.IP
\fBgrubby\fR --remove-kernel=\fIold_kernel\fR
.PP
-Target a single menu entry to remove without targetting other entries with the same kernel.
+Target a single menu entry to remove without targetting other entries with
+the same kernel.
.IP
\fBgrubby\fR --info=\fIold_kernel\fR
\fBgrubby\fR --remove-kernel=\fImenu_index\fR
.PP
-Update the arguments for all entries of a specific kernel. New arguments get added while existing arguments get updated values.
+Update the arguments for all entries of a specific kernel. New arguments get
+added while existing arguments get updated values.
.IP
\fBgrubby\fR --update-kernel=\fIcurrent_kernel\fR --args="\fIkernel_args\fR"
.PP
--
2.17.1

@ -0,0 +1,36 @@
From 79651f6be03752ecaefc9c77e2460e1763f6c0ea Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Fri, 1 Jul 2016 14:24:27 -0400
Subject: [PATCH 29/55] Minor man page changes (#1232168)
Minor wording changes made in the Architecture section after placing the
initial draft up for public comment.
Related: rhbz#1232168
---
grubby.8 | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/grubby.8 b/grubby.8
index 690676858ca..fdf2766fe9a 100644
--- a/grubby.8
+++ b/grubby.8
@@ -29,12 +29,12 @@ Legacy \fBs390\fR and the current \fBs390x\fR architectures
and their \fBzipl\fR bootloader are fully supported.
Support for \fByaboot\fR has been deprecated as all ppc architecture
-hardware since the Power8 system uses \fBgrub2\fR or petitboot
+hardware since the Power8 uses \fBgrub2\fR or petitboot
which both use the grub2 configuration file format.
Legacy bootloaders \fBLILO\fR, \fBSILO\fR, and \fBELILO\fR
-are deprecated in favor of previously mentioned bootloaders. The
-\fBSILO\fR bootloader should also be considered unsupported.
+are deprecated and no longer receiving active support in favor of
+previously mentioned bootloaders.
.SS Default Behavior
--
2.17.1

@ -0,0 +1,66 @@
From 7b34b49d2a08a2636e0319b94d72ab654a30343d Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Thu, 8 Dec 2016 13:39:22 -0500
Subject: [PATCH 30/55] Rename setDefaultImage variables
The variable names in setDefaultImage did not match well with
how they were being used inside the function. Refactored the
variable names as a precursor to refactoring the function.
Related: rhbz#1285601
---
grubby.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/grubby.c b/grubby.c
index e2384c55898..9af8d17b345 100644
--- a/grubby.c
+++ b/grubby.c
@@ -2491,19 +2491,19 @@ void markRemovedImage(struct grubConfig *cfg, const char *image,
entry->skip = 1;
}
-void setDefaultImage(struct grubConfig *config, int hasNew,
- const char *defaultKernelPath, int newIsDefault,
- const char *prefix, int flags, int index)
+void setDefaultImage(struct grubConfig *config, int isUserSpecifiedKernelPath,
+ const char *defaultKernelPath, int newBootEntryIsDefault,
+ const char *prefix, int flags, int newDefaultBootEntryIndex)
{
struct singleEntry *entry, *entry2, *newDefault;
int i, j;
- if (newIsDefault) {
+ if (newBootEntryIsDefault) {
config->defaultImage = 0;
return;
- } else if ((index >= 0) && config->cfi->defaultIsIndex) {
- if (findEntryByIndex(config, index))
- config->defaultImage = index;
+ } else if ((newDefaultBootEntryIndex >= 0) && config->cfi->defaultIsIndex) {
+ if (findEntryByIndex(config, newDefaultBootEntryIndex))
+ config->defaultImage = newDefaultBootEntryIndex;
else
config->defaultImage = -1;
return;
@@ -2531,7 +2531,7 @@ void setDefaultImage(struct grubConfig *config, int hasNew,
if (entry && !entry->skip) {
/* we can preserve the default */
- if (hasNew)
+ if (isUserSpecifiedKernelPath)
config->defaultImage++;
/* count the number of entries erased before this one */
@@ -2540,7 +2540,7 @@ void setDefaultImage(struct grubConfig *config, int hasNew,
if (entry2->skip)
config->defaultImage--;
}
- } else if (hasNew) {
+ } else if (isUserSpecifiedKernelPath) {
config->defaultImage = 0;
} else {
/* Either we just erased the default (or the default line was
--
2.17.1

@ -0,0 +1,198 @@
From 624a75f2d01d986ec78f60319ebc2acd37faada2 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Tue, 13 Dec 2016 14:36:31 -0500
Subject: [PATCH 31/55] Add index constant definitions instead of open-coded
values.
Added numeric constants NO_DEFAULT_ENTRY and FIRST_ENTRY_INDEX. This
clarifies the intent of various assignment operations throughout the
source file.
Related: rhbz#1285601
---
grubby.c | 44 ++++++++++++++++++++++++--------------------
1 file changed, 24 insertions(+), 20 deletions(-)
diff --git a/grubby.c b/grubby.c
index 9af8d17b345..a717c18999b 100644
--- a/grubby.c
+++ b/grubby.c
@@ -132,6 +132,10 @@ struct singleEntry {
#define NEED_DEVTREE (1 << 6)
#define MAIN_DEFAULT (1 << 0)
+#define FIRST_ENTRY_INDEX 0 /* boot entry index value begin and increment
+ from this initial value */
+#define NO_DEFAULT_ENTRY -1 /* indicates that no specific default boot
+ entry was set or currently exists */
#define DEFAULT_SAVED -2
#define DEFAULT_SAVED_GRUB2 -3
@@ -1612,7 +1616,7 @@ static struct grubConfig *readConfig(const char *inName,
*end == ' ' || *end == '\t'))
end++;
if (*end)
- cfg->defaultImage = -1;
+ cfg->defaultImage = NO_DEFAULT_ENTRY;
} else if (defaultLine->numElements == 3) {
char *value = defaultLine->elements[2].item;
while (*value && (*value == '"' ||
@@ -1625,7 +1629,7 @@ static struct grubConfig *readConfig(const char *inName,
*end == ' ' || *end == '\t'))
end++;
if (*end)
- cfg->defaultImage = -1;
+ cfg->defaultImage = NO_DEFAULT_ENTRY;
}
} else if (cfi->defaultSupportSaved &&
!strncmp(defaultLine->elements[1].item, "saved",
@@ -1635,7 +1639,7 @@ static struct grubConfig *readConfig(const char *inName,
cfg->defaultImage =
strtol(defaultLine->elements[1].item, &end, 10);
if (*end)
- cfg->defaultImage = -1;
+ cfg->defaultImage = NO_DEFAULT_ENTRY;
} else if (defaultLine->numElements >= 2) {
int i = 0;
while ((entry = findEntryByIndex(cfg, i))) {
@@ -1663,7 +1667,7 @@ static struct grubConfig *readConfig(const char *inName,
if (entry) {
cfg->defaultImage = i;
} else {
- cfg->defaultImage = -1;
+ cfg->defaultImage = NO_DEFAULT_ENTRY;
}
}
} else if (cfg->cfi->defaultIsSaved && cfg->cfi->getEnv) {
@@ -1680,7 +1684,7 @@ static struct grubConfig *readConfig(const char *inName,
cfg->defaultImage = index;
}
} else {
- cfg->defaultImage = 0;
+ cfg->defaultImage = FIRST_ENTRY_INDEX;
}
return cfg;
@@ -1700,7 +1704,7 @@ static void writeDefault(FILE * out, char *indent,
fprintf(out, "%sdefault%ssaved\n", indent, separator);
else if (cfg->cfi->defaultIsSaved) {
fprintf(out, "%sset default=\"${saved_entry}\"\n", indent);
- if (cfg->defaultImage >= 0 && cfg->cfi->setEnv) {
+ if (cfg->defaultImage >= FIRST_ENTRY_INDEX && cfg->cfi->setEnv) {
char *title;
entry = findEntryByIndex(cfg, cfg->defaultImage);
line = getLineByType(LT_MENUENTRY, entry->lines);
@@ -1713,7 +1717,7 @@ static void writeDefault(FILE * out, char *indent,
"saved_entry", title);
}
}
- } else if (cfg->defaultImage > -1) {
+ } else if (cfg->defaultImage >= FIRST_ENTRY_INDEX) {
if (cfg->cfi->defaultIsIndex) {
if (cfg->cfi->defaultIsVariable) {
fprintf(out, "%sset default=\"%d\"\n", indent,
@@ -2417,7 +2421,7 @@ struct singleEntry *findTemplate(struct grubConfig *cfg, const char *prefix,
}
}
}
- } else if (cfg->defaultImage > -1) {
+ } else if (cfg->defaultImage >= FIRST_ENTRY_INDEX) {
entry = findEntryByIndex(cfg, cfg->defaultImage);
if (entry && suitableImage(entry, prefix, skipRemoved, flags)) {
if (indexPtr)
@@ -2499,20 +2503,20 @@ void setDefaultImage(struct grubConfig *config, int isUserSpecifiedKernelPath,
int i, j;
if (newBootEntryIsDefault) {
- config->defaultImage = 0;
+ config->defaultImage = FIRST_ENTRY_INDEX;
return;
} else if ((newDefaultBootEntryIndex >= 0) && config->cfi->defaultIsIndex) {
if (findEntryByIndex(config, newDefaultBootEntryIndex))
config->defaultImage = newDefaultBootEntryIndex;
else
- config->defaultImage = -1;
+ config->defaultImage = NO_DEFAULT_ENTRY;
return;
} else if (defaultKernelPath) {
i = 0;
if (findEntryByPath(config, defaultKernelPath, prefix, &i)) {
config->defaultImage = i;
} else {
- config->defaultImage = -1;
+ config->defaultImage = NO_DEFAULT_ENTRY;
return;
}
}
@@ -2524,7 +2528,7 @@ void setDefaultImage(struct grubConfig *config, int isUserSpecifiedKernelPath,
/* default is set to saved, we don't want to change it */
return;
- if (config->defaultImage > -1)
+ if (config->defaultImage >= FIRST_ENTRY_INDEX)
entry = findEntryByIndex(config, config->defaultImage);
else
entry = NULL;
@@ -2541,7 +2545,7 @@ void setDefaultImage(struct grubConfig *config, int isUserSpecifiedKernelPath,
config->defaultImage--;
}
} else if (isUserSpecifiedKernelPath) {
- config->defaultImage = 0;
+ config->defaultImage = FIRST_ENTRY_INDEX;
} else {
/* Either we just erased the default (or the default line was
* bad to begin with) and didn't put a new one in. We'll use
@@ -2550,7 +2554,7 @@ void setDefaultImage(struct grubConfig *config, int isUserSpecifiedKernelPath,
findTemplate(config, prefix, &config->defaultImage, 1,
flags);
if (!newDefault)
- config->defaultImage = -1;
+ config->defaultImage = NO_DEFAULT_ENTRY;
}
}
@@ -5175,11 +5179,11 @@ int main(int argc, const char **argv)
struct singleEntry *entry;
char *rootspec;
- if (config->defaultImage == -1)
+ if (config->defaultImage == NO_DEFAULT_ENTRY)
return 0;
if (config->defaultImage == DEFAULT_SAVED_GRUB2 &&
cfi->defaultIsSaved)
- config->defaultImage = 0;
+ config->defaultImage = FIRST_ENTRY_INDEX;
entry = findEntryByIndex(config, config->defaultImage);
if (!entry)
return 0;
@@ -5202,11 +5206,11 @@ int main(int argc, const char **argv)
struct singleLine *line;
struct singleEntry *entry;
- if (config->defaultImage == -1)
+ if (config->defaultImage == NO_DEFAULT_ENTRY)
return 0;
if (config->defaultImage == DEFAULT_SAVED_GRUB2 &&
cfi->defaultIsSaved)
- config->defaultImage = 0;
+ config->defaultImage = FIRST_ENTRY_INDEX;
entry = findEntryByIndex(config, config->defaultImage);
if (!entry)
return 0;
@@ -5236,11 +5240,11 @@ int main(int argc, const char **argv)
return 0;
} else if (displayDefaultIndex) {
- if (config->defaultImage == -1)
+ if (config->defaultImage == NO_DEFAULT_ENTRY)
return 0;
if (config->defaultImage == DEFAULT_SAVED_GRUB2 &&
cfi->defaultIsSaved)
- config->defaultImage = 0;
+ config->defaultImage = FIRST_ENTRY_INDEX;
printf("%i\n", config->defaultImage);
return 0;
--
2.17.1

@ -0,0 +1,50 @@
From 12ae8096bd3099b81fded8c30be1a8050ed7e68c Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Thu, 8 Dec 2016 16:52:45 -0500
Subject: [PATCH 32/55] Track configuration modifications
The setDefaultImage function had a subtle dependency on being run before
addNewKernel is invoked. Added the ability to track invocation to
prevent them from being so tightly coupled.
Related: rhbz#1285601
---
grubby.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/grubby.c b/grubby.c
index a717c18999b..1f712ec1391 100644
--- a/grubby.c
+++ b/grubby.c
@@ -678,6 +678,8 @@ struct grubConfig {
int fallbackImage; /* just like defaultImage */
int flags;
struct configFileInfo *cfi;
+ int isModified; /* assumes only one entry added
+ per invocation of grubby */
};
blkid_cache blkid;
@@ -1297,6 +1299,7 @@ static struct grubConfig *readConfig(const char *inName,
cfg->theLines = NULL;
cfg->entries = NULL;
cfg->fallbackImage = 0;
+ cfg->isModified = 0;
/* copy everything we have */
while (*head) {
@@ -4726,8 +4729,10 @@ int addNewKernel(struct grubConfig *config, struct singleEntry *template,
}
if (updateImage(config, indexs, prefix, newKernelArgs, NULL,
- newMBKernelArgs, NULL))
+ newMBKernelArgs, NULL)) {
+ config->isModified = 1;
return 1;
+ }
return 0;
}
--
2.17.1

@ -0,0 +1,65 @@
From 5ec8c855f307a89f08013c832bd7e121c8f83327 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Thu, 15 Dec 2016 21:47:28 -0500
Subject: [PATCH 33/55] Fix some test cases where the resulting default index
is wrong
Fix two issues with tests where removing a kernel or adding a boot entry
at a user specified index had the wrong default index selected in the
expected output.
One of these issues is the --set-index test cases for grub 1, which
expect --make-default is implied where it should not be.
The third is a removal test, where the default index in the result data
is off by one when we've removed 2 entries keyed off of the kernel
filesystem path.
This change causes these test cases to fail.
Resolves: rhbz#1285601
---
test/results/add/g1.17 | 2 +-
test/results/add/g1.9 | 2 +-
test/results/remove/g7.1 | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/test/results/add/g1.17 b/test/results/add/g1.17
index 6a388228768..eda4e93329d 100644
--- a/test/results/add/g1.17
+++ b/test/results/add/g1.17
@@ -7,7 +7,7 @@
# kernel /vmlinuz-version ro root=/dev/sda1
# initrd /initrd-version.img
#boot=/dev/hda
-default=1
+default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.7-2)
diff --git a/test/results/add/g1.9 b/test/results/add/g1.9
index 310623d13d2..8976e762d74 100644
--- a/test/results/add/g1.9
+++ b/test/results/add/g1.9
@@ -7,7 +7,7 @@
# kernel /vmlinuz-version ro root=/dev/sda1
# initrd /initrd-version.img
#boot=/dev/hda
-default=2
+default=1
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.7-2)
diff --git a/test/results/remove/g7.1 b/test/results/remove/g7.1
index ea1a6fbaec9..611d7a16685 100644
--- a/test/results/remove/g7.1
+++ b/test/results/remove/g7.1
@@ -1,4 +1,4 @@
-default=1
+default=0
timeout=10
splashimage=(hd0,5)/boot/grub/splash.xpm.gz
--
2.17.1

@ -0,0 +1,197 @@
From ff38bf8209faf54c25e15b1fcec4184fee1f39e9 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Tue, 13 Dec 2016 18:20:15 -0500
Subject: [PATCH 34/55] Don't assume --make-default just because --set-index
was passed.
grubby previously made the assumption that every time a new
boot entry gets added using --set-index, it should be the default. Due
to this behavior, it also masked an logic error that prevented the
selection of the proper index in cases where it was necessary to
dynamically pick a new default boot entry, or to keep the existing
default boot entry when its position in the config file moved.
Resolves: rhbz#1285601
---
grubby.c | 138 ++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 97 insertions(+), 41 deletions(-)
diff --git a/grubby.c b/grubby.c
index 1f712ec1391..fcca6364887 100644
--- a/grubby.c
+++ b/grubby.c
@@ -2498,66 +2498,121 @@ void markRemovedImage(struct grubConfig *cfg, const char *image,
entry->skip = 1;
}
-void setDefaultImage(struct grubConfig *config, int isUserSpecifiedKernelPath,
+void setDefaultImage(struct grubConfig *config, int isAddingBootEntry,
const char *defaultKernelPath, int newBootEntryIsDefault,
- const char *prefix, int flags, int newDefaultBootEntryIndex)
+ const char *prefix, int flags,
+ int newDefaultBootEntryIndex, int newBootEntryIndex)
{
- struct singleEntry *entry, *entry2, *newDefault;
- int i, j;
+ struct singleEntry *bootEntry, *newDefault;
+ int indexToVerify, firstKernelEntryIndex, currentLookupIndex;
+ /* handle the two cases where the user explictly picks the default
+ * boot entry index as it would exist post-modification */
+
+ /* Case 1: user chose to make the latest boot entry the default */
if (newBootEntryIsDefault) {
- config->defaultImage = FIRST_ENTRY_INDEX;
+ config->defaultImage = newBootEntryIndex;
return;
- } else if ((newDefaultBootEntryIndex >= 0) && config->cfi->defaultIsIndex) {
- if (findEntryByIndex(config, newDefaultBootEntryIndex))
+ }
+
+ /* Case 2: user picked an arbitrary index as the default boot entry */
+ if (newDefaultBootEntryIndex >= FIRST_ENTRY_INDEX
+ && config->cfi->defaultIsIndex) {
+ indexToVerify = newDefaultBootEntryIndex;
+
+ /* user chose to make latest boot entry the default */
+ if (newDefaultBootEntryIndex == newBootEntryIndex) {
+ config->defaultImage = newBootEntryIndex;
+ return;
+ }
+
+ /* the user picks the default index based on the
+ * order of the bootloader configuration after
+ * modification; ensure we are checking for the
+ * existence of the correct entry */
+ if (newBootEntryIndex < newDefaultBootEntryIndex) {
+ if (!config->isModified)
+ indexToVerify--;
+ }
+
+ /* verify the user selected index will exist */
+ if (findEntryByIndex(config, indexToVerify)) {
config->defaultImage = newDefaultBootEntryIndex;
- else
- config->defaultImage = NO_DEFAULT_ENTRY;
- return;
- } else if (defaultKernelPath) {
- i = 0;
- if (findEntryByPath(config, defaultKernelPath, prefix, &i)) {
- config->defaultImage = i;
} else {
config->defaultImage = NO_DEFAULT_ENTRY;
- return;
}
- }
- /* defaultImage now points to what we'd like to use, but before any
- * order changes */
- if ((config->defaultImage == DEFAULT_SAVED) ||
- (config->defaultImage == DEFAULT_SAVED_GRUB2))
- /* default is set to saved, we don't want to change it */
return;
+ }
- if (config->defaultImage >= FIRST_ENTRY_INDEX)
- entry = findEntryByIndex(config, config->defaultImage);
- else
- entry = NULL;
+ /* handle cases where the index value may shift */
- if (entry && !entry->skip) {
- /* we can preserve the default */
- if (isUserSpecifiedKernelPath)
+ /* check validity of existing default or first-entry-found
+ selection */
+ if (defaultKernelPath) {
+ /* user requested first-entry-found */
+ if (!findEntryByPath(config, defaultKernelPath,
+ prefix, &firstKernelEntryIndex)) {
+ /* don't change default if can't find match */
+ config->defaultImage = NO_DEFAULT_ENTRY;
+ return;
+ }
+
+ config->defaultImage = firstKernelEntryIndex;
+
+ /* this is where we start looking for decrement later */
+ currentLookupIndex = config->defaultImage;
+
+ if (isAddingBootEntry && !config->isModified &&
+ (newBootEntryIndex < config->defaultImage)) {
+ /* increment because new entry added before default */
config->defaultImage++;
-
- /* count the number of entries erased before this one */
- for (j = 0; j < config->defaultImage; j++) {
- entry2 = findEntryByIndex(config, j);
- if (entry2->skip)
- config->defaultImage--;
}
- } else if (isUserSpecifiedKernelPath) {
- config->defaultImage = FIRST_ENTRY_INDEX;
} else {
- /* Either we just erased the default (or the default line was
- * bad to begin with) and didn't put a new one in. We'll use
- * the first valid image. */
+ /* use pre-existing default entry */
+ currentLookupIndex = config->defaultImage;
+
+ if (isAddingBootEntry
+ && (newBootEntryIndex <= config->defaultImage)) {
+ config->defaultImage++;
+
+ if (config->isModified) {
+ currentLookupIndex++;
+ }
+ }
+ }
+
+ /* sanity check - is this entry index valid? */
+ bootEntry = findEntryByIndex(config, currentLookupIndex);
+
+ if ((bootEntry && bootEntry->skip) || !bootEntry) {
+ /* entry is to be skipped or is invalid */
+ if (isAddingBootEntry) {
+ config->defaultImage = newBootEntryIndex;
+ return;
+ }
newDefault =
findTemplate(config, prefix, &config->defaultImage, 1,
flags);
- if (!newDefault)
+ if (!newDefault) {
config->defaultImage = NO_DEFAULT_ENTRY;
+ }
+
+ return;
+ }
+
+ currentLookupIndex--;
+
+ /* decrement index by the total number of entries deleted */
+
+ for (indexToVerify = currentLookupIndex;
+ indexToVerify >= FIRST_ENTRY_INDEX; indexToVerify--) {
+
+ bootEntry = findEntryByIndex(config, indexToVerify);
+
+ if (bootEntry && bootEntry->skip) {
+ config->defaultImage--;
+ }
}
}
@@ -5265,7 +5320,8 @@ int main(int argc, const char **argv)
markRemovedImage(config, removeKernelPath, bootPrefix);
markRemovedImage(config, removeMBKernel, bootPrefix);
setDefaultImage(config, newKernelPath != NULL, defaultKernel,
- makeDefault, bootPrefix, flags, defaultIndex);
+ makeDefault, bootPrefix, flags, defaultIndex,
+ newIndex);
setFallbackImage(config, newKernelPath != NULL);
if (updateImage(config, updateKernelPath, bootPrefix, newKernelArgs,
removeArgs, newMBKernelArgs, removeMBKernelArgs))
--
2.17.1

@ -0,0 +1,32 @@
From 8836f04b716c9ca56b518627c3d8064f18f9c33d Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Thu, 15 Dec 2016 21:53:31 -0500
Subject: [PATCH 35/55] Clarify --set-default-index in the man page.
This changes the man page to say that the index value provided with
--set-default-index applies to the boot entry list after modifications.
Resolves: rhbz#1285601
---
grubby.8 | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/grubby.8 b/grubby.8
index fdf2766fe9a..1e8f140c4df 100644
--- a/grubby.8
+++ b/grubby.8
@@ -144,8 +144,9 @@ boot entry. This may not be invoked with \fB-\-set-default-index\fR.
.TP
\fB-\-set-default-index\fR=\fIentry-index\fR
-Makes the given entry number the default boot entry. This may not
-be invoked with \fB-\-set-default\fR.
+Makes the given entry number the default boot entry. This may not be invoked
+with \fB-\-set-default\fR. The given value represents the index in the
+post-modification boot entry list.
.TP
\fB-\-make-default\fR
--
2.17.1

@ -0,0 +1,261 @@
From 2d19bc931b0b2a70abc18f6d15dddbf547cafd94 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Thu, 22 Dec 2016 17:40:52 -0500
Subject: [PATCH 36/55] Add multi-entry removal test (#1285601)
Test what happens to the default entry set in the grub environment after
removing the first two boot entries.
Related: rhbz#1285601
---
test.sh | 7 ++
test/grub2-support_files/grubenv.4 | 3 +
test/grub2.19 | 112 +++++++++++++++++++++++++++++
test/results/remove/g2.19 | 88 +++++++++++++++++++++++
4 files changed, 210 insertions(+)
create mode 100644 test/grub2-support_files/grubenv.4
create mode 100644 test/grub2.19
create mode 100644 test/results/remove/g2.19
diff --git a/test.sh b/test.sh
index fb7cd2381d5..1ef9eca535d 100755
--- a/test.sh
+++ b/test.sh
@@ -565,6 +565,13 @@ if [ "$testgrub2" == "y" ]; then
--copy-default --title 'Red Hat Enterprise Linux Server' \
--args=root=/dev/mapper/foo--
+ grub2Test grub2.19 remove/g2.19 --env grubenv.4 \
+ --remove-kernel=/boot/vmlinuz-2.6.38.2-9.fc15.x86_64 \
+ --boot-filesystem=/boot/
+ commandTest "saved_default output" \
+ "grub2-editenv test/grub2-support_files/env_temp list" \
+ "saved_entry=Linux, with Fedora 2.6.38.8-32.fc15.x86_64"
+
# copy a stanza and add arguments as well, while using --set-index=
testing="GRUB2 add stanza and new args with --set-index="
grub2Test grub2.18 add/g2-1.18 --env grubenv.3 \
diff --git a/test/grub2-support_files/grubenv.4 b/test/grub2-support_files/grubenv.4
new file mode 100644
index 00000000000..13116382feb
--- /dev/null
+++ b/test/grub2-support_files/grubenv.4
@@ -0,0 +1,3 @@
+# GRUB Environment Block
+saved_entry=Linux, with Fedora 2.6.38.8-32.fc15.x86_64
+################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
diff --git a/test/grub2.19 b/test/grub2.19
new file mode 100644
index 00000000000..be07b3ea6b3
--- /dev/null
+++ b/test/grub2.19
@@ -0,0 +1,112 @@
+#
+# 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 ###
+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 {
+ insmod vbe
+ insmod vga
+ insmod video_bochs
+ insmod video_cirrus
+}
+
+set timeout=5
+### END /etc/grub.d/00_header ###
+
+### BEGIN /etc/grub.d/10_linux ###
+menuentry 'First Title To Remove' --class gnu-linux --class gnu --class os {
+ load_video
+ set gfxpayload=keep
+ insmod part_msdos
+ insmod ext2
+ set root='(hd0,msdos1)'
+ search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+ echo 'Loading Linux 2.6.38.2-9.fc15.x86_64 ...'
+ linux /vmlinuz-2.6.38.2-9.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+ echo 'Loading initial ramdisk ...'
+ initrd /initramfs-2.6.38.2-9.fc15.x86_64.img
+}
+menuentry 'Second Title To Remove' --class gnu-linux --class gnu --class os {
+ load_video
+ set gfxpayload=keep
+ insmod part_msdos
+ insmod ext2
+ set root='(hd0,msdos1)'
+ search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+ echo 'Loading Linux 2.6.38.2-9.fc15.x86_64 ...'
+ linux /vmlinuz-2.6.38.2-9.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+ echo 'Loading initial ramdisk ...'
+ initrd /initramfs-2.6.38.2-9.fc15.x86_64.img
+}
+menuentry 'Linux, with Fedora 2.6.38.8-32.fc15.x86_64' --class gnu-linux --class gnu --class os {
+ load_video
+ set gfxpayload=keep
+ insmod part_msdos
+ insmod ext2
+ set root='(hd0,msdos1)'
+ search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+ echo 'Loading Fedora 2.6.38.8-32.fc15.x86_64 ...'
+ linux /vmlinuz-2.6.38.8-32.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+ echo 'Loading initial ramdisk ...'
+ initrd /initramfs-2.6.38.8-32.fc15.x86_64.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/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 $prefix/custom.cfg ]; then
+ source $prefix/custom.cfg;
+fi
+### END /etc/grub.d/41_custom ###
+
+### BEGIN /etc/grub.d/90_persistent ###
+### END /etc/grub.d/90_persistent ###
diff --git a/test/results/remove/g2.19 b/test/results/remove/g2.19
new file mode 100644
index 00000000000..f65edd5ac29
--- /dev/null
+++ b/test/results/remove/g2.19
@@ -0,0 +1,88 @@
+#
+# 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 ###
+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 {
+ insmod vbe
+ insmod vga
+ insmod video_bochs
+ insmod video_cirrus
+}
+
+set timeout=5
+### END /etc/grub.d/00_header ###
+
+### BEGIN /etc/grub.d/10_linux ###
+menuentry 'Linux, with Fedora 2.6.38.8-32.fc15.x86_64' --class gnu-linux --class gnu --class os {
+ load_video
+ set gfxpayload=keep
+ insmod part_msdos
+ insmod ext2
+ set root='(hd0,msdos1)'
+ search --no-floppy --fs-uuid --set=root df0170c9-7d05-415c-bbd1-d4d503ba0eed
+ echo 'Loading Fedora 2.6.38.8-32.fc15.x86_64 ...'
+ linux /vmlinuz-2.6.38.8-32.fc15.x86_64 root=/dev/mapper/vg_pjones5-lv_root ro quiet rhgb
+ echo 'Loading initial ramdisk ...'
+ initrd /initramfs-2.6.38.8-32.fc15.x86_64.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/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 $prefix/custom.cfg ]; then
+ source $prefix/custom.cfg;
+fi
+### END /etc/grub.d/41_custom ###
+
+### BEGIN /etc/grub.d/90_persistent ###
+### END /etc/grub.d/90_persistent ###
--
2.17.1

@ -0,0 +1,40 @@
From 46843e71656264d98ceda79985e5d341a8d58aa7 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Thu, 22 Dec 2016 17:52:14 -0500
Subject: [PATCH 37/55] Fix findTemplate index logic (#1285601)
The fallback case where findTemplate has to look for the first entry
contained a logic flaw that could return an incorrect index. This
discovered index should be reduced by one for each boot entry that will
be skipped in the final output. The flaw occurred because the index
variable was used for the loop upper bound at the same time as it was
being decremented within the actual loop body. The loop would thus fail
to examine a number of boot entries equal to the total number of
iterations the loop performed.
Related: rhbz#1285601
---
grubby.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/grubby.c b/grubby.c
index fcca6364887..692c351ccb6 100644
--- a/grubby.c
+++ b/grubby.c
@@ -2436,8 +2436,11 @@ struct singleEntry *findTemplate(struct grubConfig *cfg, const char *prefix,
index = 0;
while ((entry = findEntryByIndex(cfg, index))) {
if (suitableImage(entry, prefix, skipRemoved, flags)) {
- int j;
- for (j = 0; j < index; j++) {
+ int j, unmodifiedIndex;
+
+ unmodifiedIndex = index;
+
+ for (j = 0; j < unmodifiedIndex; j++) {
entry2 = findEntryByIndex(cfg, j);
if (entry2->skip)
index--;
--
2.17.1

@ -0,0 +1,43 @@
From d3c64808b6fc4794e2c58b1812315914966afea9 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Thu, 22 Dec 2016 17:56:44 -0500
Subject: [PATCH 38/55] Write correct default to environment (#1285601)
grubby writes the title of the default boot entry to the bootloader
environment. The title lookup did not correctly account for the offset
required if some boot entries were marked for removal.
Related: rhbz#1285601
---
grubby.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/grubby.c b/grubby.c
index 692c351ccb6..9edb26d0ded 100644
--- a/grubby.c
+++ b/grubby.c
@@ -1709,7 +1709,20 @@ static void writeDefault(FILE * out, char *indent,
fprintf(out, "%sset default=\"${saved_entry}\"\n", indent);
if (cfg->defaultImage >= FIRST_ENTRY_INDEX && cfg->cfi->setEnv) {
char *title;
- entry = findEntryByIndex(cfg, cfg->defaultImage);
+ int trueIndex, currentIndex;
+
+ trueIndex = 0;
+ currentIndex = 0;
+
+ while ((entry = findEntryByIndex(cfg, currentIndex))) {
+ if (!entry->skip) {
+ if (trueIndex == cfg->defaultImage) {
+ break;
+ }
+ trueIndex++;
+ }
+ currentIndex++;
+ }
line = getLineByType(LT_MENUENTRY, entry->lines);
if (!line)
line = getLineByType(LT_TITLE, entry->lines);
--
2.17.1

@ -0,0 +1,29 @@
From d124974021199ddee0d1af1b2c7866f533c2f23a Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Mon, 27 Feb 2017 15:59:53 -0500
Subject: [PATCH 39/55] Initialize variable for ppc environment (#1285601)
Building on PPC does not default the value of an uninitialized integer
to zero which caused test failures.
Related: rhbz#1285601
---
grubby.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/grubby.c b/grubby.c
index 9edb26d0ded..9ccad2735dd 100644
--- a/grubby.c
+++ b/grubby.c
@@ -2566,6 +2566,8 @@ void setDefaultImage(struct grubConfig *config, int isAddingBootEntry,
/* check validity of existing default or first-entry-found
selection */
if (defaultKernelPath) {
+ /* we must initialize this */
+ firstKernelEntryIndex = 0;
/* user requested first-entry-found */
if (!findEntryByPath(config, defaultKernelPath,
prefix, &firstKernelEntryIndex)) {
--
2.17.1

@ -0,0 +1,64 @@
From a8367596ca63156509eed0b332a077247765b811 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Tue, 28 Feb 2017 18:31:56 -0500
Subject: [PATCH 40/55] Fix initial saved_entry read issue (#1285601)
If a system has never had a kernel upgrade/rollback then grubby
does not read saved_entry properly. Added a guard to catch
saved_entry and read it to pick the proper index in these cases.
Resolves: rhbz#1285601
---
grubby.c | 29 +++++++++++++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/grubby.c b/grubby.c
index 9ccad2735dd..974b81c7864 100644
--- a/grubby.c
+++ b/grubby.c
@@ -2522,6 +2522,9 @@ void setDefaultImage(struct grubConfig *config, int isAddingBootEntry,
struct singleEntry *bootEntry, *newDefault;
int indexToVerify, firstKernelEntryIndex, currentLookupIndex;
+ /* initialize */
+ currentLookupIndex = FIRST_ENTRY_INDEX;
+
/* handle the two cases where the user explictly picks the default
* boot entry index as it would exist post-modification */
@@ -2587,8 +2590,30 @@ void setDefaultImage(struct grubConfig *config, int isAddingBootEntry,
config->defaultImage++;
}
} else {
- /* use pre-existing default entry */
- currentLookupIndex = config->defaultImage;
+ /* check to see if the default is stored in the environment */
+ if (config->defaultImage < FIRST_ENTRY_INDEX) {
+ if (config->defaultImage == DEFAULT_SAVED || config->defaultImage == DEFAULT_SAVED_GRUB2)
+ {
+ if (config->cfi->defaultIsSaved) {
+ if (config->cfi->getEnv) {
+ char *defaultTitle = config->cfi->getEnv(config->cfi, "saved_entry");
+
+ if (defaultTitle) {
+ if (isnumber(defaultTitle)) {
+ currentLookupIndex = atoi(defaultTitle);
+ } else {
+ findEntryByTitle(config, defaultTitle, &currentLookupIndex);
+ }
+ /* set the default Image to an actual index */
+ config->defaultImage = currentLookupIndex;
+ }
+ }
+ }
+ }
+ } else {
+ /* use pre-existing default entry from the file*/
+ currentLookupIndex = config->defaultImage;
+ }
if (isAddingBootEntry
&& (newBootEntryIndex <= config->defaultImage)) {
--
2.17.1

@ -0,0 +1,74 @@
From 4d48c517db42b6d7f30d7d2441863704bd01eb11 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Tue, 14 Mar 2017 22:55:27 -0400
Subject: [PATCH 41/55] Add s390/s390x --info test (#1285601)
Running the --info grubby option on s390/s390x platforms always returned
the (null) value. Added a test to look at --info and ensure it comes out
as a user would expect.
Resolves: rhbz#1285601
---
test.sh | 2 ++
test/results/info/z2.1 | 6 ++++++
test/zipl.2 | 22 ++++++++++++++++++++++
3 files changed, 30 insertions(+)
create mode 100644 test/results/info/z2.1
create mode 100644 test/zipl.2
diff --git a/test.sh b/test.sh
index 1ef9eca535d..afa4f705b2b 100755
--- a/test.sh
+++ b/test.sh
@@ -320,6 +320,8 @@ testing="Z/IPL display default title"
ziplDisplayTest zipl.1 defaulttitle/z.1 --default-title
testing="Z/IPL display default kernel"
ziplDisplayTest zipl.1 defaultkernel/z.1 --default-kernel
+testing="Z/IPL display entry information"
+ziplDisplayTest zipl.2 info/z2.1 --info=1
testing="GRUB fallback directive"
grubTest grub.5 fallback/g5.1 --remove-kernel=/boot/vmlinuz-2.4.7-ac3 \
diff --git a/test/results/info/z2.1 b/test/results/info/z2.1
new file mode 100644
index 00000000000..e5ce3a1a61f
--- /dev/null
+++ b/test/results/info/z2.1
@@ -0,0 +1,6 @@
+index=1
+kernel=/boot/vmlinuz-3.10.0-514.6.2.el7.s390x
+args="crashkernel=auto rd.dasd=0.0.0120 rd.dasd=0.0.0121 rd.dasd=0.0.0122 rd.dasd=0.0.0123 rd.lvm.lv=rhel_ibm-z-68/root rd.lvm.lv=rhel_ibm-z-68/swap rd.znet=qeth,0.0.8000,0.0.8001,0.0.8002,layer2=1,portname=z-68,portno=0 LANG=en_US.UTF-8 systemd.log_level=debug systemd.log_target=kmsg"
+root=/dev/mapper/rhel_ibm--z--68-root
+initrd=/boot/initramfs-3.10.0-514.6.2.el7.s390x.img
+title=3.10.0-514.6.2.el7.s390x_with_debugging
diff --git a/test/zipl.2 b/test/zipl.2
new file mode 100644
index 00000000000..f064b2a36d5
--- /dev/null
+++ b/test/zipl.2
@@ -0,0 +1,22 @@
+[defaultboot]
+defaultauto
+prompt=1
+timeout=5
+default=3.10.0-514.6.2.el7.s390x_with_debugging
+target=/boot
+[3.10.0-514.6.2.el7.s390x]
+ image=/boot/vmlinuz-3.10.0-514.6.2.el7.s390x
+ parameters="root=/dev/mapper/rhel_ibm--z--68-root crashkernel=auto rd.dasd=0.0.0120 rd.dasd=0.0.0121 rd.dasd=0.0.0122 rd.dasd=0.0.0123 rd.lvm.lv=rhel_ibm-z-68/root rd.lvm.lv=rhel_ibm-z-68/swap rd.znet=qeth,0.0.8000,0.0.8001,0.0.8002,layer2=1,portname=z-68,portno=0 LANG=en_US.UTF-8"
+ ramdisk=/boot/initramfs-3.10.0-514.6.2.el7.s390x.img
+[3.10.0-514.6.2.el7.s390x_with_debugging]
+ image=/boot/vmlinuz-3.10.0-514.6.2.el7.s390x
+ parameters="root=/dev/mapper/rhel_ibm--z--68-root crashkernel=auto rd.dasd=0.0.0120 rd.dasd=0.0.0121 rd.dasd=0.0.0122 rd.dasd=0.0.0123 rd.lvm.lv=rhel_ibm-z-68/root rd.lvm.lv=rhel_ibm-z-68/swap rd.znet=qeth,0.0.8000,0.0.8001,0.0.8002,layer2=1,portname=z-68,portno=0 LANG=en_US.UTF-8 systemd.log_level=debug systemd.log_target=kmsg"
+ ramdisk=/boot/initramfs-3.10.0-514.6.2.el7.s390x.img
+[linux]
+ image=/boot/vmlinuz-3.10.0-514.el7.s390x
+ ramdisk=/boot/initramfs-3.10.0-514.el7.s390x.img
+ parameters="root=/dev/mapper/rhel_ibm--z--68-root crashkernel=auto rd.dasd=0.0.0120 rd.dasd=0.0.0121 rd.dasd=0.0.0122 rd.dasd=0.0.0123 rd.lvm.lv=rhel_ibm-z-68/root rd.lvm.lv=rhel_ibm-z-68/swap rd.znet=qeth,0.0.8000,0.0.8001,0.0.8002,layer2=1,portname=z-68,portno=0 LANG=en_US.UTF-8"
+[linux-0-rescue-196fd0394b7442a6838686745f03fd04]
+ image=/boot/vmlinuz-0-rescue-196fd0394b7442a6838686745f03fd04
+ ramdisk=/boot/initramfs-0-rescue-196fd0394b7442a6838686745f03fd04.img
+ parameters="root=/dev/mapper/rhel_ibm--z--68-root crashkernel=auto rd.dasd=0.0.0120 rd.dasd=0.0.0121 rd.dasd=0.0.0122 rd.dasd=0.0.0123 rd.lvm.lv=rhel_ibm-z-68/root rd.lvm.lv=rhel_ibm-z-68/swap rd.znet=qeth,0.0.8000,0.0.8001,0.0.8002,layer2=1,portname=z-68,portno=0"
--
2.17.1

@ -0,0 +1,59 @@
From 8d81aeffcb1c2f9706dfe625a2f9f5e61f8a5c63 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Tue, 14 Mar 2017 15:20:53 -0400
Subject: [PATCH 42/55] Fix --info for s390x/s390 (#1285601)
The --info flag for grubby on s390/s390x always returned (null). Fixed
codepath to use extractTitle where necessary and get the actual title.
Related: rhbz#1285601
---
grubby.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/grubby.c b/grubby.c
index 974b81c7864..9bf051dfed4 100644
--- a/grubby.c
+++ b/grubby.c
@@ -2684,7 +2684,7 @@ void setFallbackImage(struct grubConfig *config, int hasNew)
}
}
-void displayEntry(struct singleEntry *entry, const char *prefix, int index)
+void displayEntry(struct grubConfig *config, struct singleEntry *entry, const char *prefix, int index)
{
struct singleLine *line;
char *root = NULL;
@@ -2780,7 +2780,14 @@ void displayEntry(struct singleEntry *entry, const char *prefix, int index)
line = getLineByType(LT_TITLE, entry->lines);
if (line) {
- printf("title=%s\n", line->elements[1].item);
+ char *entryTitle;
+ /* if we can extractTitle, then it's a zipl config and
+ * if not then we go ahead with what's existed prior */
+ entryTitle = extractTitle(config, line);
+ if (!entryTitle) {
+ entryTitle=line->elements[1].item;
+ }
+ printf("title=%s\n", entryTitle);
} else {
char *title;
line = getLineByType(LT_MENUENTRY, entry->lines);
@@ -3196,11 +3203,11 @@ int displayInfo(struct grubConfig *config, char *kernel, const char *prefix)
printf("lba\n");
}
- displayEntry(entry, prefix, i);
+ displayEntry(config, entry, prefix, i);
i++;
while ((entry = findEntryByPath(config, kernel, prefix, &i))) {
- displayEntry(entry, prefix, i);
+ displayEntry(config, entry, prefix, i);
i++;
}
--
2.17.1

@ -0,0 +1,59 @@
From 6d2322507be50c828c400a6de0cd48bf30dfa1b1 Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Tue, 14 Mar 2017 22:39:20 -0400
Subject: [PATCH 43/55] Add s390/s390x set-default-index test (#1285601)
Adds a test to ensure set-default-index actually works for s390 and
s390x platforms.
Related: rhbz#1285601
---
test.sh | 2 ++
test/results/default/z2.1 | 22 ++++++++++++++++++++++
2 files changed, 24 insertions(+)
create mode 100644 test/results/default/z2.1
diff --git a/test.sh b/test.sh
index afa4f705b2b..aaa6e9323a6 100755
--- a/test.sh
+++ b/test.sh
@@ -314,6 +314,8 @@ liloDisplayTest lilo.1 defaultkernel/l1.1 --default-kernel
testing="Z/IPL default directive"
ziplTest zipl.1 default/z1.1 --add-kernel /boot/new-kernel --title test
ziplTest zipl.1 default/z1.2 --add-kernel /boot/new-kernel --title test --make-default
+testing="Z/IPL default index directive"
+ziplTest zipl.2 default/z2.1 --set-default-index=0
testing="Z/IPL display default index"
ziplDisplayTest zipl.1 defaultindex/0 --default-index
testing="Z/IPL display default title"
diff --git a/test/results/default/z2.1 b/test/results/default/z2.1
new file mode 100644
index 00000000000..93e7491e00a
--- /dev/null
+++ b/test/results/default/z2.1
@@ -0,0 +1,22 @@
+[defaultboot]
+defaultauto
+prompt=1
+timeout=5
+default=3.10.0-514.6.2.el7.s390x
+target=/boot
+[3.10.0-514.6.2.el7.s390x]
+ image=/boot/vmlinuz-3.10.0-514.6.2.el7.s390x
+ parameters="root=/dev/mapper/rhel_ibm--z--68-root crashkernel=auto rd.dasd=0.0.0120 rd.dasd=0.0.0121 rd.dasd=0.0.0122 rd.dasd=0.0.0123 rd.lvm.lv=rhel_ibm-z-68/root rd.lvm.lv=rhel_ibm-z-68/swap rd.znet=qeth,0.0.8000,0.0.8001,0.0.8002,layer2=1,portname=z-68,portno=0 LANG=en_US.UTF-8"
+ ramdisk=/boot/initramfs-3.10.0-514.6.2.el7.s390x.img
+[3.10.0-514.6.2.el7.s390x_with_debugging]
+ image=/boot/vmlinuz-3.10.0-514.6.2.el7.s390x
+ parameters="root=/dev/mapper/rhel_ibm--z--68-root crashkernel=auto rd.dasd=0.0.0120 rd.dasd=0.0.0121 rd.dasd=0.0.0122 rd.dasd=0.0.0123 rd.lvm.lv=rhel_ibm-z-68/root rd.lvm.lv=rhel_ibm-z-68/swap rd.znet=qeth,0.0.8000,0.0.8001,0.0.8002,layer2=1,portname=z-68,portno=0 LANG=en_US.UTF-8 systemd.log_level=debug systemd.log_target=kmsg"
+ ramdisk=/boot/initramfs-3.10.0-514.6.2.el7.s390x.img
+[linux]
+ image=/boot/vmlinuz-3.10.0-514.el7.s390x
+ ramdisk=/boot/initramfs-3.10.0-514.el7.s390x.img
+ parameters="root=/dev/mapper/rhel_ibm--z--68-root crashkernel=auto rd.dasd=0.0.0120 rd.dasd=0.0.0121 rd.dasd=0.0.0122 rd.dasd=0.0.0123 rd.lvm.lv=rhel_ibm-z-68/root rd.lvm.lv=rhel_ibm-z-68/swap rd.znet=qeth,0.0.8000,0.0.8001,0.0.8002,layer2=1,portname=z-68,portno=0 LANG=en_US.UTF-8"
+[linux-0-rescue-196fd0394b7442a6838686745f03fd04]
+ image=/boot/vmlinuz-0-rescue-196fd0394b7442a6838686745f03fd04
+ ramdisk=/boot/initramfs-0-rescue-196fd0394b7442a6838686745f03fd04.img
+ parameters="root=/dev/mapper/rhel_ibm--z--68-root crashkernel=auto rd.dasd=0.0.0120 rd.dasd=0.0.0121 rd.dasd=0.0.0122 rd.dasd=0.0.0123 rd.lvm.lv=rhel_ibm-z-68/root rd.lvm.lv=rhel_ibm-z-68/swap rd.znet=qeth,0.0.8000,0.0.8001,0.0.8002,layer2=1,portname=z-68,portno=0"
--
2.17.1

@ -0,0 +1,32 @@
From 9b6266cdec60130435e9ba61af855e370ec31f1a Mon Sep 17 00:00:00 2001
From: Robert Marshall <rmarshall@redhat.com>
Date: Tue, 14 Mar 2017 22:25:02 -0400
Subject: [PATCH 44/55] Fix setDefaultImage for s390/s390x (#1285601)
The setDefaultImage routine has never actually supported s390/s390x when
picking an arbitrary index because a zipl config never has the property
defaultIsIndex set to 1. Eliminating the extraneous check resolved the
issue on s390/s390x and does not appear to break other platforms.
Related: rhbz#1285601
---
grubby.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/grubby.c b/grubby.c
index 9bf051dfed4..5202485a541 100644
--- a/grubby.c
+++ b/grubby.c
@@ -2535,8 +2535,7 @@ void setDefaultImage(struct grubConfig *config, int isAddingBootEntry,
}
/* Case 2: user picked an arbitrary index as the default boot entry */
- if (newDefaultBootEntryIndex >= FIRST_ENTRY_INDEX
- && config->cfi->defaultIsIndex) {
+ if (newDefaultBootEntryIndex >= FIRST_ENTRY_INDEX) {
indexToVerify = newDefaultBootEntryIndex;
/* user chose to make latest boot entry the default */
--
2.17.1

@ -0,0 +1,78 @@
From 7d48cb09b85b81f707565db6d35b1ba0d247b6b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Cami?= <fcami@fedoraproject.org>
Date: Fri, 23 Jun 2017 23:56:50 +0200
Subject: [PATCH 45/55] Be more thorough about flushing our config file when
writing.
Add missing fclose() at the end of writeConfig
Use fflush(out) + fsync(fileno(out) on temporary file
fsync() the destination directory after rename
---
grubby.c | 41 ++++++++++++++++++++++++++++++++++-------
1 file changed, 34 insertions(+), 7 deletions(-)
diff --git a/grubby.c b/grubby.c
index 5202485a541..11ee64a02b9 100644
--- a/grubby.c
+++ b/grubby.c
@@ -1789,6 +1789,7 @@ static int writeConfig(struct grubConfig *cfg, char *outName,
int needs = MAIN_DEFAULT;
struct stat sb;
int i;
+ int rc = 0;
if (!strcmp(outName, "-")) {
out = stdout;
@@ -1903,16 +1904,42 @@ static int writeConfig(struct grubConfig *cfg, char *outName,
}
if (tmpOutName) {
- if (rename(tmpOutName, outName)) {
+ /* write userspace buffers */
+ if (fflush(out))
+ rc = 1;
+
+ /* purge the write-back cache with fsync() */
+ if (fsync(fileno(out)))
+ rc = 1;
+
+ if (fclose(out))
+ rc = 1;
+
+ if (rc == 0 && rename(tmpOutName, outName)) {
+ unlink(tmpOutName);
+ rc = 1;
+ }
+
+ /* fsync() the destination directory after rename */
+ if (rc == 0) {
+ int dirfd;
+
+ dirfd = open(dirname(strdupa(outName)), O_RDONLY);
+ if (dirfd < 0)
+ rc = 1;
+ else if (fsync(dirfd))
+ rc = 1;
+
+ if (dirfd >= 0)
+ close(dirfd);
+ }
+
+ if (rc == 1)
fprintf(stderr,
- _("grubby: error moving %s to %s: %s\n"),
- tmpOutName, outName, strerror(errno));
- unlink(outName);
- return 1;
- }
+ _("grubby: error flushing data: %m\n"));
}
- return 0;
+ return rc;
}
static int numEntries(struct grubConfig *cfg)
--
2.17.1

@ -0,0 +1,168 @@
From 92d22c7cb9a100a601b9a28cb78b8fbde9dac9a8 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Wed, 27 Sep 2017 11:28:00 -0400
Subject: [PATCH 46/55] Fix incorrect test case and --remove-args with a value.
Currently we have this test case:
grubTest grub.3 updargs/g3.4 --update-kernel=ALL --remove-args="hdd=foobar"
This fails to notice that the actual argument in grub.3 is hdd=ide-scsi,
and removes it anyway, and the data in g3.4 supports that behavior.
This is clearly wrong, and so this patch introduces updargs/g3.5, which
leaves hdd=ide-scsi intact, and fixes the code so that it won't modify
the command line in that case.
Resolves: rhbz#1476273
Signed-off-by: Peter Jones <pjones@redhat.com>
---
grubby.c | 71 ++++++++++++++++++++++++++++++++-------
test.sh | 2 +-
test/results/updargs/g3.5 | 16 +++++++++
3 files changed, 76 insertions(+), 13 deletions(-)
create mode 100644 test/results/updargs/g3.5
diff --git a/grubby.c b/grubby.c
index 11ee64a02b9..9af04dea01b 100644
--- a/grubby.c
+++ b/grubby.c
@@ -3563,23 +3563,67 @@ static void removeElement(struct singleLine *line, int removeHere)
line->numElements--;
}
-int argMatch(const char *one, const char *two)
+static int argNameMatch(const char *one, const char *two)
{
char *first, *second;
+ char *chptra, *chptrb;
+ int rc;
+
+ first = strcpy(alloca(strlen(one) + 1), one);
+ second = strcpy(alloca(strlen(two) + 1), two);
+
+ chptra = strchr(first, '=');
+ if (chptra)
+ *chptra = '\0';
+
+ chptrb = strchr(second, '=');
+ if (chptrb)
+ *chptrb = '\0';
+
+ rc = strcmp(first, second);
+
+ if (chptra)
+ *chptra = '=';
+ if (chptrb)
+ *chptrb = '=';
+
+ return rc;
+}
+
+static int argHasValue(const char *arg)
+{
char *chptr;
+ chptr = strchr(arg, '=');
+ if (chptr)
+ return 1;
+ return 0;
+}
+
+static int argValueMatch(const char *one, const char *two)
+{
+ char *first, *second;
+ char *chptra, *chptrb;
+
first = strcpy(alloca(strlen(one) + 1), one);
second = strcpy(alloca(strlen(two) + 1), two);
- chptr = strchr(first, '=');
- if (chptr)
- *chptr = '\0';
+ chptra = strchr(first, '=');
+ if (chptra)
+ chptra += 1;
- chptr = strchr(second, '=');
- if (chptr)
- *chptr = '\0';
+ chptrb = strchr(second, '=');
+ if (chptrb)
+ chptrb += 1;
- return strcmp(first, second);
+ if (!chptra && !chptrb)
+ return 0;
+ else if (!chptra)
+ return *chptrb - 0;
+ else if (!chptrb)
+ return 0 - *chptra;
+ else
+ return strcmp(chptra, chptrb);
}
int updateActualImage(struct grubConfig *cfg, const char *image,
@@ -3723,7 +3767,7 @@ int updateActualImage(struct grubConfig *cfg, const char *image,
}
if (usedElements[i])
continue;
- if (!argMatch(line->elements[i].item, *arg)) {
+ if (!argNameMatch(line->elements[i].item, *arg)) {
usedElements[i] = 1;
break;
}
@@ -3782,9 +3826,12 @@ int updateActualImage(struct grubConfig *cfg, const char *image,
!strcmp(line->elements[i].item, "--"))
/* reached the end of hyper args, stop here */
break;
- if (!argMatch(line->elements[i].item, *arg)) {
- removeElement(line, i);
- break;
+ if (!argNameMatch(line->elements[i].item, *arg)) {
+ if (!argHasValue(*arg) ||
+ !argValueMatch(line->elements[i].item, *arg)) {
+ removeElement(line, i);
+ break;
+ }
}
}
/* handle removing LT_ROOT line too */
diff --git a/test.sh b/test.sh
index aaa6e9323a6..a97ada94d22 100755
--- a/test.sh
+++ b/test.sh
@@ -386,7 +386,7 @@ grubTest grub.3 updargs/g3.2 --update-kernel=DEFAULT \
--args "root=/dev/hdd1 hdd=notide-scsi"
grubTest grub.3 updargs/g3.4 --update-kernel=ALL --remove-args="hdd"
grubTest grub.3 updargs/g3.4 --update-kernel=ALL --remove-args="hdd=ide-scsi"
-grubTest grub.3 updargs/g3.4 --update-kernel=ALL --remove-args="hdd=foobar"
+grubTest grub.3 updargs/g3.5 --update-kernel=ALL --remove-args="hdd=foobar"
grubTest grub.3 updargs/g3.7 --update-kernel=ALL \
--remove-args="hdd root ro"
grubTest grub.7 updargs/g7.2 --boot-filesystem=/ \
diff --git a/test/results/updargs/g3.5 b/test/results/updargs/g3.5
new file mode 100644
index 00000000000..7d50bb87d84
--- /dev/null
+++ b/test/results/updargs/g3.5
@@ -0,0 +1,16 @@
+#boot=/dev/hda
+timeout=10
+splashimage=(hd0,1)/grub/splash.xpm.gz
+title Red Hat Linux (2.4.7-2smp)
+ root (hd0,1)
+ kernel /vmlinuz-2.4.7-2smp ro root=/dev/hda5 hdd=ide-scsi
+ initrd /initrd-2.4.7-2smp.img
+title Red Hat Linux-up (2.4.7-2)
+ root (hd0,1)
+ kernel /vmlinuz-2.4.7-2 ro root=/dev/hda5 hdd=ide-scsi
+ initrd /initrd-2.4.7-2.img
+title DOS
+ rootnoverify (hd0,0)
+ chainloader +1
+
+
--
2.17.1

@ -0,0 +1,59 @@
From 19b47a3eab1b4fc490e007caaa9597595f15f496 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Wed, 31 Jan 2018 13:06:48 -0500
Subject: [PATCH 47/55] grubby: Make sure configure$BOOTLOADER variables are
set correctly.
When we've chosen a bootloader because it's default for a platform, and
we've already determined it's not overridden by the command line, set
the configure$BOOTLOADER variable to 1 so that our checks for which
bootloader are selected work correctly.
Resolves: rhbz#1340893
Signed-off-by: Peter Jones <pjones@redhat.com>
---
grubby.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/grubby.c b/grubby.c
index 9af04dea01b..c1b4104892c 100644
--- a/grubby.c
+++ b/grubby.c
@@ -5151,22 +5151,27 @@ int main(int argc, const char **argv)
if (!cfi) {
if (grub2FindConfig(&grub2ConfigType)) {
cfi = &grub2ConfigType;
+ configureGrub2 = 1;
if (envPath)
cfi->envFile = envPath;
- } else
+ } else {
#ifdef __ia64__
cfi = &eliloConfigType;
-#elif __powerpc__
+ configureLilo = 1;
+#elif defined(__powerpc__)
cfi = &yabootConfigType;
-#elif __sparc__
+ configureYaboot = 1;
+#elif defined(__sparc__)
cfi = &siloConfigType;
-#elif __s390__
+ configureSilo = 1;
+#elif defined(__s390__) || defined(__s390x__)
cfi = &ziplConfigType;
-#elif __s390x__
- cfi = &ziplConfigtype;
+ configureZipl = 1;
#else
cfi = &grubConfigType;
+ configureGrub = 1;
#endif
+ }
}
if (!grubConfig) {
--
2.17.1

@ -0,0 +1,237 @@
From 7a09f286922ab14df7a07e50d81e197bedd6d20d Mon Sep 17 00:00:00 2001
From: Dennis Gilmore <dennis@ausil.us>
Date: Wed, 30 Aug 2017 14:03:45 -0500
Subject: [PATCH 48/55] 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 <dennis@ausil.us>
---
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 64225deb06b..0fe6caab51a 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
@@ -917,9 +804,6 @@ elif [ "$mode" == "--rpmposttrans" ]; then
rpmposttrans
fi
-# if we mounted the U-Boot directory, unmount it.
-[ -n "$mounted" ] && umount $ubootDir
-
# make sure changes make it to the disk.
# if /boot is a mountpoint, force the meta data on disk
# to by-pass writeback delay.
diff --git a/uboot b/uboot
deleted file mode 100644
index 07d8671822f..00000000000
--- 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
--
2.17.1

@ -0,0 +1,148 @@
From bd789c1aa159fb4992904e7c529789d7defbe332 Mon Sep 17 00:00:00 2001
From: Nathaniel McCallum <npmccallum@redhat.com>
Date: Fri, 2 Mar 2018 14:59:32 -0500
Subject: [PATCH 49/55] 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 | 57 ++++++++++++++++++++++++++------------------------------
1 file changed, 26 insertions(+), 31 deletions(-)
diff --git a/grubby.c b/grubby.c
index c1b4104892c..1fe850a3ddf 100644
--- a/grubby.c
+++ b/grubby.c
@@ -698,7 +698,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,
@@ -2122,7 +2122,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) {
@@ -2150,12 +2150,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;
@@ -2247,7 +2246,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)) {
@@ -2352,14 +2350,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)))
+ if (!strcmp(line->elements[1].item +
+ getRootSpecifier(
+ line->elements[1].item),
+ kernel + strlen(prefix)))
break;
}
if (line->type == LT_MENUENTRY &&
@@ -3268,12 +3262,12 @@ struct singleLine *addLineTmpl(struct singleEntry *entry,
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) {
+ size_t rs = getRootSpecifier(tmplLine->elements[1].item);
+ if (rs > 0) {
free(newLine->elements[1].item);
- newLine->elements[1].item =
- sdupprintf("%s%s", rootspec, val);
+ newLine->elements[1].item = sdupprintf(
+ "%.*s%s", (int) rs,
+ tmplLine->elements[1].item, val);
}
}
}
@@ -4325,17 +4319,19 @@ int checkForElilo(struct grubConfig *config)
return 1;
}
-static char *getRootSpecifier(char *str)
+static size_t getRootSpecifier(const char *str)
{
- char *idx, *rootspec = NULL;
+ 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,
@@ -5365,7 +5361,7 @@ int main(int argc, const char **argv)
if (displayDefault) {
struct singleLine *line;
struct singleEntry *entry;
- char *rootspec;
+ size_t rs;
if (config->defaultImage == NO_DEFAULT_ENTRY)
return 0;
@@ -5384,9 +5380,8 @@ int main(int argc, const char **argv)
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.17.1

@ -0,0 +1,208 @@
From 9c6e5cd813d0c064e2805cdb4c6726d32b49d3e1 Mon Sep 17 00:00:00 2001
From: Nathaniel McCallum <npmccallum@redhat.com>
Date: Fri, 2 Mar 2018 08:40:18 -0500
Subject: [PATCH 50/55] 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 | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 142 insertions(+), 4 deletions(-)
diff --git a/grubby.c b/grubby.c
index 1fe850a3ddf..396041a1187 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;
@@ -2115,6 +2117,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)
{
@@ -3262,12 +3387,22 @@ struct singleLine *addLineTmpl(struct singleEntry *entry,
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);
+ break;
+ }
+ }
+ }
if (rs > 0) {
free(newLine->elements[1].item);
newLine->elements[1].item = sdupprintf(
- "%.*s%s", (int) rs,
- tmplLine->elements[1].item, val);
+ "%.*s%s", (int) rs, prfx, val);
}
}
}
@@ -4331,7 +4466,7 @@ static size_t getRootSpecifier(const char *str)
rs++;
}
- return rs;
+ return rs + subvolPrefix(str + rs);
}
static char *getInitrdVal(struct grubConfig *config,
@@ -4963,6 +5098,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)"),
--
2.17.1

File diff suppressed because it is too large Load Diff

@ -0,0 +1,24 @@
From be8c1d611186d1fc35c50d417ba7b43ce25c6054 Mon Sep 17 00:00:00 2001
From: Rafael dos Santos <rdossant@redhat.com>
Date: Tue, 29 May 2018 15:15:24 +0200
Subject: [PATCH 52/55] Use system LDFLAGS
---
Makefile | 1 +
1 file changed, 1 insertion(+)
diff --git a/Makefile b/Makefile
index cc7e823959f..65cd28295aa 100644
--- a/Makefile
+++ b/Makefile
@@ -25,6 +25,7 @@ OBJECTS = grubby.o log.o
CC = gcc
RPM_OPT_FLAGS ?= -O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector
CFLAGS += $(RPM_OPT_FLAGS) -std=gnu99 -Wall -Werror -Wno-error=unused-function -Wno-unused-function -ggdb
+LDFLAGS := $(RPM_LD_FLAGS)
LDFLAGS :=
VERBOSE_TEST :=
ifneq ($(VERBOSE_TEST),)
--
2.17.1

@ -0,0 +1,36 @@
From b4d5d14bef6861212f55148bbe6939a41700a54c Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Wed, 18 Jul 2018 13:41:02 -0400
Subject: [PATCH 53/55] Honor sbindir
Signed-off-by: Peter Jones <pjones@redhat.com>
---
Makefile | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Makefile b/Makefile
index 65cd28295aa..44fc12f0c1b 100644
--- a/Makefile
+++ b/Makefile
@@ -47,14 +47,14 @@ test: all
@./test.sh $(VERBOSE_TEST)
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

@ -0,0 +1,48 @@
From f8482113065878c0ace605fbca296fc7601c47cc Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas <javierm@redhat.com>
Date: Tue, 31 Jul 2018 17:43:53 +0200
Subject: [PATCH 54/55] 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 <hdegoede@redhat.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
---
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` <kernel_version> <bootimage> <mapfile>" >&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

@ -0,0 +1,419 @@
From 4e0e028b21070f956b144bd530230d01b9015d73 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Fri, 12 Oct 2018 16:39:37 -0400
Subject: [PATCH 55/55] Add /usr/libexec/rpm-sort
Signed-off-by: Peter Jones <pjones@redhat.com>
---
rpm-sort.c | 355 +++++++++++++++++++++++++++++++++++++++++++++++++++++
Makefile | 9 +-
.gitignore | 1 +
3 files changed, 363 insertions(+), 2 deletions(-)
create mode 100644 rpm-sort.c
diff --git a/rpm-sort.c b/rpm-sort.c
new file mode 100644
index 00000000000..f19635645ba
--- /dev/null
+++ b/rpm-sort.c
@@ -0,0 +1,355 @@
+#define _GNU_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <assert.h>
+#include <argp.h>
+#include <rpm/rpmlib.h>
+#include <err.h>
+
+typedef enum {
+ RPMNVRCMP,
+ VERSNVRCMP,
+ RPMVERCMP,
+ STRVERSCMP,
+} comparitors;
+
+static comparitors comparitor = RPMNVRCMP;
+
+static inline void *xmalloc(size_t sz)
+{
+ void *ret = malloc(sz);
+
+ assert(sz == 0 || ret != NULL);
+ return ret;
+}
+
+static inline void *xrealloc(void *p, size_t sz)
+{
+ void *ret = realloc(p, sz);
+
+ assert(sz == 0 || ret != NULL);
+ return ret;
+}
+
+static inline char *xstrdup(const char * const s)
+{
+ void *ret = strdup(s);
+
+ assert(s == NULL || ret != NULL);
+ return ret;
+}
+
+static size_t
+read_file (const char *input, char **ret)
+{
+ FILE *in;
+ size_t s;
+ size_t sz = 2048;
+ size_t offset = 0;
+ char *text;
+
+ if (!strcmp(input, "-"))
+ in = stdin;
+ else
+ in = fopen(input, "r");
+
+ text = xmalloc (sz);
+
+ if (!in)
+ err(1, "cannot open `%s'", input);
+
+ while ((s = fread (text + offset, 1, sz - offset, in)) != 0)
+ {
+ offset += s;
+ if (sz - offset == 0)
+ {
+ sz += 2048;
+ text = xrealloc (text, sz);
+ }
+ }
+
+ text[offset] = '\0';
+ *ret = text;
+
+ if (in != stdin)
+ fclose(in);
+
+ return offset + 1;
+}
+
+/* returns name/version/release */
+/* NULL string pointer returned if nothing found */
+static void
+split_package_string (char *package_string, char **name,
+ char **version, char **release)
+{
+ char *package_version, *package_release;
+
+ /* Release */
+ package_release = strrchr (package_string, '-');
+
+ if (package_release != NULL)
+ *package_release++ = '\0';
+
+ *release = package_release;
+
+ /* Version */
+ package_version = strrchr(package_string, '-');
+
+ if (package_version != NULL)
+ *package_version++ = '\0';
+
+ *version = package_version;
+ /* Name */
+ *name = package_string;
+
+ /* Bubble up non-null values from release to name */
+ if (*name == NULL)
+ {
+ *name = (*version == NULL ? *release : *version);
+ *version = *release;
+ *release = NULL;
+ }
+ if (*version == NULL)
+ {
+ *version = *release;
+ *release = NULL;
+ }
+}
+
+static int
+cmprpmversp(const void *p1, const void *p2)
+{
+ return rpmvercmp(*(char * const *)p1, *(char * const *)p2);
+}
+
+static int
+cmpstrversp(const void *p1, const void *p2)
+{
+ return strverscmp(*(char * const *)p1, *(char * const *)p2);
+}
+
+/*
+ * package name-version-release comparator for qsort
+ * expects p, q which are pointers to character strings (char *)
+ * which will not be altered in this function
+ */
+static int
+package_version_compare (const void *p, const void *q)
+{
+ char *local_p, *local_q;
+ char *lhs_name, *lhs_version, *lhs_release;
+ char *rhs_name, *rhs_version, *rhs_release;
+ int vercmpflag = 0;
+ int (*cmp)(const char *s1, const char *s2);
+
+ switch(comparitor)
+ {
+ default: /* just to shut up -Werror=maybe-uninitialized */
+ case RPMNVRCMP:
+ cmp = rpmvercmp;
+ break;
+ case VERSNVRCMP:
+ cmp = strverscmp;
+ break;
+ case RPMVERCMP:
+ return cmprpmversp(p, q);
+ break;
+ case STRVERSCMP:
+ return cmpstrversp(p, q);
+ break;
+ }
+
+ local_p = alloca (strlen (*(char * const *)p) + 1);
+ local_q = alloca (strlen (*(char * const *)q) + 1);
+
+ /* make sure these allocated */
+ assert (local_p);
+ assert (local_q);
+
+ strcpy (local_p, *(char * const *)p);
+ strcpy (local_q, *(char * const *)q);
+
+ split_package_string (local_p, &lhs_name, &lhs_version, &lhs_release);
+ split_package_string (local_q, &rhs_name, &rhs_version, &rhs_release);
+
+ /* Check Name and return if unequal */
+ vercmpflag = cmp ((lhs_name == NULL ? "" : lhs_name),
+ (rhs_name == NULL ? "" : rhs_name));
+ if (vercmpflag != 0)
+ return vercmpflag;
+
+ /* Check version and return if unequal */
+ vercmpflag = cmp ((lhs_version == NULL ? "" : lhs_version),
+ (rhs_version == NULL ? "" : rhs_version));
+ if (vercmpflag != 0)
+ return vercmpflag;
+
+ /* Check release and return the version compare value */
+ vercmpflag = cmp ((lhs_release == NULL ? "" : lhs_release),
+ (rhs_release == NULL ? "" : rhs_release));
+
+ return vercmpflag;
+}
+
+static void
+add_input (const char *filename, char ***package_names, size_t *n_package_names)
+{
+ char *orig_input_buffer = NULL;
+ char *input_buffer;
+ char *position_of_newline;
+ char **names = *package_names;
+ char **new_names = NULL;
+ size_t n_names = *n_package_names;
+
+ if (!*package_names)
+ new_names = names = xmalloc (sizeof (char *) * 2);
+
+ if (read_file (filename, &orig_input_buffer) < 2)
+ {
+ if (new_names)
+ free (new_names);
+ if (orig_input_buffer)
+ free (orig_input_buffer);
+ return;
+ }
+
+ input_buffer = orig_input_buffer;
+ while (input_buffer && *input_buffer &&
+ (position_of_newline = strchrnul (input_buffer, '\n')))
+ {
+ size_t sz = position_of_newline - input_buffer;
+ char *new;
+
+ if (sz == 0)
+ {
+ input_buffer = position_of_newline + 1;
+ continue;
+ }
+
+ new = xmalloc (sz+1);
+ strncpy (new, input_buffer, sz);
+ new[sz] = '\0';
+
+ names = xrealloc (names, sizeof (char *) * (n_names + 1));
+ names[n_names] = new;
+ n_names++;
+
+ /* move buffer ahead to next line */
+ input_buffer = position_of_newline + 1;
+ if (*position_of_newline == '\0')
+ input_buffer = NULL;
+ }
+
+ free (orig_input_buffer);
+
+ *package_names = names;
+ *n_package_names = n_names;
+}
+
+static char *
+help_filter (int key, const char *text, void *input __attribute__ ((unused)))
+{
+ return (char *)text;
+}
+
+static struct argp_option options[] = {
+ { "comparitor", 'c', "COMPARITOR", 0, "[rpm-nvr-cmp|vers-nvr-cmp|rpmvercmp|strverscmp]", 0},
+ { 0, }
+};
+
+struct arguments
+{
+ size_t ninputs;
+ size_t input_max;
+ char **inputs;
+};
+
+static error_t
+argp_parser (int key, char *arg, struct argp_state *state)
+{
+ struct arguments *arguments = state->input;
+ switch (key)
+ {
+ case 'c':
+ if (!strcmp(arg, "rpm-nvr-cmp") || !strcmp(arg, "rpmnvrcmp"))
+ comparitor = RPMNVRCMP;
+ else if (!strcmp(arg, "vers-nvr-cmp") || !strcmp(arg, "versnvrcmp"))
+ comparitor = VERSNVRCMP;
+ else if (!strcmp(arg, "rpmvercmp"))
+ comparitor = RPMVERCMP;
+ else if (!strcmp(arg, "strverscmp"))
+ comparitor = STRVERSCMP;
+ else
+ err(1, "Invalid comparitor \"%s\"", arg);
+ break;
+ case ARGP_KEY_ARG:
+ assert (arguments->ninputs < arguments->input_max);
+ arguments->inputs[arguments->ninputs++] = xstrdup (arg);
+ break;
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+static struct argp argp = {
+ options, argp_parser, "[INPUT_FILES]",
+ "Sort a list of strings in RPM version sort order.",
+ NULL, help_filter, NULL
+};
+
+int
+main (int argc, char *argv[])
+{
+ struct arguments arguments;
+ char **package_names = NULL;
+ size_t n_package_names = 0;
+ int i;
+
+ memset (&arguments, 0, sizeof (struct arguments));
+ arguments.input_max = argc+1;
+ arguments.inputs = xmalloc ((arguments.input_max + 1)
+ * sizeof (arguments.inputs[0]));
+ memset (arguments.inputs, 0, (arguments.input_max + 1)
+ * sizeof (arguments.inputs[0]));
+
+ /* Parse our arguments */
+ if (argp_parse (&argp, argc, argv, 0, 0, &arguments) != 0)
+ errx(1, "%s", "Error in parsing command line arguments\n");
+
+ /* If there's no inputs in argv, add one for stdin */
+ if (!arguments.ninputs)
+ {
+ arguments.ninputs = 1;
+ arguments.inputs[0] = xmalloc (2);
+ strcpy(arguments.inputs[0], "-");
+ }
+
+ for (i = 0; i < arguments.ninputs; i++)
+ add_input(arguments.inputs[i], &package_names, &n_package_names);
+
+ if (package_names == NULL || n_package_names < 1)
+ errx(1, "Invalid input");
+
+ qsort (package_names, n_package_names, sizeof (char *),
+ package_version_compare);
+
+ /* send sorted list to stdout */
+ for (i = 0; i < n_package_names; i++)
+ {
+ fprintf (stdout, "%s\n", package_names[i]);
+ free (package_names[i]);
+ }
+
+ free (package_names);
+ for (i = 0; i < arguments.ninputs; i++)
+ free (arguments.inputs[i]);
+
+ free (arguments.inputs);
+
+ return 0;
+}
diff --git a/Makefile b/Makefile
index 44fc12f0c1b..8eeec80da21 100644
--- a/Makefile
+++ b/Makefile
@@ -34,7 +34,7 @@ endif
grubby_LIBS = -lblkid -lpopt
-all: grubby
+all: grubby rpm-sort
debug : clean
$(MAKE) CFLAGS="${CFLAGS} -DDEBUG=1" all
@@ -57,12 +57,17 @@ install: all
install -m 755 grubby $(DESTDIR)$(PREFIX)$(sbindir) ; \
install -m 644 grubby.8 $(DESTDIR)/$(mandir)/man8 ; \
fi
+ install -m 755 -d $(DESTDIR)$(PREFIX)$(libexecdir)/grubby/
+ install -m 755 rpm-sort $(DESTDIR)$(PREFIX)$(libexecdir)/grubby/rpm-sort
grubby:: $(OBJECTS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(grubby_LIBS)
+rpm-sort::rpm-sort.o
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ -lrpm
+
clean:
- rm -f *.o grubby *~
+ rm -f *.o grubby rpm-sort *~
GITTAG = $(VERSION)-1
diff --git a/.gitignore b/.gitignore
index 1c00ff7c5ed..bcaf1494f61 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
grubby
+rpm-sort
version.h
*.o
core.*
--
2.17.1

@ -0,0 +1,30 @@
From e15806969cbae83a94068d99e4f1d295dab95eac Mon Sep 17 00:00:00 2001
From: Jan Stodola <jstodola@redhat.com>
Date: Tue, 20 Nov 2018 15:02:19 +0100
Subject: [PATCH] Improve man page for --info option
1) commit 941d4a0b removed description of --info DEFAULT
2) Add description of --info ALL
---
grubby.8 | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/grubby.8 b/grubby.8
index 1e8f140c4df..8b98433960c 100644
--- a/grubby.8
+++ b/grubby.8
@@ -185,7 +185,10 @@ Display the title of the current default boot entry and exit.
.TP
\fB-\-info\fR=\fIkernel-path\fR
-Display information on all boot entries which match \fIkernel-path\fR. I
+Display information on all boot entries which match \fIkernel-path\fR. If
+\fIkernel-path\fR is \fBDEFAULT\fR, then information on the default kernel
+is displayed. If \fIkernel-path\fR is \fBALL\fR, then information on all boot
+entries are displayed.
.TP
\fB-\-bootloader-probe\fR
--
2.19.1

@ -0,0 +1,836 @@
#!/bin/bash
#
# grubby wrapper to manage BootLoaderSpec files
#
#
# Copyright 2018 Red Hat, Inc. All rights reserved.
#
# 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, see <http://www.gnu.org/licenses/>.
readonly SCRIPTNAME="${0##*/}"
CMDLINE_LINUX_DEBUG=" systemd.log_level=debug systemd.log_target=kmsg"
LINUX_DEBUG_VERSION_POSTFIX="_with_debugging"
LINUX_DEBUG_TITLE_POSTFIX=" with debugging"
declare -a bls_file
declare -a bls_title
declare -a bls_version
declare -a bls_linux
declare -a bls_initrd
declare -a bls_options
declare -a bls_id
[[ -f /etc/sysconfig/kernel ]] && . /etc/sysconfig/kernel
[[ -f /etc/os-release ]] && . /etc/os-release
read MACHINE_ID < /etc/machine-id
arch=$(uname -m)
if [[ $arch = 's390' || $arch = 's390x' ]]; then
bootloader="zipl"
else
bootloader="grub2"
fi
print_error() {
echo "$1" >&2
exit 1
}
print_info() {
echo "$1" >&2
}
if [[ ${#} = 0 ]]; then
print_error "no action specified"
fi
get_bls_value() {
local bls="$1" && shift
local key="$1" && shift
echo "$(grep "^${key}[ \t]" "${bls}" | sed -e "s!^${key}[ \t]*!!")"
}
set_bls_value() {
local bls="$1" && shift
local key="$1" && shift
local value="$1" && shift
value=$(echo $value | sed -e 's/\//\\\//g')
sed -i -e "s/^${key}.*/${key} ${value}/" "${bls}"
}
append_bls_value() {
local bls="$1" && shift
local key="$1" && shift
local value="$1" && shift
old_value="$(get_bls_value "${bls}" ${key})"
set_bls_value "${bls}" "${key}" "${old_value}${value}"
}
get_bls_values() {
count=0
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 | /usr/libexec/grubby/rpm-sort -c rpmnvrcmp 2>/dev/null | tac)) || :
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
}
get_default_index() {
local default=""
local index="-1"
local title=""
local version=""
if [[ $bootloader = "grub2" ]]; then
default="$(grep '^saved_entry=' ${env} | sed -e 's/^saved_entry=//')"
else
default="$(grep '^default=' ${zipl_config} | sed -e 's/^default=//')"
fi
if [[ -z $default ]]; then
index=0
elif [[ $default =~ ^[0-9]+$ ]]; then
index="$default"
fi
for i in ${!bls_file[@]}; do
if [[ $i -eq $index ]]; then
echo $i
return
fi
if [[ $default = ${bls_id[$i]} || $default = ${bls_title[$i]} ]]; then
echo $i
return
fi
done
}
display_default_value() {
local prefix=$(get_prefix)
case "$display_default" in
kernel)
echo "${prefix}${bls_linux[$default_index]}"
exit 0
;;
index)
echo "$default_index"
exit 0
;;
title)
echo "${bls_title[$default_index]}"
exit 0
;;
esac
}
param_to_indexes() {
local param="$1"
local indexes=""
if [[ $param = "ALL" ]]; then
for i in ${!bls_file[@]}; do
indexes="$indexes $i"
done
echo -n $indexes
return
fi
if [[ $param = "DEFAULT" ]]; then
echo -n $default_index
return
fi
for i in ${!bls_file[@]}; do
if [[ $param = "${bls_linux[$i]}" || "/${param##*/}" = "${bls_linux[$i]}" ]]; then
indexes="$indexes $i"
fi
if [[ $param = "TITLE=${bls_title[$i]}" ]]; then
indexes="$indexes $i"
fi
if [[ $param = $i ]]; then
indexes="$indexes $i"
fi
done
if [[ -n $indexes ]]; then
echo -n $indexes
return
fi
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=\"${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
}
mkbls() {
local kernel=$1 && shift
local kernelver=$1 && shift
local datetime=$1 && shift
local debugname=""
local flavor=""
local prefix=""
if [[ $(get_prefix) = "" ]]; then
prefix="/boot"
fi
if [[ $kernelver == *\+* ]] ; then
local flavor=-"${kernelver##*+}"
if [[ $flavor == "-debug" ]]; then
local debugname="with debugging"
local debugid="-debug"
fi
fi
cat <<EOF
title ${NAME} (${kernelver}) ${VERSION}${debugname}
version ${kernelver}${debugid}
linux ${kernel}
initrd ${prefix}/initramfs-${kernelver}.img
options \$kernelopts
id ${ID}-${datetime}-${kernelver}${debugid}
grub_users \$grub_users
grub_arg --unrestricted
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 $(get_prefix)$1 is incorrect"
fi
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%.*}"
last=($(for bls in ${prefix}.*~custom*.conf ; do
if ! [[ -e "${bls}" ]] ; then
continue
fi
bls="${bls##${prefix}.}"
bls="${bls%%~custom*}"
echo "${bls}"
done | tail -n1)) || :
if [[ -z $last ]]; then
last="0"
else
last=$((last+1))
fi
echo "${bls_target}" | sed -e "s!${prefix}!${prefix}.${last}~custom!"
}
add_bls_fragment() {
local kernel="$1" && shift
local title="$1" && shift
local options="$1" && shift
local initrd="$1" && shift
local extra_initrd="$1" && shift
if [[ $kernel = *"vmlinuz-"* ]]; then
kernelver="${kernel##*/vmlinuz-}"
prefix="vmlinuz-"
else
kernelver="${kernel##*/}"
fi
if [[ ! -f "/boot/${prefix}${kernelver}" ]] &&
[[ $bad_image != "true" ]]; then
print_error "The ${kernelver} kernel isn't installed in the machine"
fi
if [[ -z $title ]]; then
print_error "The kernel title must be specified"
fi
if [[ ! -d $blsdir ]]; then
install -m 700 -d "${blsdir}"
fi
bls_target="${blsdir}/${MACHINE_ID}-${kernelver}.conf"
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
if [[ -n $options ]]; then
set_bls_value "${bls_target}" "options" "${options}"
fi
if [[ -n $initrd ]]; then
set_bls_value "${bls_target}" "initrd" "${initrd}"
fi
if [[ -n $extra_initrd ]]; then
append_bls_value "${bls_target}" "initrd" "${extra_initrd}"
fi
if [[ $MAKEDEBUG = "yes" ]]; then
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/${kernelver}/${kernelver}~debug/")"
set_bls_value "${bls_debug}" "id" "${blsid}"
fi
get_bls_values
if [[ $make_default = "true" ]]; then
set_default_bls "TITLE=${title}"
fi
update_grubcfg
exit 0
}
update_args() {
local args=$1 && shift
local remove_args=($1) && shift
local add_args=($1) && shift
for arg in ${remove_args[*]}; do
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
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 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
if [[ $bootloader = grub2 && "$(has_kernelopts "$i")" = "false" && $opts = $new_args ]]; then
set_bls_value "${bls_file[$i]}" "options" "\$kernelopts"
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_id[$index]}"
else
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}"
else
echo "default=${default}" >> "${zipl_config}"
fi
fi
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##${prefix}/}"
fi
if [[ -n $initrd ]]; then
initrd="/${initrd##${prefix}/}"
fi
if [[ -n $extra_initrd ]]; then
extra_initrd=" /${extra_initrd##${prefix}/}"
fi
if [[ -n $kernel ]]; then
kernel="/${kernel##${prefix}/}"
fi
if [[ -n $update_kernel && $update_kernel =~ ^/ ]]; then
update_kernel="/${update_kernel##${prefix}/}"
fi
}
update_grubcfg()
{
if [[ $arch = 'ppc64' || $arch = 'ppc64le' ]]; then
grub2-mkconfig --no-grubenv-update -o "${grub_config}" >& /dev/null
fi
}
print_usage()
{
cat <<EOF
Usage: grubby [OPTION...]
--add-kernel=kernel-path add an entry for the specified kernel
--args=args default arguments for the new kernel or new arguments for kernel being updated)
--bad-image-okay don't sanity check images in boot entries (for testing only)
-c, --config-file=path path to grub config file to update ("-" for stdin)
--copy-default use the default boot entry as a template for the new entry being added; if the default is not a linux image, or if the kernel referenced by the default image does not exist, the
first linux entry whose kernel does exist is used as the template
--default-kernel display the path of the default kernel
--default-index display the index of the default kernel
--default-title display the title of the default kernel
--env=path path for environment data
--grub2 configure grub2 bootloader
--info=kernel-path display boot information for specified kernel
--initrd=initrd-path initrd image for the new kernel
-i, --extra-initrd=initrd-path auxiliary initrd image for things other than the new kernel
--make-default make the newly added entry the default boot entry
--remove-args=STRING remove kernel arguments
--remove-kernel=kernel-path remove all entries for the specified kernel
--set-default=kernel-path make the first entry referencing the specified kernel the default
--set-default-index=entry-index make the given entry index the default entry
--title=entry-title title to use for the new kernel entry
--update-kernel=kernel-path updated information for the specified kernel
--zipl configure zipl bootloader
-b, --bls-directory path to directory containing the BootLoaderSpec fragment files
--no-etc-grub-update don't update the GRUB_CMDLINE_LINUX variable in /etc/default/grub
Help options:
-?, --help Show this help message
EOF
}
OPTS="$(getopt -o c:i:b:? --long help,add-kernel:,args:,bad-image-okay,\
config-file:,copy-default,default-kernel,default-index,default-title,env:,\
grub2,info:,initrd:,extra-initrd:,make-default,remove-args:,\
remove-kernel:,set-default:,set-default-index:,title:,update-kernel:,zipl,\
bls-directory:,no-etc-grub-update,add-multiboot:,mbargs:,mounts:,boot-filesystem:,\
bootloader-probe,debug,devtree,devtreedir:,elilo,efi,extlinux,grub,lilo,\
output-file:,remove-mbargs:,remove-multiboot:,silo,yaboot -n ${SCRIPTNAME} -- "$@")"
[[ $? = 0 ]] || exit 1
eval set -- "$OPTS"
while [ ${#} -gt 0 ]; do
case "$1" in
--help|-h)
print_usage
exit 0
;;
--add-kernel)
kernel="${2}"
shift
;;
--args)
args="${2}"
shift
;;
--bad-image-okay)
bad_image=true
;;
--config-file|-c)
grub_config="${2}"
zipl_config="${2}"
shift
;;
--copy-default)
copy_default=true
;;
--default-kernel)
display_default="kernel"
;;
--default-index)
display_default="index"
;;
--default-title)
display_default="title"
;;
--env)
env="${2}"
shift
;;
--grub2)
bootloader="grub2"
;;
--info)
display_info="${2}"
shift
;;
--initrd)
initrd="${2}"
shift
;;
--extra-initrd|-i)
extra_initrd=" /${2}"
shift
;;
--make-default)
make_default=true
;;
--remove-args)
remove_args="${2}"
shift
;;
--remove-kernel)
remove_kernel="${2}"
shift
;;
--set-default)
set_default="${2}"
shift
;;
--set-default-index)
set_default="${2}"
shift
;;
--title)
title="${2}"
shift
;;
--update-kernel)
update_kernel="${2}"
shift
;;
--zipl)
bootloader="zipl"
;;
--bls-directory|-b)
blsdir="${2}"
shift
;;
--no-etc-grub-update)
no_etc_update=true
shift
;;
--add-multiboot|--mbargs|--mounts|--boot-filesystem|\
--bootloader-probe|--debug|--devtree|--devtreedir|--elilo|--efi|\
--extlinux|--grub|--lilo|--output-file|--remove-mbargs|--silo|\
--remove-multiboot|--slilo|--yaboot)
echo
echo "${SCRIPTNAME}: the option \"${1}\" was deprecated" >&2
echo "Try '${SCRIPTNAME} --help' to list supported options" >&2
echo
exit 1
;;
--)
shift
break
;;
*)
echo
echo "${SCRIPTNAME}: invalid option \"${1}\"" >&2
echo "Try '${SCRIPTNAME} --help' for more information" >&2
echo
exit 1
;;
esac
shift
done
if [[ -z $update_kernel && -z $kernel ]] && [[ -n $args || -n $remove_args ]]; then
print_error "no action specified"
fi
if [[ -z $blsdir ]]; then
blsdir="/boot/loader/entries"
fi
if [[ -z $env ]]; then
env="/boot/grub2/grubenv"
fi
if [[ -z $zipl_config ]]; then
zipl_config="/etc/zipl.conf"
fi
if [[ -z $grub_config ]]; then
grub_config="/boot/grub2/grub.cfg"
fi
if [[ -z $grub_etc_default ]]; then
grub_etc_default="/etc/default/grub"
fi
get_bls_values
default_index="$(get_default_index)"
if [[ -n $display_default ]]; then
display_default_value
fi
if [[ -n $display_info ]]; then
display_info_values "${display_info}"
fi
remove_var_prefix "$(get_prefix)"
if [[ -n $kernel ]]; then
if [[ $copy_default = "true" ]]; then
opts="${bls_options[$default_index]}"
if [[ -n $args ]]; then
opts="${opts} ${args}"
fi
else
opts="${opts} ${args}"
remove_args="$kernelopts"
update_args "${opts}" "${remove_args}" ""
fi
add_bls_fragment "${kernel}" "${title}" "${opts}" "${initrd}" \
"${extra_initrd}"
fi
if [[ -n $remove_kernel ]]; then
remove_bls_fragment "${remove_kernel}"
fi
if [[ -n $update_kernel ]]; then
update_bls_fragment "${update_kernel}" "${remove_args}" "${args}" "${initrd}"
fi
if [[ -n $set_default ]]; then
set_default_bls "${set_default}"
fi
exit 0

@ -0,0 +1,179 @@
.TH GRUBBY 8 "Wed Apr 29 2020"
.SH NAME
grubby \- command line tool for configuring grub and zipl
.SH SYNOPSIS
\fBgrubby\fR [--add-kernel=\fIkernel-path\fR] [--args=\fIargs\fR]
[--bad-image-okay] [--config-file=\fIpath\fR] [--copy-default]
[--default-kernel] [--default-index] [--default-title]
[--env=\fIpath\fR] [--grub2] [--info=\fIkernel-path\fR]
[--initrd=\fIinitrd-path\fR] [--extra-initrd=\fIinitrd-path\fR]
[--make-default] [--remove-args=\fIargs\fR]
[--remove-kernel=\fIkernel-path\fR] [--set-default=\fIkernel-path\fR]
[--set-default-index=\fientry-index\fR] [--title=\fentry-title\fR]
[--update-kernel=\fIkernel-path\fR] [--zipl] [--bls-directory=\fIpath\fR]
.SH DESCRIPTION
\fBgrubby\fR is a command line tool for updating and displaying information
about the configuration files for the \fBgrub2\fR and \fBzipl\fR 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.
On BIOS-based Intel x86 platforms, \fBgrub2\fR is the default bootloader and
the configuration file is in \fB/boot/grub2/grub.cfg\fR. On UEFI-based Intel
x86 platforms, \fBgrub2\fR is the default bootloader, and the configuration
file is in \fB/boot/efi/EFI/redhat/grub.cfg\fR. On PowerPC platforms, systems
based on Power8 and Power9 support \fBgrub2\fR as a bootloader and use a
configuration stored in \fB/boot/grub2/grub.cfg\fR. On s390x platforms the
\fBzipl\fR bootloader use a default configuration in \fB/etc/zipl.conf\fR.
All bootloaders define the boot entries as individual configuration fragments
that are stored by default in \fB/boot/loader/entries\fR. The format for the
config files is specified at \fBhttps://systemd.io/BOOT_LOADER_SPECIFICATION\fR.
The \fBgrubby\fR tool is used to update and display the configuration defined
in the BootLoaderSpec fragment files.
There are a number of ways to specify the kernel used for \fB-\-info\fR,
\fB-\-remove-kernel\fR, and \fB-\-update-kernel\fR. Specificying \fBDEFAULT\fR
or \fBALL\fR selects the default entry and all of the entries, respectively.
Also, the title of a boot entry may be specified by using \fBTITLE=\fItitle\fR
as the argument; all entries with that title are used.
.SH OPTIONS
.TP
\fB-\-add-kernel\fR=\fIkernel-path\fR
Add a new boot entry for the kernel located at \fIkernel-path\fR.
.TP
\fB-\-args\fR=\fIkernel-args\fR
When a new kernel is added, this specifies the command line arguments
which should be passed to the kernel by default (note they are merged
with the arguments of the default entry if \fB-\-copy-default\fR is used).
When \fB-\-update-kernel\fR is used, this specifies new arguments to add
to the argument list. Multiple, space separated arguments may be used. If
an argument already exists the new value replaces the old values. The
\fBroot=\fR kernel argument gets special handling if the configuration
file has special handling for specifying the root filesystem.
.TP
\fB-\-bad-image-okay\fR
When \fBgrubby\fR is looking for an entry to use for something (such
as a default boot entry) it uses sanity checks, such as ensuring that
the kernel exists in the filesystem, to make sure entries that obviously
won't work aren't selected. This option overrides that behavior, and is
designed primarily for testing.
.TP
\fB-\-config-file\fR=\fIpath\fR
Use \fIpath\fR as the configuration file rather then the default.
.TP
\fB-\-copy-default\fR
\fBgrubby\fR will copy as much information (such as kernel arguments and
root device) as possible from the current default kernel. The kernel path
and initrd path will never be copied.
.TP
\fB-\-default-kernel\fR
Display the full path to the current default kernel and exit.
.TP
\fB-\-default-index\fR
Display the numeric index of the current default boot entry and exit.
.TP
\fB-\-default-title\fR
Display the title of the current default boot entry and exit.
.TP
\fB-\-env\fR=\fIpath\fR
Use \fIpath\fR as the grub2 environment block file rather then the default path.
.TP
\fB-\-grub2\fR
Configure \fBgrub2\fR bootloader.
.TP
\fB-\-info\fR=\fIkernel-path\fR
Display information on all boot entries which match \fIkernel-path\fR. If
\fIkernel-path\fR is \fBDEFAULT\fR, then information on the default kernel
is displayed. If \fIkernel-path\fR is \fBALL\fR, then information on all boot
entries are displayed.
.TP
\fB-\-initrd\fR=\fIinitrd-path\fR
Use \fIinitrd-path\fR as the path to an initial ram disk for a new kernel
being added.
.TP
\fB-\-extrainitrd\fR=\fIinitrd-path\fR
Use \fIinitrd-path\fR as the path to an auxiliary init ram disk image to be
added to the boot entry.
.TP
\fB-\-make-default\fR
Make the new kernel entry being added the default entry.
.TP
\fB-\-remove-args\fR=\fIkernel-args\fR
The arguments specified by \fIkernel-args\fR are removed from the kernels
specified by \fB-\-update-kernel\fR. The \fBroot\fR argument gets special
handling for configuration files that support separate root filesystem
configuration.
.TP
\fB-\-remove-kernel\fR=\fIkernel-path\fR
Removes all boot entries which match \fIkernel-path\fR. This may be used
along with -\-add-kernel, in which case the new kernel being added will
never be removed.
.TP
\fB-\-set-default\fR=\fIkernel-path\fR
The first entry which boots the specified kernel is made the default
boot entry.
.TP
\fB-\-set-default-index\fR=\fIentry-index\fR
Makes the given entry number the default boot entry.
.TP
\fB-\-title\fR=\fIentry-title\fR
When a new kernel entry is added \fIentry-title\fR is used as the title
for the entry.
.TP
\fB-\-update-kernel\fR=\fIkernel-path\fR
The entries for kernels matching \fRkernel-path\fR are updated. Currently
the only items that can be updated is the kernel argument list, which is
modified via the \fB-\-args\fR and \fB-\-remove-args\fR options. If the
\fBALL\fR argument is used the variable \fB GRUB_CMDLINE_LINUX\fR in
\fB/etc/default/grub\fR is updated with the latest kernel argument list,
unless the \fB-\-no-etc-grub-update\fR option is used.
.TP
\fB-\-zipl\fR
Configure \fBzipl\fR bootloader.
.TP
\fB-\-bls-directory\fR=\fIpath\fR
Use \fIpath\fR as the directory for the BootLoaderSpec config files rather
than the default \fB/boot/loader/entries\fR.
.TP
\fB-\-no-etc-grub-update\fR
Makes grubby to not update the \fBGRUB_CMDLINE_LINUX\fR variable in
\fB/etc/default/grub\fR when the \fB-\-update-kernel\fR option is
used with the \fBALL\fR argument.
.SH "SEE ALSO"
.BR zipl (8),
.BR mkinitrd (8),
.BR kernel-install (8)
.SH AUTHORS
.nf
Erik Troan
Jeremy Katz
Peter Jones
Javier Martinez
.fi

@ -0,0 +1,8 @@
#!/bin/bash
if [[ -x @@LIBEXECDIR@@/grubby-bls ]] ; then
exec @@LIBEXECDIR@@/grubby-bls "${@}"
elif [[ -x @@LIBEXECDIR@@/grubby ]] ; then
exec @@LIBEXECDIR@@/grubby "${@}"
fi
echo "Grubby is not installed correctly." >>/dev/stderr
exit 1

@ -0,0 +1,83 @@
#! /bin/sh
#
# /sbin/installkernel
#
# Copyright 2007-2008 Red Hat, Inc. All rights reserved.
#
# 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, see <http://www.gnu.org/licenses/>.
#
# Author(s): tyson@rwii.com
#
usage() {
echo "Usage: `basename $0` <kernel_version> <bootimage> <mapfile>" >&2
exit 1
}
cfgLoader=
if [ -z "$INSTALL_PATH" -o "$INSTALL_PATH" == "/boot" ]; then
INSTALL_PATH=/boot
cfgLoader=1
fi
LINK_PATH=/boot
RELATIVE_PATH=`echo "$INSTALL_PATH/" | sed "s|^$LINK_PATH/||"`
KERNEL_VERSION=$1
BOOTIMAGE=$2
MAPFILE=$3
ARCH=$(uname -m)
if [ $ARCH = 'ppc64' -o $ARCH = 'ppc' ]; then
KERNEL_NAME=vmlinux
else
KERNEL_NAME=vmlinuz
fi
if [ -z "$KERNEL_VERSION" -o -z "$BOOTIMAGE" -o -z "$MAPFILE" ]; then
usage
fi
if [ -f $INSTALL_PATH/$KERNEL_NAME-$KERNEL_VERSION ]; then
mv $INSTALL_PATH/$KERNEL_NAME-$KERNEL_VERSION \
$INSTALL_PATH/$KERNEL_NAME-$KERNEL_VERSION.old;
fi
if [ ! -L $INSTALL_PATH/$KERNEL_NAME ]; then
if [ -e $INSTALLPATH/$KERNEL_NAME ]; then
mv $INSTALL_PATH/$KERNEL_NAME $INSTALL_PATH/$KERNEL_NAME.old
fi
fi
if [ -f $INSTALL_PATH/System.map-$KERNEL_VERSION ]; then
mv $INSTALL_PATH/System.map-$KERNEL_VERSION \
$INSTALL_PATH/System.map-$KERNEL_VERSION.old;
fi
if [ ! -L $INSTALL_PATH/System.map ]; then
if [ -e $INSTALLPATH/System.map ]; then
mv $INSTALL_PATH/System.map $INSTALL_PATH/System.map.old
fi
fi
ln -sf ${RELATIVE_PATH}$INSTALL_PATH/System.map-$KERNEL_VERSION $LINK_PATH/System.map
cat $BOOTIMAGE > $INSTALL_PATH/$KERNEL_NAME-$KERNEL_VERSION
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 [ -n "$cfgLoader" ]; then
kernel-install add $KERNEL_VERSION $INSTALL_PATH/$KERNEL_NAME-$KERNEL_VERSION
exit $?
fi

@ -0,0 +1,8 @@
#!/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

@ -0,0 +1,736 @@
Name: grubby
Version: 8.40
Release: 49%{?dist}
Summary: Command line tool for updating BootLoaderSpec files
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
Source1: grubby-bls
Source2: grubby.in
Source3: installkernel.in
Source4: installkernel-bls
Source5: grubby.8
Patch0001: 0001-Set-envFile-from-env-when-bootloader-is-not-specifie.patch
Patch0002: 0002-add-README-with-description-of-the-test-suite.patch
Patch0003: 0003-Fix-some-stray-whitespace.patch
Patch0004: 0004-grubby-properly-handle-mixed-and-and-nested-quotes.patch
Patch0005: 0005-Don-t-put-spaces-in-debug-entries-on-zipl-platforms.patch
Patch0006: 0006-Drop-SEGV-handler.patch
Patch0007: 0007-Add-a-bunch-of-tests-for-various-default-kernel-titl.patch
Patch0008: 0008-Emit-better-systemd-debug-settings-on-debug-entries.patch
Patch0009: 0009-Add-a-new-makefile-target-that-does-everything-neede.patch
Patch0010: 0010-Make-the-grub1-defaultkernel-test-more-reliable.patch
Patch0011: 0011-Don-t-leak-from-one-extractTitle-call.patch
Patch0012: 0012-ppc64le-sync-grub.cfg-changes-to-disk-1212114.patch
Patch0013: 0013-Make-it-possible-to-run-test.sh-verbose-from-the-mak.patch
Patch0014: 0014-Lindent-dammit.patch
Patch0015: 0015-Make-SET_VARIABLE-get-handled-individually-in-GetNex.patch
Patch0016: 0016-Specify-bootloader-directory-in-the-test-case-for-11.patch
Patch0017: 0017-Fix-dracut-cmdline-options-and-conditionalize-them-t.patch
Patch0018: 0018-Add-missing-space.patch
Patch0019: 0019-Always-do-the-rungrubby-debug-after-the-normal-kerne.patch
Patch0020: 0020-grubby-add-set-index-to-specify-which-position-to-ad.patch
Patch0021: 0021-Fix-thinko-on-set-index-naming.patch
Patch0022: 0022-Add-a-test-case-for-a-failure-rmarshall-saw-in-set-i.patch
Patch0023: 0023-Ensure-command-line-updates-also-honor-set-index.patch
Patch0024: 0024-Change-debug-entry-insertion-order-rhbz-1285601.patch
Patch0025: 0025-Reorganize-grubby-man-page-1232168.patch
Patch0026: 0026-Update-grubby-man-page-contents-bz1232168.patch
Patch0027: 0027-Fix-inline-help-typo-1232168.patch
Patch0028: 0028-More-edits-for-grubby.8-1232168.patch
Patch0029: 0029-Minor-man-page-changes-1232168.patch
Patch0030: 0030-Rename-setDefaultImage-variables.patch
Patch0031: 0031-Add-index-constant-definitions-instead-of-open-coded.patch
Patch0032: 0032-Track-configuration-modifications.patch
Patch0033: 0033-Fix-some-test-cases-where-the-resulting-default-inde.patch
Patch0034: 0034-Don-t-assume-make-default-just-because-set-index-was.patch
Patch0035: 0035-Clarify-set-default-index-in-the-man-page.patch
Patch0036: 0036-Add-multi-entry-removal-test-1285601.patch
Patch0037: 0037-Fix-findTemplate-index-logic-1285601.patch
Patch0038: 0038-Write-correct-default-to-environment-1285601.patch
Patch0039: 0039-Initialize-variable-for-ppc-environment-1285601.patch
Patch0040: 0040-Fix-initial-saved_entry-read-issue-1285601.patch
Patch0041: 0041-Add-s390-s390x-info-test-1285601.patch
Patch0042: 0042-Fix-info-for-s390x-s390-1285601.patch
Patch0043: 0043-Add-s390-s390x-set-default-index-test-1285601.patch
Patch0044: 0044-Fix-setDefaultImage-for-s390-s390x-1285601.patch
Patch0045: 0045-Be-more-thorough-about-flushing-our-config-file-when.patch
Patch0046: 0046-Fix-incorrect-test-case-and-remove-args-with-a-value.patch
Patch0047: 0047-grubby-Make-sure-configure-BOOTLOADER-variables-are-.patch
Patch0048: 0048-remove-the-old-crufty-u-boot-support.patch
Patch0049: 0049-Change-return-type-in-getRootSpecifier.patch
Patch0050: 0050-Add-btrfs-subvolume-support-for-grub2.patch
Patch0051: 0051-Add-tests-for-btrfs-support.patch
Patch0052: 0052-Use-system-LDFLAGS.patch
Patch0053: 0053-Honor-sbindir.patch
Patch0054: 0054-Make-installkernel-to-use-kernel-install-scripts-on-.patch
Patch0055: 0055-Add-usr-libexec-rpm-sort.patch
Patch0056: 0056-Improve-man-page-for-info-option.patch
BuildRequires: gcc
BuildRequires: pkgconfig glib2-devel popt-devel
BuildRequires: libblkid-devel git-core sed make
# for make test / getopt:
BuildRequires: util-linux-ng
BuildRequires: rpm-devel
%ifarch aarch64 i686 x86_64 %{power64}
BuildRequires: grub2-tools-minimal
Requires: grub2-tools-minimal
Requires: grub2-tools
%endif
%ifarch s390 s390x
Requires: s390utils-base
%endif
Requires: findutils
Requires: util-linux
%description
This package provides a grubby compatibility script that manages
BootLoaderSpec files and is meant to only be used for legacy compatibility
users with existing grubby users.
%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 branch start
git am %{patches} </dev/null
git config --unset user.email
git config --unset user.name
%build
%set_build_flags
make %{?_smp_mflags} LDFLAGS="${LDFLAGS}"
%ifnarch aarch64 %{arm}
%check
make test
%endif
%install
make install DESTDIR=$RPM_BUILD_ROOT mandir=%{_mandir} sbindir=%{_sbindir} libexecdir=%{_libexecdir}
mkdir -p %{buildroot}%{_libexecdir}/{grubby,installkernel}/ %{buildroot}%{_sbindir}/
mv -v %{buildroot}%{_sbindir}/grubby %{buildroot}%{_libexecdir}/grubby/grubby
mv -v %{buildroot}%{_sbindir}/installkernel %{buildroot}%{_libexecdir}/installkernel/installkernel
install -m 0755 %{SOURCE1} %{buildroot}%{_libexecdir}/grubby/
install -m 0755 %{SOURCE4} %{buildroot}%{_libexecdir}/installkernel/
sed -e "s,@@LIBEXECDIR@@,%{_libexecdir}/grubby,g" %{SOURCE2} \
> %{buildroot}%{_sbindir}/grubby
sed -e "s,@@LIBEXECDIR@@,%{_libexecdir}/installkernel,g" %{SOURCE3} \
> %{buildroot}%{_sbindir}/installkernel
rm %{buildroot}%{_mandir}/man8/grubby.8*
install -m 0644 %{SOURCE5} %{buildroot}%{_mandir}/man8/
%package deprecated
Summary: Legacy command line tool for updating bootloader configs
Conflicts: %{name} <= 8.40-13
%description deprecated
This package provides deprecated, legacy grubby. This is for temporary
compatibility only.
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.
%files
%{!?_licensedir:%global license %%doc}
%license COPYING
%dir %{_libexecdir}/grubby
%dir %{_libexecdir}/installkernel
%attr(0755,root,root) %{_libexecdir}/grubby/grubby-bls
%attr(0755,root,root) %{_libexecdir}/grubby/rpm-sort
%attr(0755,root,root) %{_sbindir}/grubby
%attr(0755,root,root) %{_libexecdir}/installkernel/installkernel-bls
%attr(0755,root,root) %{_sbindir}/installkernel
%{_mandir}/man8/[gi]*.8*
%files deprecated
%{!?_licensedir:%global license %%doc}
%license COPYING
%dir %{_libexecdir}/grubby
%dir %{_libexecdir}/installkernel
%attr(0755,root,root) %{_libexecdir}/grubby/grubby
%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*
%changelog
* Wed Jan 10 2024 Marta Lewandowska <mlewando@redhat.com> - 8.40-49
- Do not overwrite all vars that start with GRUB_CMDLINE_LINUX
- Resolves: #RHEL-12853
* Tue Feb 21 2023 Marta Lewandowska <mlewando@redhat.com> - 8.40-48
- Apply Marta's default args fix
- Resolves: #1900829
* Mon Oct 10 2022 Robbie Harwood <rharwood@redhat.com> - 8.40-47
- Backport fedora/rhel9 initial cmdline population
- Resolves: #2129740
* Thu Oct 06 2022 Robbie Harwood <rharwood@redhat.com> - 8.40-46
- Fix quoting of opts in grubby-bls
- Resolves: #2129740
* Thu Aug 11 2022 Robbie Harwood <rharwood@redhat.com> - 8.40-44
- Write to /etc/kernel/cmdline on non-s390x also
- Resolves: #1978226
* Thu Aug 11 2022 Robbie Harwood <rharwood@redhat.com> - 8.40-44
- Write to /etc/kernel/cmdline on s390x and only s390x
- Resolves: #1978226
* Fri Jun 03 2022 Robbie Harwood <rharwood@redhat.com> - 8.40-43
- Additionally write to /etc/kernel/cmdline
- Resolves: #1978226
* Wed Jun 09 2021 Javier Martinez Canillas <javierm@redhat.com> - 8.40-42
- grubby-bls: expand only the kernelopts variable
Resolves: rhbz#1819666
* Thu May 07 2020 Javier Martinez Canillas <javierm@redhat.com> - 8.40-41
- grubby-bls: only attempt to update the cmdline if was already set
Related: rhbz#1152027
* Wed May 06 2020 Javier Martinez Canillas <javierm@redhat.com> - 8.40-40
- Fix installed man page file mode bits
Related: rhbz#1812065
* Wed Apr 29 2020 Javier Martinez Canillas <javierm@redhat.com> - 8.40-39
- grubby-bls: strip only /boot from paths
Resolves: rhbz#1738238
- Make grubby to also update GRUB_CMDLINE_LINUX in /etc/default/grub
Resolves: rhbz#1152027
- grubby-bls: fix corner case when a kernel param value contains a '='
Resolves: rhbz#1787584
- grubby-bls: update man page to match options in current wrapper script
Resolves: rhbz#1812065
- grubby-bls: always escape the delimiter character used in sed commands
Related: rhbz#1787584
- grubby-bls: add a --no-etc-grub-update option
Related: rhbz#1152027
* Thu Nov 28 2019 Javier Martinez Canillas <javierm@redhat.com> - 8.40-38
- 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
- grubby-bls: don't update grubenv when generating grub.cfg for ppc64le
Related: rhbz#1726514
* Mon May 20 2019 Javier Martinez Canillas <javierm@redhat.com> - 8.40-37
- grubby-bls: unset default entry if is the one being removed
Resolves: rhbz#1668329
- grubby-bls: error if args or remove-args is used without update-kernel
Related: rhbz#1690765
- grubby-bls: make --update-kernel ALL to update kernelopts var in grubenv
Resolves: rhbz#1690765
- grubby-bls: fix --add-kernel not working when using the --args option
Related: rhbz#1690765
* Mon May 06 2019 Javier Martinez Canillas <javierm@redhat.com> - 8.40-36
- grubby-bls: show absolute path when printing error about incorrect param
Related: rhbz#1706091
* Fri May 03 2019 Javier Martinez Canillas <javierm@redhat.com> - 8.40-35
- Use mountpoint command to check whether /boot is a mount point
Resolves: rhbz#1706091
* Wed Dec 19 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-34
- grubby-bls: expand all variables in options field when updating it
Resolves: rhbz#1660700
* Tue Dec 18 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-33
- Correctly set LDFLAGS to include hardened flags (pjones)
Related: rhbz#1654936
* Tue Dec 04 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-32
- grubby-bls: lookup default entry by either id or title on grub2
Related: rhbz#1654936
* Fri Nov 23 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-31
- 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
* Tue Nov 20 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-30
- grubby-bls: also print the absolute path in the --default-kernel option
Resolves: rhbz#1649778
* Mon Nov 19 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-29
- 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
* Mon Nov 12 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-28
- grubby-bls: use title field instead of version for zipl default entry
Related: rhbz#1645200
* Thu Nov 08 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-27
- installkernel-bls: remove unnecessary check for GRUB_ENABLE_BLSCFG=true
Resolves: rhbz#1647721
* Mon Nov 05 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-26
- grubby-bls: only compare using relative paths if /boot is a mount point
Resolves: rhbz#1642078
* Wed Oct 31 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-25
- grubby-bls: fix --default-* options for s390x
Resolves: rhbz#1644608
* Fri Oct 26 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-24
- grubby-bls: allow to add many BLS entries for the same kernel image
Resolves: rhbz#1634752
* Fri Oct 19 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-23
- grubby-bls: use ~debug instead of -debug as suffix to sort correctly
Related: rhbz#1638103
* Fri Oct 19 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-22
- grubby-bls: grubby-bls: use id instead of title to get the default entry
Resolves: rhbz#1638103
* Wed Oct 17 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-21
- grubby-bls: escape delimiter character before replacing the options field
Resolves: rhbz#1640017
* Tue Oct 16 2018 Peter Jones <pjones@redhat.com> - 8.40-20
- Add missing patches from RHEL-7 for grubby-deprecated.
Resolves: rhbz#1561919
- grubby-bls: make a copy of the cmdline if is modified for an entry
Resolves: rhbz#1629054
* Mon Oct 15 2018 Peter Jones <pjones@redhat.com> - 8.40-19
- grubby-bls: Make grubby-bls sort everything the same way grub2 does
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
* Thu Oct 11 2018 Peter Jones <pjones@redhat.com> - 8.40-18
- grubby-bls: make "id" be the filename, and include it in --info=ALL
Related: rhbz#1638103
* Fri Oct 05 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-17
- 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
* Thu Oct 04 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-16
- Make grubby-bls execute grub2-mkconfig on ppc64
Resolves: rhbz#1636039
* Fri Sep 28 2018 Peter Jones <pjones@redhat.com> - 8.40-15
- Install installkernel-bls here as well, not just in the grub2 package,
since s390x doesn't have grubby packages.
Related: rhbz#1619344
* Fri Sep 28 2018 Peter Jones <pjones@redhat.com> - 8.40-14
- Re-enable debuginfo generation.
Related: rhbz#1619344
* Fri Aug 31 2018 Peter Jones <pjones@redhat.com> - 8.40-13
- Make the temporary config wrapper be what "grubby" contains, and put
traditional grubby in grubby-deprecated.
* Tue Apr 10 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-12
- Use .rpmsave as backup suffix when switching to BLS configuration
* Fri Apr 06 2018 Javier Martinez Canillas <javierm@redhat.com> - 8.40-11
- Switch grub2 config to BLS configuration on %%postun
* Sat Mar 03 2018 Nathaniel McCallum <npmccallum@redhat.com> - 8.40-10
- Add support for /boot on btrfs subvolumes
* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 8.40-9
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
* Wed Jan 24 2018 Peter Robinson <pbrobinson@fedoraproject.org> 8.40-8
- Drop u-boot uImage generation on ARMv7
- Minor cleanups
* Tue Sep 12 2017 Peter Jones <pjones@redhat.com> - 8.40-7
- Explicitly require grub2-tools on platforms that need grub2-editenv
- Minor packaging cleanups
* Wed Aug 02 2017 Fedora Release Engineering <releng@fedoraproject.org> - 8.40-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 8.40-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 8.40-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
* Wed Feb 03 2016 Fedora Release Engineering <releng@fedoraproject.org> - 8.40-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
* Wed Jun 17 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 8.40-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
* Wed Apr 15 2015 Peter Jones <pjones@redhat.com> - 8.40-1
- Update to 8.40
- More work on the thing that went to testing in 8.39
Resolves: rhbz#1211887
* Tue Apr 14 2015 Peter Jones <pjones@redhat.com> - 8.39-1
- Update to 8.39
- Fix title extraction with some config file types
Resolves: rhbz#1204353
Resolves: rhbz#1204888
Resolves: rhbz#1206943
* Tue Apr 14 2015 Peter Jones <pjones@redhat.com> - 8.38-1
- Update to 8.38
- Fix title extraction with some config file types
Resolves: rhbz#1204353
Resolves: rhbz#1204888
Resolves: rhbz#1206943
* Tue Mar 17 2015 Peter Jones <pjones@redhat.com> - 8.37-1
- Update to 8.37
- Fix test case from 8.35 on ppc64
Resolves: rhbz#1202876
* Thu Nov 13 2014 Peter Jones <pjones@redhat.com> - 8.35-9
- Disable "make check" on arm builds; right now the test suite is broken
there and raises false positives constantly.
* Mon Oct 27 2014 Peter Jones <pjones@redhat.com> - 8.35-8
- Treat kernel and kernel-core as identical in terms of --make-default
Resolves: rhbz#1141414
* Thu Oct 16 2014 Peter Jones <pjones@redhat.com> - 8.35-7
- Revert "debug" image creation for now
Resolves: rhbz#1153410
- Fix minor quoting errors in dtbdir code
Resolves: rhbz#1088933
* Wed Oct 15 2014 Peter Jones <pjones@redhat.com> - 8.35-6
- Update grubby to support device tree options for arm. Again.
Resolves: rhbz#1088933
* Fri Sep 26 2014 Peter Jones <pjones@redhat.com> - 8.35-5
- See if what people are seeing in 1141414 is actually 957681
Related: rhbz#957681
Related: rhbz#1141414
* Sat Aug 16 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 8.35-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
* Sat Jul 12 2014 Tom Callaway <spot@fedoraproject.org> - 8.35-3
- fix license handling
* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 8.35-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
* Wed May 21 2014 Peter Jones <pjones@redhat.com> - 8.35-1
- Fix a minor test case error that causes koji builds to fail.
Related: rhbz#1096358
* Wed May 21 2014 Peter Jones <pjones@redhat.com> - 8.34-1
- Make grub2 "--copy-default --add-kernel=foo --initrd=bar" work when default
has no initrd line.
Resolves: rhbz#1099627
Related: rhbz#1096358
* Tue Apr 01 2014 Peter Jones <pjones@redhat.com> - 8.33-1
- Fix --devtree test in new-kernel-pkg even harder (#1082318)
* Mon Mar 31 2014 Peter Jones <pjones@redhat.com> - 8.32-1
- Fix --devtree test in new-kernel-pkg (#1082318)
- Fix aarch64 #define test.
* Fri Mar 28 2014 Peter Jones <pjones@redhat.com> - 8.31-1
- Update to 8.31
- Fold in patches from Fedora and RHEL 7 trees
* Mon Jan 20 2014 Lubomir Rintel <lkundrak@v3.sk> - 8.28-2
- Fix extlinux default
* Fri Aug 02 2013 Peter Jones <pjones@redhat.com> - 8.28-1
- More work on grub's "saved_entry" system.
Resolves: rhbz#768106
Resolves: rhbz#736188
* Tue Jul 30 2013 Peter Jones <pjones@redhat.com> - 8.27-1
- Make grubby understand grub's "saved_entry" system
Resolves: rhbz#768106
Resolves: rhbz#736188
- BuildRequire grub2 on appropriate platforms, for the test suite.
* Fri Jun 07 2013 Dennis Gilmore <dennis@ausil.us> - 8.26-2
- add patch to update extlinux.conf file on arm if it exists
* Fri May 10 2013 Peter Jones <pjones@redhat.com> - 8.26-1
- Conditionally call arm-boot-config's boot.scr generator if available
Resolves: rhbz#952428
* Tue Apr 09 2013 Peter Jones <pjones@redhat.com> - 8.25-1
- Error instead of segfaulting if we can't find any working config
Resolves: rhbz#912873
Resolves: rhbz#751608
* Tue Mar 19 2013 Peter Jones <pjones@redhat.com> - 8.24-1
- Fix module remove code from Harald (#923441)
* Mon Mar 11 2013 Peter Jones <pjones@redhat.com> - 8.23-1
- Update to 8.23
- Fix empty root device in case of an empty /etc/fstab (lemenkov)
- General refactoring and cleanup (harald)
- Don't clean up modules.* so aggressively (harald)
* Wed Feb 20 2013 Peter Jones <pjones@redhat.com> - 8.22-3
- Add --debug style logging (for both success and failures) to /var/log/grubby
* Thu Feb 14 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 8.22-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
* Fri Jan 04 2013 Peter Jones <pjones@redhat.com> - 8.22-1
- Revert test case for rhbz#742885 - it's a work in progress that isn't
ready yet.
* Fri Jan 04 2013 Peter Jones <pjones@redhat.com> - 8.21-1
- Use systemd vconsole.conf and locale.conf if present
Resolves rhbz#881908
- Avoid unnecessary stat calls (from Ville Skyttä)
Resolves rhbz#741135
- Spelling fixes (Ville Skyttä)
- Add a test case for rhbz#742885
- Handle case-insensitive extlinux config files properly (from Johannes Weiner)
* Tue Oct 02 2012 Peter Jones <pjones@redhat.com> - 8.20-1
- Handle linuxefi initrd and removal correctly.
Resolves: rhbz#859285
* Wed Sep 26 2012 Peter Jones <pjones@redhat.com> - 8.19-1
- Don't accidentally migrate from linuxefi back to linux
Related: rhbz#859285
* Fri Sep 21 2012 Peter Jones <pjones@redhat.com> - 8.18-1
- Change the way the kernel load address is determined for ARM U-Boot.
* Wed Aug 08 2012 Peter Jones <pjones@redhat.com> - 8.17-1
- Update to 8.17
- Fixes a "make test" failure.
* Wed Aug 08 2012 Peter Jones <pjones@redhat.com> - 8.16-1
- Update to 8.16
- Handle "linuxefi" directive on grub2/uefi machines.
* Thu Jul 19 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 8.15-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
* Mon Jun 25 2012 Peter Jones <pjones@redhat.com> - 8.15-1
- Update to 8.15
- Revert dirname change from 8.13; it was wrong.
* Thu Jun 14 2012 Peter Jones <pjones@redhat.com> - 8.14-1
- Update to 8.14 to fix a build problem.
* Thu Jun 14 2012 Peter Jones <pjones@redhat.com> - 8.13-1
- Update to 8.13
- Add some more ARM tweaks (dmartin)
- Better support for other distros (crosa)
* Tue Jun 12 2012 Peter Jones <pjones@redhat.com> - 8.12-2
- Support UBOOT_IMGADDR override on ARM (blc)
* Thu May 31 2012 Peter Jones <pjones@redhat.com> - 8.12-1
- Update to 8.12
- Preserve trailing indentation when splitting line elements (mads)
Resolves: rhbz#742720
- Pick last device mounted on / (pjones,bcl)
Related: rhbz#820340
Related: rhbz#820351
* Wed Mar 21 2012 Peter Jones <pjones@redhat.com> - 8.11-1
- Update to 8.11
Resolves: rhbz#805310
* Thu Mar 15 2012 Peter Jones <pjones@redhat.com> - 8.10-1
- Update to 8.10
- Use "isquote" where appropriate
- Make --remove-kenrel support titles in grub2 (jianzhong.huang)
- Use grub2 if it's there on ppc.
* Fri Mar 02 2012 Peter Jones <pjones@redhat.com> - 8.9-1
- Refactor grub2 title extraction, making it a function (Cleber Rosa)
- Include prefix when printing kernel information (Cleber Rosa)
- Implement support for "default saved" for grub2 (Cleber Rosa)
- Try to display title when printing information with '--info' (Cleber Rosa)
- new-kernel-pkg fails to find U-Boot. (D. Marlin)
- Add support to new-kernel-pkg to recognize ARCH == armv5tel needed for Kir
(D.Marlin)
- Include a / when one is missing in paths (#769641)
- Fix hard coded paths so kernel's "make install" will DTRT.
- Fix endswith() to correctly test its input for validity.
* Tue Feb 07 2012 Dennis Gilmore <dennis@ausil.us> - 8.8-3
- add uboot-tools requires on arm arches
- add uboot config file on arm arches
* Fri Jan 13 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 8.8-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
* Tue Dec 20 2011 Peter Jones <pjones@redhat.com> - 8.8-1
- Fix test cases from 8.7 to work on a system without /boot mounted.
* Tue Dec 20 2011 Peter Jones <pjones@redhat.com> - 8.7-1
- Add a --debug to try to help diagnose "No suitable template". (sandeen,pjones)
* Mon Dec 19 2011 Peter Jones <pjones@redhat.com> - 8.6-1
- Fix a "make test" errors introduced in 8.4-1
* Sat Dec 17 2011 Peter Jones <pjones@redhat.com> - 8.5-1
- Don't hardcode dracut path
Resolves: #768645
* Thu Dec 08 2011 Adam Williamson <awilliam@redhat.com> - 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)
* Thu Sep 29 2011 Peter Jones <pjones@redhat.com> - 8.3-1
- Fix new-kernel-pkg invocation of grubby for grub (patch from Mads Kiilerich)
Resolves: rhbz#725185
* Wed Sep 14 2011 Peter Jones <pjones@redhat.com> - 8.2-1
- Fixes for xen (from Michael Petullo)
Resolves: rhbz#658387
* Fri Jul 22 2011 Peter Jones <pjones@redhat.com> - 8.1-1
- Update to 8.1
- Fix miss-spelled variable name in new-kernel-pkg
* Thu Jul 21 2011 Peter Jones <pjones@redhat.com> - 8.0-1
- Add support for grub2.
* Tue Jun 07 2011 Brian C. Lane <bcl@redhat.com> - 7.0.18-1
- Bump version to 7.0.18 (bcl)
- Fixup new-kernel-pkg errors (#711493) (bcl)
* Mon Jun 06 2011 Peter Jones <pjones@redhat.com> - 7.0.17-1
- Fix references to wrong program name in new-kernel-pkg.8
Resolves: rhbz#663981
* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 7.0.16-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
* Mon Jan 24 2011 Karsten Hopp <karsten@redhat.com> 7.0.16-2
- add BR utils-linux-ng for getopt
* Tue Jul 13 2010 Brian C. Lane <bcl@redhat.com> - 7.0.16-1
- Update to 7.0.16
- Add patch to check the return value of getuuidbydev
- Resolves: rhbz#592294
* Wed Apr 14 2010 Peter Jones <pjones@redhat.com> - 7.0.15-1
- Update to 7.0.15
- Add man pages for installkernel and new-kernel-pkg
Resolves: rhbz#529333
* Wed Apr 14 2010 Peter Jones <pjones@redhat.com> - 7.0.14-1
- Update to 7.0.14
* Thu Feb 11 2010 Peter Jones <pjones@redhat.com> - 7.0.13-1
- Strip boot partition prefix from initrd path if present during --update.
Related: rhbz#557922
- add host only support for local kernel compiles (airlied)
* Mon Feb 08 2010 Peter Jones <pjones@redhat.com> - 7.0.12-1
- compare rootdev using uuid instead of stat, for better btrfs support (josef)
Resolves: rhbz#530108
* Mon Feb 08 2010 Peter Jones <pjones@redhat.com> - 7.0.11-1
- Make it possible to update the initrd without any other change.
Related: rhbz#557922
* Fri Feb 05 2010 Peter Jones <pjones@redhat.com> - 7.0.10-1
- Make --update able to add an initramfs.
Related: rhbz#557922
* Mon Nov 30 2009 Peter Jones <pjones@redhat.com> - 7.0.9-3
- Use s390utils-base as the s390 dep, not s390utils
Related: rhbz#540565
* Tue Nov 24 2009 Peter Jones <pjones@redhat.com> - 7.0.9-2
- Add s390utils dep when on s390, since new-kernel-package needs it.
Resolves: rhbz#540565
* Fri Oct 30 2009 Peter Jones <pjones@redhat.com> - 7.0.9-1
- Add support for dracut to installkernel (notting)
* Thu Oct 1 2009 Hans de Goede <hdegoede@redhat.com> - 7.0.8-1
- Stop using nash
* Fri Sep 11 2009 Hans de Goede <hdegoede@redhat.com> - 7.0.7-1
- Remove writing rd_plytheme=$theme to kernel args in dracut mode (hansg)
- Add a couple of test cases for extra initrds (rstrode)
- Allow tmplLine to be NULL in getInitrdVal (rstrode)
* Fri Sep 11 2009 Peter Jones <pjones@redhat.com> - 7.0.6-1
- Fix test case breakage from 7.0.5 (rstrode)
* Fri Sep 11 2009 Peter Jones <pjones@redhat.com> - 7.0.5-1
- Add support for plymouth as a second initrd. (rstrode)
Resolves: rhbz#520515
* Wed Sep 09 2009 Hans de Goede <hdegoede@redhat.com> - 7.0.4-1
- Add --dracut cmdline argument for %%post generation of dracut initrd
* Wed Aug 26 2009 Hans de Goede <hdegoede@redhat.com> - 7.0.3-1
- Silence error when no /etc/sysconfig/keyboard (#517187)
* Fri Aug 7 2009 Hans de Goede <hdegoede@redhat.com> - 7.0.2-1
- Add --add-dracut-args new-kernel-pkg cmdline option
* Fri Jul 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 7.0.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
* Fri Jul 17 2009 Jeremy Katz <katzj@redhat.com> - 7.0.1-1
- Fix blkid usage (#124246)
* Wed Jun 24 2009 Jeremy Katz <katzj@redhat.com> - 7.0-1
- BR libblkid-devel now instead of e2fsprogs-devel
- Add bits to switch to using dracut for new-kernel-pkg
* Wed Jun 3 2009 Jeremy Katz <katzj@redhat.com> - 6.0.86-2
- add instructions for checking out from git
* Tue Jun 2 2009 Jeremy Katz <katzj@redhat.com> - 6.0.86-1
- initial build after splitting out from mkinitrd
Loading…
Cancel
Save