#!/usr/bin/env python3 # # Copyright (C) 2024 The Android Open Source Project # # 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. # """Downloads etm modules from the build server.""" import argparse import logging import os from pathlib import Path import shutil import stat import textwrap ETM_MODULE_TARGET = 'etm_kernel_modules' ETM_MODULES = ['coresight.ko', 'coresight-etm4x.ko', 'coresight-funnel.ko', 'coresight-tmc.ko'] def logger(): """Returns the main logger for this module.""" return logging.getLogger(__name__) def check_call(cmd): """Proxy for subprocess.check_call with logging.""" import subprocess logger().debug('check_call `%s`', ' '.join(cmd)) subprocess.check_call(cmd) def fetch_artifact(branch: str, build: str, target: str, name: str) -> None: """Fetches and artifact from the build server.""" logger().info('Fetching %s from %s %s (artifacts matching %s)', build, target, branch, name) fetch_artifact_path = '/google/data/ro/projects/android/fetch_artifact' cmd = [fetch_artifact_path, '--branch', branch, '--target', target, '--bid', build, name] check_call(cmd) def fetch_etm_modules(branch: str, build: str, install_dir: str) -> None: """Installs the device specific components of the release.""" install_dir = Path(install_dir) install_dir.mkdir(exist_ok=True) for name in ETM_MODULES: fetch_artifact(branch, build, ETM_MODULE_TARGET, name) dest_file = install_dir / name if dest_file.is_file(): dest_file.unlink() shutil.move(name, dest_file) def get_args(): """Parses and returns command line arguments.""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('-b', '--branch', default='kernel-android14-gs-pixel-6.1', choices=['kernel-android14-gs-pixel-6.1', 'kernel-android14-gs-pixel-5.15-24Q3'], help='Branch to pull build from.') parser.add_argument('--build', required=True, help='Build number to pull.') parser.add_argument('-o', dest='install_dir', required=True, help='Directory to store etm modules') parser.add_argument('-v', '--verbose', action='count', default=0, help='Increase output verbosity.') return parser.parse_args() def main(): """Program entry point.""" args = get_args() verbose_map = (logging.WARNING, logging.INFO, logging.DEBUG) verbosity = args.verbose if verbosity > 2: verbosity = 2 logging.basicConfig(level=verbose_map[verbosity]) logging.debug(f'args={args}') fetch_etm_modules(args.branch, args.build, args.install_dir) if __name__ == '__main__': main()