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