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