예제 #1
0
    def get_module_dict(
            self, exclusions: typing.Container[KernelFileType],
            module_directory: Path
    ) -> typing.Dict[str, typing.List[GenericFile]]:
        """Get dict of module directories found in /lib/modules"""
        module_dict: typing.Dict[str, typing.List[GenericFile]] = {}
        try:
            diter = os.listdir(module_directory)
        except FileNotFoundError:
            pass
        else:
            for fn in diter:
                if fn.startswith('.'):
                    continue
                path = module_directory / fn
                if path.is_symlink() or not path.is_dir():
                    continue
                mlist = module_dict.setdefault(fn, [])
                mobj = ModuleDirectory(path)

                if KernelFileType.BUILD not in exclusions:
                    try:
                        build = mobj.get_build_dir()
                        if build.is_dir():
                            mlist.append(
                                GenericDirectory(build, KernelFileType.BUILD))
                    except FileNotFoundError:
                        pass

                # note: top directory must come last so that it isn't
                # removed before its subdirs
                if KernelFileType.MODULES not in exclusions:
                    mlist.append(mobj)
        return module_dict
예제 #2
0
    def test_exclude_build(self) -> None:
        with self.create_layout() as td:
            path = Path(td)
            boot = path / 'boot'
            modules = path / 'lib/modules'

            self.assertEqual(
                sorted(
                    kernel_paths(
                        StdLayout(root=path).find_kernels(
                            exclusions=[KFT.BUILD]))),
                [('1.2.2', [
                    GenericFile(boot / 'System.map-1.2.2', KFT.SYSTEM_MAP),
                    KernelImage(boot / 'vmlinuz-1.2.2'),
                    ModuleDirectory(modules / '1.2.2'),
                ], '1.2.2'),
                 ('1.2.3', [
                     GenericFile(boot / 'System.map-1.2.3', KFT.SYSTEM_MAP),
                     GenericFile(boot / 'config-1.2.3', KFT.CONFIG),
                     GenericFile(boot / 'initrd-1.2.3.img', KFT.INITRAMFS),
                     KernelImage(boot / 'vmlinuz-1.2.3'),
                     ModuleDirectory(modules / '1.2.3'),
                 ], '1.2.3'),
                 ('1.2.3.old', [
                     GenericFile(boot / 'System.map-1.2.3.old',
                                 KFT.SYSTEM_MAP),
                     GenericFile(boot / 'config-1.2.3.old', KFT.CONFIG),
                     GenericFile(boot / 'initrd-1.2.3.img.old', KFT.INITRAMFS),
                     KernelImage(boot / 'vmlinuz-1.2.3.old'),
                     ModuleDirectory(modules / '1.2.3'),
                 ], '1.2.3'),
                 ('1.2.4', [
                     GenericFile(boot / 'config-1.2.4', KFT.CONFIG),
                     ModuleDirectory(modules / '1.2.4'),
                 ], None)])
예제 #3
0
    def test_rel_symlink(self) -> None:
        td = Path(self.td.name)
        mdir = td / 'modules/1.2.3'
        os.makedirs(mdir)
        os.makedirs(td / 'src/linux')
        os.symlink('../../src/linux', mdir / 'build')

        self.assertEqual(
            ModuleDirectory(mdir).get_build_dir(), mdir / '../../src/linux')
예제 #4
0
    def test_modules_only(self) -> None:
        test_spec = [
            'lib/modules/1.2.3/test.ko',
            'lib/modules/1.2.4/test.ko',
            'usr/src/linux/Makefile',
        ]
        with make_test_files(test_spec) as td:
            path = Path(td)
            modules = path / 'lib/modules'

            os.symlink('../../../usr/src/linux', modules / '1.2.4/build')

            self.assertEqual(
                sorted(kernel_paths(StdLayout(root=path).find_kernels())),
                [('1.2.3', [ModuleDirectory(modules / '1.2.3')], None),
                 ('1.2.4', [
                     ModuleDirectory(modules / '1.2.4'),
                     GenericFile(modules / '1.2.4/../../../usr/src/linux',
                                 KFT.BUILD)
                 ], None)])
예제 #5
0
    def test_exclude_misc(self) -> None:
        with self.create_layout() as td:
            path = Path(td)
            boot = path / f'boot/{self.machine_id}'
            modules = path / 'lib/modules'

            self.assertEqual(
                sorted(
                    kernel_paths(
                        BlSpecLayout(root=path).find_kernels(
                            exclusions=[KFT.MISC]))),
                [
                    ('1.2.1', [
                        EmptyDirectory(boot / '1.2.1'),
                        GenericFile(boot / '1.2.1/initrd', KFT.INITRAMFS),
                        KernelImage(boot / '1.2.1/linux'),
                        ModuleDirectory(modules / '1.2.1'),
                    ], '1.2.1'),
                    ('1.2.2', [
                        EmptyDirectory(boot / '1.2.2'),
                        GenericFile(boot / '1.2.2/initrd', KFT.INITRAMFS),
                        KernelImage(boot / '1.2.2/linux'),
                        ModuleDirectory(modules / '1.2.2'),
                        GenericFile(modules / '1.2.2/../../../usr/src/linux',
                                    KFT.BUILD),
                    ], '1.2.2'),
                    ('1.2.3', [
                        EmptyDirectory(boot / '1.2.3'),
                        GenericFile(boot / '1.2.3/initrd', KFT.INITRAMFS),
                        KernelImage(boot / '1.2.3/linux'),
                        ModuleDirectory(modules / '1.2.3'),
                        GenericFile(modules / '1.2.3/../../../usr/src/linux',
                                    KFT.BUILD),
                    ], '1.2.3'),
                    ('1.2.4', [
                        EmptyDirectory(boot / '1.2.4'),
                        GenericFile(boot / '1.2.4/initrd', KFT.INITRAMFS),
                        ModuleDirectory(modules / '1.2.4'),
                    ], None),
                ])