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