1d9f0492fSopenharmony_ci#!/usr/bin/env python 2d9f0492fSopenharmony_ci# -*- coding: utf-8 -*- 3d9f0492fSopenharmony_ci# Copyright (c) 2021 Huawei Device Co., Ltd. 4d9f0492fSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 5d9f0492fSopenharmony_ci# you may not use this file except in compliance with the License. 6d9f0492fSopenharmony_ci# You may obtain a copy of the License at 7d9f0492fSopenharmony_ci# 8d9f0492fSopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 9d9f0492fSopenharmony_ci# 10d9f0492fSopenharmony_ci# Unless required by applicable law or agreed to in writing, software 11d9f0492fSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 12d9f0492fSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d9f0492fSopenharmony_ci# See the License for the specific language governing permissions and 14d9f0492fSopenharmony_ci# limitations under the License. 15d9f0492fSopenharmony_ci 16d9f0492fSopenharmony_ciimport optparse 17d9f0492fSopenharmony_ciimport os 18d9f0492fSopenharmony_ciimport sys 19d9f0492fSopenharmony_ciimport stat 20d9f0492fSopenharmony_ciimport json 21d9f0492fSopenharmony_ciimport operator 22d9f0492fSopenharmony_ci 23d9f0492fSopenharmony_ci 24d9f0492fSopenharmony_cidef parse_args(args): 25d9f0492fSopenharmony_ci from scripts.util import build_utils # noqa: E402 26d9f0492fSopenharmony_ci 27d9f0492fSopenharmony_ci args = build_utils.expand_file_args(args) 28d9f0492fSopenharmony_ci 29d9f0492fSopenharmony_ci parser = optparse.OptionParser() 30d9f0492fSopenharmony_ci build_utils.add_depfile_option(parser) 31d9f0492fSopenharmony_ci parser.add_option('--output', help='fixed para file') 32d9f0492fSopenharmony_ci parser.add_option('--source-file', help='source para file') 33d9f0492fSopenharmony_ci parser.add_option('--append-file', action="append", type="string", dest="files", help='appended files') 34d9f0492fSopenharmony_ci parser.add_option('--append-line', action="append", type="string", dest="lines", help='appended lines') 35d9f0492fSopenharmony_ci 36d9f0492fSopenharmony_ci options, _ = parser.parse_args(args) 37d9f0492fSopenharmony_ci return options 38d9f0492fSopenharmony_ci 39d9f0492fSopenharmony_ci 40d9f0492fSopenharmony_cidef load_group_file_as_dict(source_f): 41d9f0492fSopenharmony_ci source_dict = {} 42d9f0492fSopenharmony_ci for line in source_f: 43d9f0492fSopenharmony_ci arr = line.strip().split(":") 44d9f0492fSopenharmony_ci if arr: 45d9f0492fSopenharmony_ci key = arr[0] 46d9f0492fSopenharmony_ci passwd_gid_value = [arr[1], arr[2]] 47d9f0492fSopenharmony_ci value = [':'.join(passwd_gid_value), arr[3]] 48d9f0492fSopenharmony_ci source_dict[key] = value 49d9f0492fSopenharmony_ci return source_dict 50d9f0492fSopenharmony_ci 51d9f0492fSopenharmony_ci 52d9f0492fSopenharmony_cidef insert_append_user_value(key, arr, source_dict): 53d9f0492fSopenharmony_ci if source_dict[key][1] and arr[3]: 54d9f0492fSopenharmony_ci if arr[3] not in source_dict[key][1]: 55d9f0492fSopenharmony_ci user_value = [source_dict[key][1], arr[3]] 56d9f0492fSopenharmony_ci source_dict[key][1] = ','.join(user_value) 57d9f0492fSopenharmony_ci elif source_dict[key][1] == " " and arr[3]: 58d9f0492fSopenharmony_ci source_dict[key][1] = arr[3] 59d9f0492fSopenharmony_ci 60d9f0492fSopenharmony_ci 61d9f0492fSopenharmony_cidef get_append_value(src, source_dict): 62d9f0492fSopenharmony_ci for line in src: 63d9f0492fSopenharmony_ci if line != "\n": 64d9f0492fSopenharmony_ci arr = line.strip().split(":") 65d9f0492fSopenharmony_ci key = arr[0] 66d9f0492fSopenharmony_ci passwd_gid_value = [arr[1], arr[2]] 67d9f0492fSopenharmony_ci if len(arr) > 3: 68d9f0492fSopenharmony_ci value = [':'.join(passwd_gid_value), arr[3]] 69d9f0492fSopenharmony_ci else: 70d9f0492fSopenharmony_ci value = [':'.join(passwd_gid_value), " "] 71d9f0492fSopenharmony_ci if key in source_dict.keys(): 72d9f0492fSopenharmony_ci insert_append_user_value(key, arr, source_dict) 73d9f0492fSopenharmony_ci else: 74d9f0492fSopenharmony_ci source_dict[key] = value 75d9f0492fSopenharmony_ci 76d9f0492fSopenharmony_ci 77d9f0492fSopenharmony_cidef append_group_by_lines(options, source_dict): 78d9f0492fSopenharmony_ci for line in options.lines: 79d9f0492fSopenharmony_ci arr = line.strip().split(":") 80d9f0492fSopenharmony_ci key = arr[0] 81d9f0492fSopenharmony_ci passwd_gid_value = [arr[1], arr[2]] 82d9f0492fSopenharmony_ci if len(arr) > 3: 83d9f0492fSopenharmony_ci value = [':'.join(passwd_gid_value), arr[3]] 84d9f0492fSopenharmony_ci else: 85d9f0492fSopenharmony_ci value = [':'.join(passwd_gid_value), " "] 86d9f0492fSopenharmony_ci if key in source_dict.keys(): 87d9f0492fSopenharmony_ci insert_append_user_value(key, arr, source_dict) 88d9f0492fSopenharmony_ci else: 89d9f0492fSopenharmony_ci source_dict[key] = value 90d9f0492fSopenharmony_ci 91d9f0492fSopenharmony_ci 92d9f0492fSopenharmony_cidef append_group_by_files(options, source_dict): 93d9f0492fSopenharmony_ci for append_f in options.files: 94d9f0492fSopenharmony_ci with open(append_f, 'r') as src: 95d9f0492fSopenharmony_ci get_append_value(src, source_dict) 96d9f0492fSopenharmony_ci 97d9f0492fSopenharmony_ci 98d9f0492fSopenharmony_cidef append_group_files(target_f, options): 99d9f0492fSopenharmony_ci with open(options.source_file, 'r') as source_f: 100d9f0492fSopenharmony_ci source_dict = load_group_file_as_dict(source_f) 101d9f0492fSopenharmony_ci if options.files: 102d9f0492fSopenharmony_ci append_group_by_files(options, source_dict) 103d9f0492fSopenharmony_ci if options.lines: 104d9f0492fSopenharmony_ci append_group_by_lines(options, source_dict) 105d9f0492fSopenharmony_ci for item in source_dict: 106d9f0492fSopenharmony_ci target_f.write(f"{item}:{':'.join(source_dict[item])}\n") 107d9f0492fSopenharmony_ci 108d9f0492fSopenharmony_ci 109d9f0492fSopenharmony_cidef append_passwd_files(target_f, options): 110d9f0492fSopenharmony_ci # Read source file 111d9f0492fSopenharmony_ci with open(options.source_file, 'r') as source_f: 112d9f0492fSopenharmony_ci source_contents = source_f.read() 113d9f0492fSopenharmony_ci 114d9f0492fSopenharmony_ci target_f.write(source_contents) 115d9f0492fSopenharmony_ci if options.files: 116d9f0492fSopenharmony_ci for append_f in options.files: 117d9f0492fSopenharmony_ci with open(append_f, 'r') as src: 118d9f0492fSopenharmony_ci target_f.write(src.read()) 119d9f0492fSopenharmony_ci if options.lines: 120d9f0492fSopenharmony_ci for line in options.lines: 121d9f0492fSopenharmony_ci target_f.write(line) 122d9f0492fSopenharmony_ci target_f.write("\n") 123d9f0492fSopenharmony_ci 124d9f0492fSopenharmony_ci 125d9f0492fSopenharmony_cidef main(args): 126d9f0492fSopenharmony_ci sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, 127d9f0492fSopenharmony_ci os.pardir, os.pardir, os.pardir, os.pardir, "build")) 128d9f0492fSopenharmony_ci from scripts.util import build_utils # noqa: E402 129d9f0492fSopenharmony_ci 130d9f0492fSopenharmony_ci options = parse_args(args) 131d9f0492fSopenharmony_ci 132d9f0492fSopenharmony_ci if options.files: 133d9f0492fSopenharmony_ci depfile_deps = ([options.source_file] + options.files) 134d9f0492fSopenharmony_ci else: 135d9f0492fSopenharmony_ci depfile_deps = ([options.source_file]) 136d9f0492fSopenharmony_ci 137d9f0492fSopenharmony_ci with os.fdopen(os.open(options.output, os.O_RDWR | os.O_CREAT, stat.S_IWUSR | stat.S_IRUSR), 'w') as target_f: 138d9f0492fSopenharmony_ci if operator.contains(options.source_file, "group"): 139d9f0492fSopenharmony_ci append_group_files(target_f, options) 140d9f0492fSopenharmony_ci else: 141d9f0492fSopenharmony_ci append_passwd_files(target_f, options) 142d9f0492fSopenharmony_ci 143d9f0492fSopenharmony_ci build_utils.write_depfile(options.depfile, 144d9f0492fSopenharmony_ci options.output, depfile_deps, add_pydeps=False) 145d9f0492fSopenharmony_ci 146d9f0492fSopenharmony_ci 147d9f0492fSopenharmony_ciif __name__ == '__main__': 148d9f0492fSopenharmony_ci sys.exit(main(sys.argv[1:])) 149