Tests: Refactor bootloader-entries-crosscheck
authorWilliam Manley <will@stb-tester.com>
Tue, 14 Jul 2020 12:32:30 +0000 (13:32 +0100)
committerWilliam Manley <will@stb-tester.com>
Mon, 26 Oct 2020 23:54:19 +0000 (23:54 +0000)
I've made this use functions to make it easier to add support for more
bootloaders.  Seeing as there will be a big diff anyway I've also adjusted
the formatting to make it pep8 compliant.

tests/bootloader-entries-crosscheck.py

index 605bd080ca41948992616f937af1108aa59bbf77..b5a0206644fa01110af9f708a3effaa70aad7dc9 100755 (executable)
 import os
 import sys
 
-if len(sys.argv) == 1:
-    sysroot = ''
-else:
-    sysroot = sys.argv[1]
 
-bootloader = sys.argv[2]
-loaderpath = sysroot + '/boot/loader/entries'
-syslinuxpath = sysroot + '/boot/syslinux/syslinux.cfg'
+def main(argv):
+    _, sysroot, bootloader = argv
+
+    if bootloader == "grub2":
+        sys.stdout.write('GRUB2 configuration validation not implemented.\n')
+        return 0
+    else:
+        return validate_syslinux(sysroot)
 
-if bootloader == "grub2":
-    sys.stdout.write('GRUB2 configuration validation not implemented.\n')
-    sys.exit(0)
 
 def fatal(msg):
     sys.stderr.write(msg)
     sys.stderr.write('\n')
     sys.exit(1)
 
-def entry_get_version(entry):
-    return int(entry['version'])
 
 def get_ostree_option(optionstring):
     for o in optionstring.split():
         if o.startswith('ostree='):
             return o[8:]
-    raise ValueError('ostree= not found')
-            
-entries = []
-syslinux_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(key=entry_get_version, reverse=True)
-
-# Parse SYSLINUX config
-with open(syslinuxpath) as f:
-    in_ostree_config = False
-    syslinux_entry = None
-    syslinux_default = None
-    for line in f:
-        try:
-            k, v = line.strip().split(" ", 1)
-        except ValueError:
-            continue
-        if k == 'DEFAULT':
-            if syslinux_entry is not None:
-                syslinux_default = v
-        elif k == 'LABEL':
-            if syslinux_entry is not None:
-                syslinux_entries.append(syslinux_entry)
-            syslinux_entry = {}
-            syslinux_entry['title'] = v
-        elif k == 'KERNEL':
-            syslinux_entry['linux'] = v
-        elif k == 'INITRD':
-            syslinux_entry['initrd'] = v
-        elif k == 'APPEND':
-            syslinux_entry['options'] = v
-    if syslinux_entry is not None:
-        syslinux_entries.append(syslinux_entry)
-
-if len(entries) != len(syslinux_entries):
-    fatal("Found {0} loader entries, but {1} SYSLINUX entries\n".format(len(entries), len(syslinux_entries)))
+    raise ValueError('ostree= not found in %r' % (optionstring,))
 
 
-def assert_eq(a, b):
-    assert a == b, "%r == %r" % (a, b)
+def parse_loader_configs(sysroot):
+    loaderpath = sysroot + '/boot/loader/entries'
+    entries = []
 
+    # Parse loader configs
+    for fname in os.listdir(loaderpath):
+        path = os.path.join(loaderpath, fname)
+        entry = {}
+        with open(path) as f:
+            for line in f:
+                line = line.strip()
+                if (line == '' or line.startswith('#')):
+                    continue
+                k, v = line.split(' ', 1)
+                entry[k] = v
+        entries.append(entry)
+    entries.sort(key=lambda e: int(e['version']), reverse=True)
+    return entries
 
-def assert_key_same_file(a, b, key):
-    aval = a[key]
-    bval = b[key]
-    sys.stderr.write("aval: %r\nbval: %r\n" % (aval, bval))
 
-    # Paths in entries are always relative to /boot
-    entry = os.stat(sysroot + "/boot" + aval)
+def validate_syslinux(sysroot):
+    syslinuxpath = sysroot + '/boot/syslinux/syslinux.cfg'
 
-    # Syslinux entries can be relative to /boot (if it's on another filesystem)
-    # or relative to / if /boot is on /.
-    s1 = os.stat(sysroot + bval)
-    s2 = os.stat(sysroot + "/boot" + bval)
+    entries = parse_loader_configs(sysroot)
+    syslinux_entries = []
 
-    # A symlink ensures that no matter what they point at the same file
-    assert_eq(entry, s1)
-    assert_eq(entry, s2)
+    # Parse SYSLINUX config
+    with open(syslinuxpath) as f:
+        syslinux_entry = None
+        for line in f:
+            try:
+                k, v = line.strip().split(" ", 1)
+            except ValueError:
+                continue
+            if k == 'DEFAULT':
+                if syslinux_entry is not None:
+                    syslinux_default = v
+            elif k == 'LABEL':
+                if syslinux_entry is not None:
+                    syslinux_entries.append(syslinux_entry)
+                syslinux_entry = {}
+                syslinux_entry['title'] = v
+            elif k == 'KERNEL':
+                syslinux_entry['linux'] = v
+            elif k == 'INITRD':
+                syslinux_entry['initrd'] = v
+            elif k == 'APPEND':
+                syslinux_entry['options'] = v
+        if syslinux_entry is not None:
+            syslinux_entries.append(syslinux_entry)
+
+    if len(entries) != len(syslinux_entries):
+        fatal("Found {0} loader entries, but {1} SYSLINUX entries\n".format(
+            len(entries), len(syslinux_entries)))
+
+    def assert_key_same_file(a, b, key):
+        aval = a[key]
+        bval = b[key]
+        sys.stderr.write("aval: %r\nbval: %r\n" % (aval, bval))
+
+        # Paths in entries are always relative to /boot
+        entry = os.stat(sysroot + "/boot" + aval)
+
+        # Syslinux entries can be relative to /boot (if it's on another filesystem)
+        # or relative to / if /boot is on /.
+        s1 = os.stat(sysroot + bval)
+        s2 = os.stat(sysroot + "/boot" + bval)
+
+        # A symlink ensures that no matter what they point at the same file
+        assert_eq(entry, s1)
+        assert_eq(entry, s2)
+
+    for i, (entry, syslinuxentry) in enumerate(zip(entries, syslinux_entries)):
+        assert_key_same_file(entry, syslinuxentry, 'linux')
+        assert_key_same_file(entry, syslinuxentry, 'initrd')
+        entry_ostree = get_ostree_option(entry['options'])
+        syslinux_ostree = get_ostree_option(syslinuxentry['options'])
+        if entry_ostree != syslinux_ostree:
+            fatal("Mismatch on ostree option: {0} != {1}".format(
+                entry_ostree, syslinux_ostree))
+
+    sys.stdout.write('SYSLINUX configuration validated\n')
+    return 0
 
 
-for i,(entry,syslinuxentry) in enumerate(zip(entries, syslinux_entries)):
-    assert_key_same_file(entry, syslinuxentry, 'linux')
-    assert_key_same_file(entry, syslinuxentry, 'initrd')
-    entry_ostree = get_ostree_option(entry['options'])
-    syslinux_ostree = get_ostree_option(syslinuxentry['options'])
-    if entry_ostree != syslinux_ostree:
-        fatal("Mismatch on ostree option: {0} != {1}".format(entry_ostree, syslinux_ostree))
+def assert_eq(a, b):
+    assert a == b, "%r == %r" % (a, b)
+
 
-sys.stdout.write('SYSLINUX configuration validated\n')
-sys.exit(0)
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))