summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2015-05-26 22:28:29 -0400
committerColin Walters <walters@verbum.org>2015-05-28 14:21:30 -0400
commit0f31c4c4b2cc5c475c26cc768f6d2c0812a7e3eb (patch)
tree2d511dc93074a0a52dab202c3227a9fee4940f94
parent3300ee6259d191199f96b5f4e04ccfded3d11b86 (diff)
downloadostree-0f31c4c4b2cc5c475c26cc768f6d2c0812a7e3eb.tar.gz
tests: Add a test script to cross-check loader config vs GRUB2
One can run this on a machine to validate things. I'd like to get this plugged into the actual OSTree tests as soon as we can figure out how to sanely run grub2-generate as non-root in our test suite. Alternatively, this script can easily be run on a real install.
-rw-r--r--tests/grub2-entries-crosscheck.py105
1 files changed, 105 insertions, 0 deletions
diff --git a/tests/grub2-entries-crosscheck.py b/tests/grub2-entries-crosscheck.py
new file mode 100644
index 00000000..d68394d3
--- /dev/null
+++ b/tests/grub2-entries-crosscheck.py
@@ -0,0 +1,105 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2015 Red Hat
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+import os
+import sys
+
+if len(sys.argv) == 1:
+ loaderpath = '/boot/loader/entries'
+ grub2path = '/boot/grub2/grub.cfg'
+else:
+ loaderpath = sys.argv[1]
+ grub2path = sys.argv[2]
+
+def fatal(msg):
+ sys.stderr.write(msg)
+ sys.stderr.write('\n')
+ sys.exit(1)
+
+def compare_entries_descending(a, b):
+ return int(b['version']) - int(a['version'])
+
+def get_ostree_option(optionstring):
+ for o in optionstring.split():
+ if o.startswith('ostree='):
+ return o[8:]
+ raise ValueError('ostree= not found')
+
+entries = []
+grub2_entries = []
+
+# Parse loader configs
+for fname in os.listdir(loaderpath):
+ path = os.path.join(loaderpath, fname)
+ with open(path) as f:
+ entry = {}
+ for line in f:
+ line = line.strip()
+ if (line == '' or line.startswith('#')):
+ continue
+ s = line.find(' ')
+ assert s > 0
+ k = line[0:s]
+ v = line[s+1:]
+ entry[k] = v
+ entries.append(entry)
+ entries.sort(compare_entries_descending)
+
+# Parse GRUB2 config
+with open(grub2path) as f:
+ in_ostree_config = False
+ grub2_entry = None
+ for line in f:
+ if line.startswith('### BEGIN /etc/grub.d/15_ostree ###'):
+ in_ostree_config = True
+ elif line.startswith('### END /etc/grub.d/15_ostree ###'):
+ in_ostree_config = False
+ if grub2_entry is not None:
+ grub2_entries.append(grub2_entry)
+ elif in_ostree_config:
+ if line.startswith('menuentry '):
+ if grub2_entry is not None:
+ grub2_entries.append(grub2_entry)
+ grub2_entry = {}
+ elif line.startswith('linux'):
+ parts = line.split()
+ grub2_entry['linux'] = parts[1]
+ grub2_entry['options'] = ' '.join(parts[2:])
+ elif line.startswith('initrd'):
+ grub2_entry['initrd'] = line.split()[1]
+
+if len(entries) != len(grub2_entries):
+ fatal("Found {0} loader entries, but {1} GRUB2 entries\n".format(len(entries), len(grub2_entries)))
+
+def assert_matches_key(a, b, key):
+ aval = a[key]
+ bval = b[key]
+ if aval != bval:
+ fatal("Mismatch on {0}: {1} != {2}".format(key, aval, bval))
+
+for i,(entry,grub2entry) in enumerate(zip(entries, grub2_entries)):
+ assert_matches_key(entry, grub2entry, 'linux')
+ assert_matches_key(entry, grub2entry, 'initrd')
+ entry_ostree = get_ostree_option(entry['options'])
+ grub2_ostree = get_ostree_option(grub2entry['options'])
+ if entry_ostree != grub2_ostree:
+ fatal("Mismatch on ostree option: {0} != {1}".format(entry_ostree, grub2_ostree))
+
+sys.stdout.write('GRUB2 configuration validated\n')
+sys.exit(0)