forked from openkylin/platform_build
Use file_contexts.bin from other build to regenerate images.
The old process_file_contexts_bin function did not properly generate a usable file_contexts.bin to regenerate images, so instead use the file_contexts.bin from the other partial target files package. When combining any one of several other partial target files packages with a single system partial target files package, this file will properly apply contexts as long as the same source is used for the system partial target files. Test: Verify that file contexts are properlty applied to vendor image. Bug: 131584454 Change-Id: I16f8cc3b7f2eb7f09746f0ddcb2c1daf3fd19da6
This commit is contained in:
parent
5e25df9f5a
commit
736b223d5f
|
@ -160,6 +160,7 @@ default_system_misc_info_keys = [
|
||||||
|
|
||||||
default_other_item_list = [
|
default_other_item_list = [
|
||||||
'META/boot_filesystem_config.txt',
|
'META/boot_filesystem_config.txt',
|
||||||
|
'META/file_contexts.bin',
|
||||||
'META/otakeys.txt',
|
'META/otakeys.txt',
|
||||||
'META/releasetools.py',
|
'META/releasetools.py',
|
||||||
'META/vendor_filesystem_config.txt',
|
'META/vendor_filesystem_config.txt',
|
||||||
|
@ -442,81 +443,7 @@ def process_misc_info_txt(system_target_files_temp_dir,
|
||||||
output.write('{}={}\n'.format(key, merged_info_dict[key]))
|
output.write('{}={}\n'.format(key, merged_info_dict[key]))
|
||||||
|
|
||||||
|
|
||||||
def process_file_contexts_bin(temp_dir, output_target_files_temp_dir):
|
def process_special_cases(system_target_files_temp_dir,
|
||||||
"""Perform special processing for META/file_contexts.bin.
|
|
||||||
|
|
||||||
This function combines plat_file_contexts and vendor_file_contexts, which are
|
|
||||||
expected to already be extracted in temp_dir, to produce a merged
|
|
||||||
file_contexts.bin that will land in temp_dir at META/file_contexts.bin.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
temp_dir: The name of a scratch directory that this function can use for
|
|
||||||
intermediate files generated during processing.
|
|
||||||
output_target_files_temp_dir: The name of the working directory that must
|
|
||||||
already contain plat_file_contexts and vendor_file_contexts (in the
|
|
||||||
appropriate sub directories), and to which META/file_contexts.bin will be
|
|
||||||
written.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# To create a merged file_contexts.bin file, we use the system and vendor
|
|
||||||
# file contexts files as input, the m4 tool to combine them, the sorting tool
|
|
||||||
# to sort, and finally the sefcontext_compile tool to generate the final
|
|
||||||
# output. We currently omit a checkfc step since the files had been checked
|
|
||||||
# as part of the build.
|
|
||||||
|
|
||||||
# The m4 step concatenates the two input files contexts files. Since m4
|
|
||||||
# writes to stdout, we receive that into an array of bytes, and then write it
|
|
||||||
# to a file.
|
|
||||||
|
|
||||||
# Collect the file contexts that we're going to combine from SYSTEM, VENDOR,
|
|
||||||
# PRODUCT, and ODM. We require SYSTEM and VENDOR, but others are optional.
|
|
||||||
|
|
||||||
file_contexts_list = []
|
|
||||||
|
|
||||||
for partition in ['SYSTEM', 'VENDOR', 'PRODUCT', 'ODM']:
|
|
||||||
prefix = 'plat' if partition == 'SYSTEM' else partition.lower()
|
|
||||||
|
|
||||||
file_contexts = os.path.join(output_target_files_temp_dir, partition, 'etc',
|
|
||||||
'selinux', prefix + '_file_contexts')
|
|
||||||
|
|
||||||
mandatory = partition in ['SYSTEM', 'VENDOR']
|
|
||||||
|
|
||||||
if mandatory or os.path.isfile(file_contexts):
|
|
||||||
file_contexts_list.append(file_contexts)
|
|
||||||
else:
|
|
||||||
logger.warning('file not found: %s', file_contexts)
|
|
||||||
|
|
||||||
command = ['m4', '--fatal-warnings', '-s'] + file_contexts_list
|
|
||||||
|
|
||||||
merged_content = common.RunAndCheckOutput(command, verbose=False)
|
|
||||||
|
|
||||||
merged_file_contexts_txt = os.path.join(temp_dir, 'merged_file_contexts.txt')
|
|
||||||
|
|
||||||
with open(merged_file_contexts_txt, 'wb') as f:
|
|
||||||
f.write(merged_content)
|
|
||||||
|
|
||||||
# The sort step sorts the concatenated file.
|
|
||||||
|
|
||||||
sorted_file_contexts_txt = os.path.join(temp_dir, 'sorted_file_contexts.txt')
|
|
||||||
command = ['fc_sort', merged_file_contexts_txt, sorted_file_contexts_txt]
|
|
||||||
common.RunAndWait(command, verbose=True)
|
|
||||||
|
|
||||||
# Finally, the compile step creates the final META/file_contexts.bin.
|
|
||||||
|
|
||||||
file_contexts_bin = os.path.join(output_target_files_temp_dir, 'META',
|
|
||||||
'file_contexts.bin')
|
|
||||||
|
|
||||||
command = [
|
|
||||||
'sefcontext_compile',
|
|
||||||
'-o',
|
|
||||||
file_contexts_bin,
|
|
||||||
sorted_file_contexts_txt,
|
|
||||||
]
|
|
||||||
|
|
||||||
common.RunAndWait(command, verbose=True)
|
|
||||||
|
|
||||||
|
|
||||||
def process_special_cases(temp_dir, system_target_files_temp_dir,
|
|
||||||
other_target_files_temp_dir,
|
other_target_files_temp_dir,
|
||||||
output_target_files_temp_dir, system_misc_info_keys,
|
output_target_files_temp_dir, system_misc_info_keys,
|
||||||
rebuild_recovery):
|
rebuild_recovery):
|
||||||
|
@ -526,8 +453,6 @@ def process_special_cases(temp_dir, system_target_files_temp_dir,
|
||||||
processing. This function performs all that special-case processing.
|
processing. This function performs all that special-case processing.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
temp_dir: The name of a scratch directory that this function can use for
|
|
||||||
intermediate files generated during processing.
|
|
||||||
system_target_files_temp_dir: The name of a directory containing the special
|
system_target_files_temp_dir: The name of a directory containing the special
|
||||||
items extracted from the system target files package.
|
items extracted from the system target files package.
|
||||||
other_target_files_temp_dir: The name of a directory containing the special
|
other_target_files_temp_dir: The name of a directory containing the special
|
||||||
|
@ -557,10 +482,6 @@ def process_special_cases(temp_dir, system_target_files_temp_dir,
|
||||||
output_target_files_temp_dir=output_target_files_temp_dir,
|
output_target_files_temp_dir=output_target_files_temp_dir,
|
||||||
system_misc_info_keys=system_misc_info_keys)
|
system_misc_info_keys=system_misc_info_keys)
|
||||||
|
|
||||||
process_file_contexts_bin(
|
|
||||||
temp_dir=temp_dir,
|
|
||||||
output_target_files_temp_dir=output_target_files_temp_dir)
|
|
||||||
|
|
||||||
|
|
||||||
def merge_target_files(temp_dir, system_target_files, system_item_list,
|
def merge_target_files(temp_dir, system_target_files, system_item_list,
|
||||||
system_misc_info_keys, other_target_files,
|
system_misc_info_keys, other_target_files,
|
||||||
|
@ -655,7 +576,6 @@ def merge_target_files(temp_dir, system_target_files, system_item_list,
|
||||||
# files package are in place.
|
# files package are in place.
|
||||||
|
|
||||||
process_special_cases(
|
process_special_cases(
|
||||||
temp_dir=temp_dir,
|
|
||||||
system_target_files_temp_dir=system_target_files_temp_dir,
|
system_target_files_temp_dir=system_target_files_temp_dir,
|
||||||
other_target_files_temp_dir=other_target_files_temp_dir,
|
other_target_files_temp_dir=other_target_files_temp_dir,
|
||||||
output_target_files_temp_dir=output_target_files_temp_dir,
|
output_target_files_temp_dir=output_target_files_temp_dir,
|
||||||
|
|
Loading…
Reference in New Issue