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