| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #!/usr/bin/env -S python3 -B
- #
- # Copyright (c) 2021 Project CHIP Authors
- # All rights reserved.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- #
- import json
- import logging
- import re
- import typing
- from configparser import ConfigParser
- from os.path import exists
- import click
- def convert_ini_to_json(ini_dir: str, json_path: str):
- """ Converts chip-tool INI files found in 'ini_dir' into the JSON format expected by the matter python REPL
- and associated test infrastructure.
- Specifically, this will take the three INI files that correspond to the three example CAs (alpha, beta, gamma)
- and munge them together into a single REPL-compatible JSON file.
- """
- python_json_store = {}
- ini_file_paths = ['/chip_tool_config.alpha.ini', '/chip_tool_config.beta.ini', '/chip_tool_config.gamma.ini']
- counter = 1
- for path in ini_file_paths:
- full_path = ini_dir + path
- if (exists(full_path)):
- logging.critical(f"Found chip tool INI file at: {full_path} - Converting...")
- create_repl_config_from_init(ini_file=full_path,
- json_dict=python_json_store, replace_suffix=str(counter))
- counter = counter + 1
- json_file = open(json_path, 'w')
- json.dump(python_json_store, json_file, ensure_ascii=True, indent=4)
- def create_repl_config_from_init(ini_file: str, json_dict: typing.Dict, replace_suffix: str):
- ''' This updates a provided JSON dictionary to create a REPL compliant configuration store that
- contains the correct 'repl-config' and 'sdk-config' keys built from the provided chip-tool
- INI file that contains the root public keys. The INI file will typically be named
- with the word 'alpha', 'beta' or 'gamma' in the name.
- ini_file: Path to source INI file
- json_dict: JSON dictionary to be updated. Multiple passes through this function using
- the same dictionary is possible.
- replace_suffix: The credentials in the INI file typically have keys that end with 0. This suffix
- can be replaced with a different number.
- '''
- if ('repl-config' not in json_dict):
- json_dict['repl-config'] = {}
- if ('caList' not in json_dict['repl-config']):
- json_dict['repl-config']['caList'] = {}
- json_dict['repl-config']['caList'][replace_suffix] = [
- {'fabricId': int(replace_suffix), 'vendorId': 0XFFF1}
- ]
- if ('sdk-config' not in json_dict):
- json_dict['sdk-config'] = {}
- load_ini_into_dict(ini_file=ini_file, json_dict=json_dict['sdk-config'], replace_suffix=replace_suffix)
- def load_ini_into_dict(ini_file: str, json_dict: typing.Dict, replace_suffix: str):
- """ Loads the specific INI file containing CA credential information into the provided dictionary. A 'replace_suffix' string
- has to be provided to convert the existing numerical suffix to a different value.
- NOTE: This does not do any conversion of the keys into a format acceptable by the Python REPL environment. Please see
- create_repl_config_from_init above if that is desired.
- """
- config = ConfigParser()
- # Enable case-sensitive keys.
- config.optionxform = str
- config.read(ini_file)
- for key in config['Default']:
- value = config['Default'][key]
- key = re.sub(r'(.*?)[0-9]+', r'\1', key) + replace_suffix
- json_dict[key] = value
- @click.command()
- @click.option('--ini-dir', type=click.Path(exists=True), show_default=True, default='/tmp', help='Path to directory containing INI files that chip-tool uses for its tests')
- @click.option('--json-path', type=click.Path(exists=False), show_default=True, default='/tmp/repl-storage.json', help='Path to JSON file used by Python infrastructure')
- def main(ini_dir: str, json_path: str):
- convert_ini_to_json(ini_dir, json_path)
- return 0
- if __name__ == '__main__':
- main(auto_envvar_prefix='CHIP')
|