blob: ddff903cc251d98e0766b164fd53eb9191d130ec [file] [log] [blame]
#!/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()