1*8975f5c5SAndroid Build Coastguard Worker# Copyright 2022 The Chromium Authors 2*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file. 4*8975f5c5SAndroid Build Coastguard Worker"""Implements commands for serving a TUF repository.""" 5*8975f5c5SAndroid Build Coastguard Worker 6*8975f5c5SAndroid Build Coastguard Workerimport argparse 7*8975f5c5SAndroid Build Coastguard Workerimport contextlib 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Workerfrom typing import Iterator, Optional 10*8975f5c5SAndroid Build Coastguard Worker 11*8975f5c5SAndroid Build Coastguard Workerfrom common import REPO_ALIAS, run_ffx_command 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker_REPO_NAME = 'chromium-test-package-server' 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker 16*8975f5c5SAndroid Build Coastguard Workerdef _stop_serving(repo_name: str, target: Optional[str]) -> None: 17*8975f5c5SAndroid Build Coastguard Worker """Stop serving a repository.""" 18*8975f5c5SAndroid Build Coastguard Worker 19*8975f5c5SAndroid Build Coastguard Worker # Attempt to clean up. 20*8975f5c5SAndroid Build Coastguard Worker run_ffx_command( 21*8975f5c5SAndroid Build Coastguard Worker cmd=['target', 'repository', 'deregister', '-r', repo_name], 22*8975f5c5SAndroid Build Coastguard Worker target_id=target, 23*8975f5c5SAndroid Build Coastguard Worker check=False) 24*8975f5c5SAndroid Build Coastguard Worker run_ffx_command(cmd=['repository', 'remove', repo_name], check=False) 25*8975f5c5SAndroid Build Coastguard Worker run_ffx_command(cmd=['repository', 'server', 'stop'], check=False) 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker 28*8975f5c5SAndroid Build Coastguard Workerdef _start_serving(repo_dir: str, repo_name: str, 29*8975f5c5SAndroid Build Coastguard Worker target: Optional[str]) -> None: 30*8975f5c5SAndroid Build Coastguard Worker """Start serving a repository to a target device. 31*8975f5c5SAndroid Build Coastguard Worker 32*8975f5c5SAndroid Build Coastguard Worker Args: 33*8975f5c5SAndroid Build Coastguard Worker repo_dir: directory the repository is served from. 34*8975f5c5SAndroid Build Coastguard Worker repo_name: repository name. 35*8975f5c5SAndroid Build Coastguard Worker target: Fuchsia device the repository is served to. 36*8975f5c5SAndroid Build Coastguard Worker """ 37*8975f5c5SAndroid Build Coastguard Worker 38*8975f5c5SAndroid Build Coastguard Worker run_ffx_command(cmd=('config', 'set', 'repository.server.mode', '\"ffx\"')) 39*8975f5c5SAndroid Build Coastguard Worker 40*8975f5c5SAndroid Build Coastguard Worker run_ffx_command(cmd=['repository', 'server', 'start']) 41*8975f5c5SAndroid Build Coastguard Worker run_ffx_command( 42*8975f5c5SAndroid Build Coastguard Worker cmd=['repository', 'add-from-pm', repo_dir, '-r', repo_name]) 43*8975f5c5SAndroid Build Coastguard Worker run_ffx_command(cmd=[ 44*8975f5c5SAndroid Build Coastguard Worker 'target', 'repository', 'register', '-r', repo_name, '--alias', 45*8975f5c5SAndroid Build Coastguard Worker REPO_ALIAS 46*8975f5c5SAndroid Build Coastguard Worker ], 47*8975f5c5SAndroid Build Coastguard Worker target_id=target) 48*8975f5c5SAndroid Build Coastguard Worker 49*8975f5c5SAndroid Build Coastguard Worker 50*8975f5c5SAndroid Build Coastguard Workerdef register_serve_args(arg_parser: argparse.ArgumentParser) -> None: 51*8975f5c5SAndroid Build Coastguard Worker """Register common arguments for repository serving.""" 52*8975f5c5SAndroid Build Coastguard Worker 53*8975f5c5SAndroid Build Coastguard Worker serve_args = arg_parser.add_argument_group('serve', 54*8975f5c5SAndroid Build Coastguard Worker 'repo serving arguments') 55*8975f5c5SAndroid Build Coastguard Worker serve_args.add_argument('--serve-repo', 56*8975f5c5SAndroid Build Coastguard Worker dest='repo', 57*8975f5c5SAndroid Build Coastguard Worker help='Directory the repository is served from.') 58*8975f5c5SAndroid Build Coastguard Worker serve_args.add_argument('--repo-name', 59*8975f5c5SAndroid Build Coastguard Worker default=_REPO_NAME, 60*8975f5c5SAndroid Build Coastguard Worker help='Name of the repository.') 61*8975f5c5SAndroid Build Coastguard Worker 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker@contextlib.contextmanager 64*8975f5c5SAndroid Build Coastguard Workerdef serve_repository(args: argparse.Namespace) -> Iterator[None]: 65*8975f5c5SAndroid Build Coastguard Worker """Context manager for serving a repository.""" 66*8975f5c5SAndroid Build Coastguard Worker _start_serving(args.repo, args.repo_name, args.target_id) 67*8975f5c5SAndroid Build Coastguard Worker try: 68*8975f5c5SAndroid Build Coastguard Worker yield None 69*8975f5c5SAndroid Build Coastguard Worker finally: 70*8975f5c5SAndroid Build Coastguard Worker _stop_serving(args.repo_name, args.target_id) 71