• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2#coding=utf-8
3
4#
5# Copyright (c) 2023-2024 Huawei Device Co., Ltd.
6# Licensed under the Apache License, Version 2.0 (the "License");
7# you may not use this file except in compliance with the License.
8# You may obtain a copy of the License at
9#
10#     http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS,
14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15# See the License for the specific language governing permissions and
16# limitations under the License.
17#
18
19import os
20
21
22class ParameterParser(dict):
23    def __init__(self, prefix, parameter=None):
24        self["prefix"] = prefix
25        if parameter == None:
26            self["type"] = "string"
27            self["dacUser"] = ""
28            self["dacGroup"] = ""
29            self["dacMode"] = 0
30            self["selinuxLabel"] = ""
31            self["value"] = ""
32        else:
33            self["type"] = parameter.get("type")
34            self["dacUser"] = parameter.get("dacUser")
35            self["dacGroup"] = parameter.get("dacGroup")
36            self["dacMode"] = parameter.get("dacMode")
37            self["selinuxLabel"] = parameter.get("selinuxLabel")
38            self["value"] = parameter.get("value")
39
40    def __repr__(self):
41        return self.__str__()
42
43    def __str__(self):
44        return "%s= DAC[%s:%s:%s] selinux[%s] value=%s" % (
45            self["prefix"], self["dacUser"], self["dacGroup"], self["dacMode"],
46            self["selinuxLabel"], self["value"])
47
48    def decode(self, info):
49        self["value"] = info.strip("\"").strip("\'")
50        return True
51
52
53class ParameterDacParser(ParameterParser):
54    def __init__(self, prefix, parameter=None):
55        ParameterParser.__init__(self, prefix, parameter)
56
57    def decode(self, info):
58        dac_info = info.strip("\"").strip("\'").split(":")
59        if len(dac_info) < 3:
60            print("Invalid dac %s" % info)
61            return False
62
63        self["dacUser"] = dac_info[0]
64        self["dacGroup"] = dac_info[1]
65        self["dacMode"] = dac_info[2]
66        if len(dac_info) > 3:
67            self["type"] = dac_info[3]
68        return True
69
70
71class ParameterSelinuxParser(ParameterParser):
72    def __init__(self, prefix, parameter=None):
73        ParameterParser.__init__(self, prefix, parameter)
74
75    def decode(self, info):
76        self["selinuxLabel"] = info
77        return True
78
79
80class ParameterFileParser():
81    def __init__(self):
82        self._parameters = {}
83
84    def load_parameter_file(self, file_name, delimiter="="):
85        try:
86            with open(file_name, encoding='utf-8') as fp:
87                line = fp.readline()
88                while line :
89                    if line.startswith("#") or len(line) < 3:
90                        line = fp.readline()
91                        continue
92                    param_info = line.partition(delimiter)
93                    if len(param_info) != 3:
94                        line = fp.readline()
95                        continue
96                    self._handle_param_info(file_name, param_info)
97                    line = fp.readline()
98        except:
99            print("Warning, invalid parameter file ", file_name)
100            pass
101
102    def dump_parameter(self):
103        for param in self._parameters.values():
104            print(str(param))
105
106    def scan_parameter_file(self, directory):
107        parameter_paths = [
108            "/system/etc/param/ohos_const",
109            "/vendor/etc/param",
110            "/chip_prod/etc/param",
111            "/sys_prod/etc/param",
112            "/system/etc/param",
113        ]
114        for path in parameter_paths:
115            self._scan_parameter_file("{}/packages/phone{}".format(directory, path))
116
117    def _handle_param_info(self, file_name, param_info):
118        param_name = param_info[0].strip()
119        old_param = self._parameters.get(param_name)
120        if file_name.endswith(".para.dac"):
121            param = ParameterDacParser(param_name, old_param)
122            if (param.decode(param_info[2].strip())):
123                self._parameters[param_name] = param
124        elif file_name.endswith(".para"):
125            param = ParameterParser(param_name, old_param)
126            if (param.decode(param_info[2].strip())):
127                self._parameters[param_name] = param
128        else:
129            param = ParameterSelinuxParser(param_name, old_param)
130            if (param.decode(param_info[2].strip())):
131                self._parameters[param_name] = param
132
133    def _check_file(self, file):
134        valid_file_ext = [".para", ".para.dac"]
135        if not file.is_file():
136            return False
137        for ext in valid_file_ext:
138            if file.name.endswith(ext):
139                return True
140        return False
141
142    def _scan_parameter_file(self, directory):
143        if not os.path.exists(directory):
144            return
145        with os.scandir(directory) as files:
146            for file in files:
147                if self._check_file(file):
148                    self.load_parameter_file(file.path)
149
150
151def __create_arg_parser():
152    import argparse
153    parser = argparse.ArgumentParser(description='Collect parameter information from xxxx/etc/param dir.')
154    parser.add_argument('-i', '--input',
155                        help='input parameter files base directory example "out/rk3568/packages/phone/" ',
156                        required=True)
157    return parser
158
159
160def parameters_collect(base_path):
161    parser = ParameterFileParser()
162    parser.scan_parameter_file(base_path)
163    parser.load_parameter_file(
164        "{}/packages/phone/system/etc/selinux/targeted/contexts/parameter_contexts".format(base_path),
165        " ")
166    return parser
167
168if __name__ == '__main__':
169    args_parser = __create_arg_parser()
170    options = args_parser.parse_args()
171    parameters_collect(options.input)
172