diff options
author | Colin Walters <walters@verbum.org> | 2015-05-26 22:28:29 -0400 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2015-05-28 14:21:30 -0400 |
commit | 0f31c4c4b2cc5c475c26cc768f6d2c0812a7e3eb (patch) | |
tree | 2d511dc93074a0a52dab202c3227a9fee4940f94 | |
parent | 3300ee6259d191199f96b5f4e04ccfded3d11b86 (diff) | |
download | ostree-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.py | 105 |
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) |