15f9996aaSopenharmony_ci#!/usr/bin/env python3
25f9996aaSopenharmony_ci# -*- coding: utf-8 -*-
35f9996aaSopenharmony_ci# Copyright (c) 2023 Huawei Device Co., Ltd.
45f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
55f9996aaSopenharmony_ci# you may not use this file except in compliance with the License.
65f9996aaSopenharmony_ci# You may obtain a copy of the License at
75f9996aaSopenharmony_ci#
85f9996aaSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
95f9996aaSopenharmony_ci#
105f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
115f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
125f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135f9996aaSopenharmony_ci# See the License for the specific language governing permissions and
145f9996aaSopenharmony_ci# limitations under the License.
155f9996aaSopenharmony_ci
165f9996aaSopenharmony_ci
175f9996aaSopenharmony_ciimport subprocess
185f9996aaSopenharmony_ciimport argparse
195f9996aaSopenharmony_ciimport os
205f9996aaSopenharmony_ciimport sys
215f9996aaSopenharmony_ciimport shlex
225f9996aaSopenharmony_ci
235f9996aaSopenharmony_ci
245f9996aaSopenharmony_cidef parse_args(args):
255f9996aaSopenharmony_ci    parser = argparse.ArgumentParser()
265f9996aaSopenharmony_ci    parser.add_argument('--sdk-out-dir')
275f9996aaSopenharmony_ci    options = parser.parse_args(args)
285f9996aaSopenharmony_ci    return options
295f9996aaSopenharmony_ci
305f9996aaSopenharmony_ci
315f9996aaSopenharmony_cidef sign_sdk(zipfile, sign_list, sign_results):
325f9996aaSopenharmony_ci    if zipfile.endswith('.zip'):
335f9996aaSopenharmony_ci        sign = os.getenv('SIGN')
345f9996aaSopenharmony_ci        if not sign:
355f9996aaSopenharmony_ci            raise AttributeError(f"SIGN message not in env")
365f9996aaSopenharmony_ci        dir_name = zipfile.split('-')[0]
375f9996aaSopenharmony_ci        cmd1 = ['unzip', "-q", zipfile]
385f9996aaSopenharmony_ci        subprocess.call(cmd1)
395f9996aaSopenharmony_ci        need_sign_files = []
405f9996aaSopenharmony_ci        for root, dirs, files in os.walk(dir_name):
415f9996aaSopenharmony_ci            for file in files:
425f9996aaSopenharmony_ci                file = os.path.join(root, file)
435f9996aaSopenharmony_ci                need_sign_files.append(file)
445f9996aaSopenharmony_ci        for file in need_sign_files:
455f9996aaSopenharmony_ci            if file.split('/')[-1] in sign_list or file.endswith('.so') or file.endswith('.dylib') \
465f9996aaSopenharmony_ci                    or file.split('/')[-2] == 'bin':
475f9996aaSopenharmony_ci                cmd2 = ['codesign', '-fs', sign, '--timestamp', '--options=runtime', file]
485f9996aaSopenharmony_ci                subprocess.call(cmd2)
495f9996aaSopenharmony_ci        cmd3 = ['rm', zipfile]
505f9996aaSopenharmony_ci        subprocess.call(cmd3)
515f9996aaSopenharmony_ci        cmd4 = ['zip', '-rq', zipfile, dir_name]
525f9996aaSopenharmony_ci        subprocess.call(cmd4)
535f9996aaSopenharmony_ci        cmd5 = ['rm', '-rf', dir_name]
545f9996aaSopenharmony_ci        subprocess.call(cmd5)
555f9996aaSopenharmony_ci        mac_machine = subprocess.run(['uname', '-m'], stdout=subprocess.PIPE, text=True)
565f9996aaSopenharmony_ci        if mac_machine.stdout.strip() in ['arm64', 'aarch64']:
575f9996aaSopenharmony_ci            ohos_name = shlex.quote("ohos-sdk")
585f9996aaSopenharmony_ci        elif mac_machine.stdout.strip() in ['x86_64', 'amd64', 'Intel64']:
595f9996aaSopenharmony_ci            ohos_name = "ohos-sdk"
605f9996aaSopenharmony_ci        else:
615f9996aaSopenharmony_ci            print('Submit fail, because machine is not mac. Please check your compilation command')
625f9996aaSopenharmony_ci            return
635f9996aaSopenharmony_ci        cmd6 = ['xcrun', 'notarytool', 'submit', zipfile, '--keychain-profile', ohos_name, '--no-s3-acceleration']
645f9996aaSopenharmony_ci        process = subprocess.Popen(cmd6, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
655f9996aaSopenharmony_ci        sign_results.append((cmd6, process))
665f9996aaSopenharmony_ci
675f9996aaSopenharmony_ci
685f9996aaSopenharmony_cidef main(args):
695f9996aaSopenharmony_ci    options = parse_args(args)
705f9996aaSopenharmony_ci    darwin_sdk_dir = os.path.join(options.sdk_out_dir, 'darwin')
715f9996aaSopenharmony_ci    os.chdir(darwin_sdk_dir)
725f9996aaSopenharmony_ci    sign_list = ['lldb-argdumper', 'fsevents.node', 'idl', 'restool', 'diff', 'ark_asm',
735f9996aaSopenharmony_ci                 'ark_disasm', 'hdc', 'syscap_tool', 'hnpcli']
745f9996aaSopenharmony_ci    sign_results = []
755f9996aaSopenharmony_ci    for file in os.listdir('.'):
765f9996aaSopenharmony_ci        sign_sdk(file, sign_list, sign_results)
775f9996aaSopenharmony_ci    for cmd, process in sign_results:
785f9996aaSopenharmony_ci        try:
795f9996aaSopenharmony_ci            stdout, stderr = process.communicate(timeout=3600)
805f9996aaSopenharmony_ci            if process.returncode:
815f9996aaSopenharmony_ci                print(f"cmd:{' '.join(cmd)}, result is {stdout}")
825f9996aaSopenharmony_ci                raise Exception(f"run command {' '.join(cmd)} fail, error is {stderr}")
835f9996aaSopenharmony_ci        except Exception as e:
845f9996aaSopenharmony_ci            raise TimeoutError(r"run xcrun cmd timeout")
855f9996aaSopenharmony_ci
865f9996aaSopenharmony_ci
875f9996aaSopenharmony_ciif __name__ == '__main__':
885f9996aaSopenharmony_ci    sys.exit(main(sys.argv[1:]))
89