Complete Yocto mirror with license table for TQMa6UL (2038-compliance)
- 264 license table entries with exact download URLs (224/264 resolved) - Complete sources/ directory with all BitBake recipes - Build configuration: tqma6ul-multi-mba6ulx, spaetzle (musl) - Full traceability for Softwarefreigabeantrag - GCC 13.4.0, Linux 6.6.102, U-Boot 2023.04, musl 1.2.4 - License distribution: GPL-2.0 (24), MIT (23), GPL-2.0+ (18), BSD-3 (16)
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
# SPDX-FileCopyrightText: Huawei Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
import os
|
||||
import oe
|
||||
import unittest
|
||||
from oeqa.selftest.case import OESelftestTestCase
|
||||
from oeqa.utils.commands import bitbake, get_bb_vars
|
||||
|
||||
class ShadowUtilsTidyFiles(OESelftestTestCase):
|
||||
"""
|
||||
Check if shadow image rootfs files are tidy.
|
||||
|
||||
The tests are focused on testing the functionality provided by the
|
||||
'tidy_shadowutils_files' rootfs postprocess command (via
|
||||
SORT_PASSWD_POSTPROCESS_COMMAND).
|
||||
"""
|
||||
|
||||
def sysconf_build(self):
|
||||
"""
|
||||
Verify if shadow tidy files tests are to be run and if yes, build a
|
||||
test image and return its sysconf rootfs path.
|
||||
"""
|
||||
|
||||
test_image = "core-image-minimal"
|
||||
|
||||
config = 'IMAGE_CLASSES += "extrausers"\n'
|
||||
config += 'EXTRA_USERS_PARAMS = "groupadd -g 1000 oeqatester; "\n'
|
||||
config += 'EXTRA_USERS_PARAMS += "useradd -p \'\' -u 1000 -N -g 1000 oeqatester; "\n'
|
||||
self.write_config(config)
|
||||
|
||||
vars = get_bb_vars(("IMAGE_ROOTFS", "SORT_PASSWD_POSTPROCESS_COMMAND", "sysconfdir"),
|
||||
test_image)
|
||||
passwd_postprocess_cmd = vars["SORT_PASSWD_POSTPROCESS_COMMAND"]
|
||||
self.assertIsNotNone(passwd_postprocess_cmd)
|
||||
if (passwd_postprocess_cmd.strip() != 'tidy_shadowutils_files;'):
|
||||
raise unittest.SkipTest("Testcase skipped as 'tidy_shadowutils_files' "
|
||||
"rootfs post process command is not the set SORT_PASSWD_POSTPROCESS_COMMAND.")
|
||||
|
||||
rootfs = vars["IMAGE_ROOTFS"]
|
||||
self.assertIsNotNone(rootfs)
|
||||
sysconfdir = vars["sysconfdir"]
|
||||
bitbake(test_image)
|
||||
self.assertIsNotNone(sysconfdir)
|
||||
|
||||
return oe.path.join(rootfs, sysconfdir)
|
||||
|
||||
def test_shadowutils_backup_files(self):
|
||||
"""
|
||||
Test that the rootfs doesn't include any known shadow backup files.
|
||||
"""
|
||||
|
||||
backup_files = (
|
||||
'group-',
|
||||
'gshadow-',
|
||||
'passwd-',
|
||||
'shadow-',
|
||||
'subgid-',
|
||||
'subuid-',
|
||||
)
|
||||
|
||||
rootfs_sysconfdir = self.sysconf_build()
|
||||
found = []
|
||||
for backup_file in backup_files:
|
||||
backup_filepath = oe.path.join(rootfs_sysconfdir, backup_file)
|
||||
if os.path.exists(backup_filepath):
|
||||
found.append(backup_file)
|
||||
if (found):
|
||||
raise Exception('The following shadow backup files were found in '
|
||||
'the rootfs: %s' % found)
|
||||
|
||||
def test_shadowutils_sorted_files(self):
|
||||
"""
|
||||
Test that the 'passwd' and the 'group' shadow utils files are ordered
|
||||
by ID.
|
||||
"""
|
||||
|
||||
files = (
|
||||
'passwd',
|
||||
'group',
|
||||
)
|
||||
|
||||
rootfs_sysconfdir = self.sysconf_build()
|
||||
unsorted = []
|
||||
for file in files:
|
||||
filepath = oe.path.join(rootfs_sysconfdir, file)
|
||||
with open(filepath, 'rb') as f:
|
||||
ids = []
|
||||
lines = f.readlines()
|
||||
for line in lines:
|
||||
entries = line.split(b':')
|
||||
ids.append(int(entries[2]))
|
||||
if (ids != sorted(ids)):
|
||||
unsorted.append(file)
|
||||
if (unsorted):
|
||||
raise Exception("The following files were not sorted by ID as expected: %s" % unsorted)
|
||||
Reference in New Issue
Block a user