• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2#coding=utf-8
3
4#
5# Copyright (c) 2023 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
21class ParameterParser(dict):
22    def __init__(self, prefix, parameter = None):
23        self["prefix"] = prefix
24        if parameter == None:
25            self["type"] = "string"
26            self["dacUser"] = ""
27            self["dacGroup"] = ""
28            self["dacMode"] = 0
29            self["selinuxLabel"] = ""
30            self["value"] = ""
31        else:
32            self["type"] = parameter.get("type")
33            self["dacUser"] = parameter.get("dacUser")
34            self["dacGroup"] = parameter.get("dacGroup")
35            self["dacMode"] = parameter.get("dacMode")
36            self["selinuxLabel"] = parameter.get("selinuxLabel")
37            self["value"] = parameter.get("value")
38
39    def decode(self, info):
40        self["value"] = info.strip("\"").strip("\'")
41        return True
42
43    def __repr__(self):
44        return self.__str__()
45
46    def __str__(self):
47        return "%s= DAC[%s:%s:%s] selinux[%s] value=%s" % (
48            self["prefix"], self["dacUser"], self["dacGroup"], self["dacMode"],
49            self["selinuxLabel"], self["value"])
50
51class ParameterDacParser(ParameterParser):
52    def __init__(self, prefix, parameter=None):
53        ParameterParser.__init__(self, prefix, parameter)
54
55    def decode(self, info):
56        dacInfo = info.strip("\"").strip("\'").split(":")
57        if len(dacInfo) < 3:
58            print("Invalid dac %s" % info)
59            return False
60
61        self["dacUser"] = dacInfo[0]
62        self["dacGroup"] = dacInfo[1]
63        self["dacMode"] = dacInfo[2]
64        if len(dacInfo) > 3:
65            self["type"] = dacInfo[3]
66        return True
67
68class ParameterSelinuxParser(ParameterParser):
69    def __init__(self, prefix, parameter=None):
70        ParameterParser.__init__(self, prefix, parameter)
71
72    def decode(self, info):
73        self["selinuxLabel"] = info
74        return True
75
76class ParameterFileParser():
77    def __init__(self):
78        self._parameters = {}
79
80    def _handle_param_info(self, file_name, param_info):
81        param_name = param_info[0].strip()
82        old_param = self._parameters.get(param_name)
83        if file_name.endswith(".para.dac"):
84            param = ParameterDacParser(param_name, old_param)
85            if (param.decode(param_info[2].strip())):
86                self._parameters[param_name] = param
87        elif file_name.endswith(".para"):
88            param = ParameterParser(param_name, old_param)
89            if (param.decode(param_info[2].strip())):
90                self._parameters[param_name] = param
91        else:
92            param = ParameterSelinuxParser(param_name, old_param)
93            if (param.decode(param_info[2].strip())):
94                self._parameters[param_name] = param
95
96    def load_parameter_file(self, file_name, str = "="):
97        try:
98            with open(file_name, encoding='utf-8') as fp:
99                line = fp.readline()
100                while line :
101                    if line.startswith("#") or len(line) < 3:
102                        line = fp.readline()
103                        continue
104                    paramInfo = line.partition(str)
105                    if len (paramInfo) != 3:
106                        line = fp.readline()
107                        continue
108                    self._handle_param_info(file_name, paramInfo)
109                    line = fp.readline()
110        except:
111            print("Error, invalid parameter file ", file_name)
112            pass
113
114    def dump_parameter(self):
115        for param in self._parameters.values():
116            print(str(param))
117
118    def _check_file(self, file):
119        valid_file_ext = [".para", ".para.dac"]
120        if not file.is_file():
121            return False
122        for ext in valid_file_ext:
123            if file.name.endswith(ext):
124                return True
125        return False
126
127    def _scan_parameter_file(self, dir):
128        if not os.path.exists(dir):
129            return
130        with os.scandir(dir) as files:
131            for file in files:
132                if self._check_file(file):
133                    self.load_parameter_file(file.path)
134
135    def scan_parameter_file(self, dir):
136        parameter_paths = [
137            "/system/etc/param/ohos_const",
138            "/vendor/etc/param",
139            "/chip_prod/etc/param",
140            "/sys_prod/etc/param",
141            "/system/etc/param",
142        ]
143        for path in parameter_paths:
144            self._scan_parameter_file("{}/packages/phone{}".format(dir, path))
145
146def __create_arg_parser():
147    import argparse
148    parser = argparse.ArgumentParser(description='Collect parameter information from xxxx/etc/param dir.')
149    parser.add_argument('-i', '--input',
150                        help='input parameter files base directory example "out/rk3568/packages/phone/" ',
151                        required=True)
152    return parser
153
154def parameters_collect(base_path):
155    parser = ParameterFileParser()
156    parser.scan_parameter_file(base_path)
157    parser.load_parameter_file(
158        "{}/packages/phone/system/etc/selinux/targeted/contexts/parameter_contexts".format(base_path),
159        " ")
160    return parser
161
162if __name__ == '__main__':
163    args_parser = __create_arg_parser()
164    options = args_parser.parse_args()
165    parameters_collect(options.input)
166