13f085823Sopenharmony_ci#!/usr/bin/env python3
23f085823Sopenharmony_ci# coding=utf-8
33f085823Sopenharmony_ci
43f085823Sopenharmony_ci#
53f085823Sopenharmony_ci# Copyright (c) 2023 Huawei Device Co., Ltd.
63f085823Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
73f085823Sopenharmony_ci# you may not use this file except in compliance with the License.
83f085823Sopenharmony_ci# You may obtain a copy of the License at
93f085823Sopenharmony_ci#
103f085823Sopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
113f085823Sopenharmony_ci#
123f085823Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
133f085823Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
143f085823Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153f085823Sopenharmony_ci# See the License for the specific language governing permissions and
163f085823Sopenharmony_ci# limitations under the License.
173f085823Sopenharmony_ci#
183f085823Sopenharmony_ci
193f085823Sopenharmony_ciimport os
203f085823Sopenharmony_ciimport json
213f085823Sopenharmony_ciimport stat
223f085823Sopenharmony_ciimport subprocess
233f085823Sopenharmony_ciimport time
243f085823Sopenharmony_cifrom subprocess import Popen, PIPE, STDOUT, TimeoutExpired
253f085823Sopenharmony_ci
263f085823Sopenharmony_ci
273f085823Sopenharmony_cidef logger(content, level):
283f085823Sopenharmony_ci    """
293f085823Sopenharmony_ci    日志打印
303f085823Sopenharmony_ci    :param content:日志内容
313f085823Sopenharmony_ci    :param level: 日志等级
323f085823Sopenharmony_ci    :return:
333f085823Sopenharmony_ci    """
343f085823Sopenharmony_ci    create_time = "{}".format(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
353f085823Sopenharmony_ci    print("[{}] [{}] [{}]".format(create_time, level, content))
363f085823Sopenharmony_ci
373f085823Sopenharmony_ci
383f085823Sopenharmony_cidef json_parse(json_file):
393f085823Sopenharmony_ci    """
403f085823Sopenharmony_ci    json文件解析为json对象
413f085823Sopenharmony_ci    :param json_file:json文件
423f085823Sopenharmony_ci    :return:json对象
433f085823Sopenharmony_ci    """
443f085823Sopenharmony_ci    if os.path.exists(json_file):
453f085823Sopenharmony_ci        with open(json_file, "r") as jf:
463f085823Sopenharmony_ci            return json.load(jf)
473f085823Sopenharmony_ci
483f085823Sopenharmony_ci    logger("{} not exist.".format(json_file), "ERROR")
493f085823Sopenharmony_ci    return {}
503f085823Sopenharmony_ci
513f085823Sopenharmony_ci
523f085823Sopenharmony_cidef get_product_name(root_path):
533f085823Sopenharmony_ci    """
543f085823Sopenharmony_ci    从ohos_config.json中获取编译产物路径
553f085823Sopenharmony_ci    :param root_path: ohos_config.json所在的目录
563f085823Sopenharmony_ci    :return: 编译产量生成的路径
573f085823Sopenharmony_ci    """
583f085823Sopenharmony_ci    ohos_config = os.path.join(root_path, "out", "ohos_config.json")
593f085823Sopenharmony_ci    json_obj = json_parse(ohos_config)
603f085823Sopenharmony_ci    if json_obj:
613f085823Sopenharmony_ci        product_name = json_obj["out_path"].split("out")[1].strip("/")
623f085823Sopenharmony_ci        return product_name
633f085823Sopenharmony_ci
643f085823Sopenharmony_ci    logger("{} not exist.".format(ohos_config), "ERROR")
653f085823Sopenharmony_ci    return ""
663f085823Sopenharmony_ci
673f085823Sopenharmony_ci
683f085823Sopenharmony_cidef get_target_cpu(root_path):
693f085823Sopenharmony_ci    """
703f085823Sopenharmony_ci    从ohos_config.json中获取编译cpu
713f085823Sopenharmony_ci    :param root_path: ohos_config.json所在的目录
723f085823Sopenharmony_ci    :return: 编译产量生成的路径
733f085823Sopenharmony_ci    """
743f085823Sopenharmony_ci    ohos_config = os.path.join(root_path, "out", "ohos_config.json")
753f085823Sopenharmony_ci    json_obj = json_parse(ohos_config)
763f085823Sopenharmony_ci    if json_obj:
773f085823Sopenharmony_ci        target_cpu = json_obj["target_cpu"]
783f085823Sopenharmony_ci        return target_cpu
793f085823Sopenharmony_ci
803f085823Sopenharmony_ci    logger("{} not exist.".format(ohos_config), "ERROR")
813f085823Sopenharmony_ci    return ""
823f085823Sopenharmony_ci
833f085823Sopenharmony_ci
843f085823Sopenharmony_cidef shell_command(command_list: list):
853f085823Sopenharmony_ci    """
863f085823Sopenharmony_ci    命令行执行命令
873f085823Sopenharmony_ci    :param command_list:命令参数列表
883f085823Sopenharmony_ci    :return:
893f085823Sopenharmony_ci    """
903f085823Sopenharmony_ci    process = Popen(command_list, stdout=PIPE, stderr=STDOUT)
913f085823Sopenharmony_ci    try:
923f085823Sopenharmony_ci        outs, errs = process.communicate(timeout=900)
933f085823Sopenharmony_ci    except TimeoutExpired:
943f085823Sopenharmony_ci        process.kill()
953f085823Sopenharmony_ci        outs, errs = process.communicate()
963f085823Sopenharmony_ci    logger(outs.decode("utf-8").strip(), "INFO")
973f085823Sopenharmony_ci
983f085823Sopenharmony_ci    return errs, process.returncode
993f085823Sopenharmony_ci
1003f085823Sopenharmony_ci
1013f085823Sopenharmony_cidef hdc_command(device_ip, device_port, device_sn, command):
1023f085823Sopenharmony_ci    """
1033f085823Sopenharmony_ci    hdc对远程映射的设备执行命令
1043f085823Sopenharmony_ci    :param device_ip:远程映射的ip
1053f085823Sopenharmony_ci    :param device_port:hdc端口
1063f085823Sopenharmony_ci    :param device_sn:设备sn号
1073f085823Sopenharmony_ci    :param command:
1083f085823Sopenharmony_ci    :return:
1093f085823Sopenharmony_ci    """
1103f085823Sopenharmony_ci    connect_cmd = "hdc -s {}:{} -t {} ".format(device_ip, device_port, device_sn)
1113f085823Sopenharmony_ci    cmd = connect_cmd + command
1123f085823Sopenharmony_ci    cmd_list = cmd.split(" ")
1133f085823Sopenharmony_ci    logger(cmd_list, "INFO")
1143f085823Sopenharmony_ci    _, exitcode = shell_command(cmd_list)
1153f085823Sopenharmony_ci    return exitcode
1163f085823Sopenharmony_ci
1173f085823Sopenharmony_ci
1183f085823Sopenharmony_cidef coverage_command(command):
1193f085823Sopenharmony_ci    """
1203f085823Sopenharmony_ci    coverage_command
1213f085823Sopenharmony_ci    :param command:
1223f085823Sopenharmony_ci    :return:
1233f085823Sopenharmony_ci    """
1243f085823Sopenharmony_ci    proc = subprocess.Popen(command, shell=True)
1253f085823Sopenharmony_ci    try:
1263f085823Sopenharmony_ci        proc.communicate()
1273f085823Sopenharmony_ci    except subprocess.TimeoutExpired:
1283f085823Sopenharmony_ci        proc.kill()
1293f085823Sopenharmony_ci        proc.terminate()
1303f085823Sopenharmony_ci
1313f085823Sopenharmony_ci
1323f085823Sopenharmony_cidef tree_find_file_endswith(path, suffix, file_list=None):
1333f085823Sopenharmony_ci    """
1343f085823Sopenharmony_ci    获取目录下所有以指定字符串结尾的文件
1353f085823Sopenharmony_ci    :param path: 需要遍历的目录
1363f085823Sopenharmony_ci    :param suffix: 后缀
1373f085823Sopenharmony_ci    :param file_list:
1383f085823Sopenharmony_ci    :return:
1393f085823Sopenharmony_ci    """
1403f085823Sopenharmony_ci    for f in os.listdir(path):
1413f085823Sopenharmony_ci        full_path = os.path.join(path, f)
1423f085823Sopenharmony_ci        if os.path.isfile(full_path) and full_path.endswith(suffix):
1433f085823Sopenharmony_ci            file_list.append(full_path)
1443f085823Sopenharmony_ci        if os.path.isdir(full_path):
1453f085823Sopenharmony_ci            tree_find_file_endswith(full_path, suffix, file_list)
1463f085823Sopenharmony_ci    return file_list
1473f085823Sopenharmony_ci
1483f085823Sopenharmony_ci
1493f085823Sopenharmony_ciclass FoundationServer:
1503f085823Sopenharmony_ci    """
1513f085823Sopenharmony_ci    foundation拆分的进程和其对应的so之间的对应关系
1523f085823Sopenharmony_ci    """
1533f085823Sopenharmony_ci    lib_dict = {
1543f085823Sopenharmony_ci        "ams": ["libabilityms.z.so", "libdataobsms.z.so", "libupms.z.so", "libappms.z.so"],
1553f085823Sopenharmony_ci        "bms": ["libbms.z.so"],
1563f085823Sopenharmony_ci        "call": ["libtel_call_manager.z.so"],
1573f085823Sopenharmony_ci        "dms": ["libdistributed_ability_manager_svr.z.so"],
1583f085823Sopenharmony_ci        "fms": ["libfms.z.so"],
1593f085823Sopenharmony_ci        "notification": ["libcesfwk_services.z.so", "libans.z.so"],
1603f085823Sopenharmony_ci        "power": ["libbatteryservice.z.so", "libdisplaymgrservice.z.so", "libpowermgrservice.z.so",
1613f085823Sopenharmony_ci                  "libthermalservice.z.so", "libbatterystats_service.z.so"],
1623f085823Sopenharmony_ci        "state": ["libtel_state_registry.z.so"],
1633f085823Sopenharmony_ci        "wms": ["libwms.z.so"],
1643f085823Sopenharmony_ci        "theme": ["libscreenlock_server.z.so"]
1653f085823Sopenharmony_ci    }
1663f085823Sopenharmony_ci
1673f085823Sopenharmony_ci
1683f085823Sopenharmony_cidef is_elffile(filepath: str) -> bool:
1693f085823Sopenharmony_ci    """
1703f085823Sopenharmony_ci    判断文件是否二进制文件
1713f085823Sopenharmony_ci    :param filepath:
1723f085823Sopenharmony_ci    :return: bool
1733f085823Sopenharmony_ci    """
1743f085823Sopenharmony_ci    if not os.path.exists(filepath):
1753f085823Sopenharmony_ci        logger("{} not exists.".format(filepath), "ERROR")
1763f085823Sopenharmony_ci        return False
1773f085823Sopenharmony_ci
1783f085823Sopenharmony_ci    try:
1793f085823Sopenharmony_ci        file_states = os.stat(filepath)
1803f085823Sopenharmony_ci        file_mode = file_states[stat.ST_MODE]
1813f085823Sopenharmony_ci        if not stat.S_ISREG(file_mode):
1823f085823Sopenharmony_ci            return False
1833f085823Sopenharmony_ci        with open(filepath, "rb") as f:
1843f085823Sopenharmony_ci            header = (bytearray(f.read(4)[1:4])).decode(encoding="utf-8")
1853f085823Sopenharmony_ci            if header in ["ELF"]:
1863f085823Sopenharmony_ci                return True
1873f085823Sopenharmony_ci    except UnicodeDecodeError as e:
1883f085823Sopenharmony_ci        logger(e, "ERROR")
1893f085823Sopenharmony_ci
1903f085823Sopenharmony_ci    return False
191