yum/artifact-registry.py (54 lines of code) (raw):

# Copyright 2021 Google LLC # # 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. from yum.plugins import TYPE_CORE from subprocess import PIPE, Popen from urllib.parse import urlparse token_cmd = '/usr/libexec/ar-token' requires_api_version = '2.3' plugin_type = (TYPE_CORE,) def prereposetup_hook(conduit): token = _get_token(conduit) if not token: return for repo in conduit.getRepos().listEnabled(): # Check if the 'artifact_registry_oauth' option is set in the repository's config. if repo.cfg.has_option(repo.id, 'artifact_registry_oauth') and repo.cfg.getboolean(repo.id, 'artifact_registry_oauth'): _add_headers(token, repo) break # Stop looking at URLs # Check if any repo urls are for Artifact Registry. for url in repo.urls: parsed_url = urlparse(url) if parsed_url.scheme == 'https' and parsed_url.netloc.endswith('.pkg.dev'): _add_headers(token, repo) break # Stop looking at URLs def _add_headers(token, repo): repo.http_headers.update( {'Authorization': 'Bearer %s' % token}) def _get_token(conduit): service_account_json = conduit.confString('main', 'service_account_json', '') service_account_email = conduit.confString( 'main', 'service_account_email', '') opts = {} if service_account_json: opts['service_account_json'] = service_account_json elif service_account_email: opts['service_account_email'] = service_account_email return _call_helper(**opts) def _call_helper(service_account_json=None, service_account_email=None, debug=False): args = [] # JSON has priority over email. if service_account_json: args.append('--service_account_json=' + service_account_json) elif service_account_email: args.append('--service_account_email=' + service_account_email) if debug: # Inherit stderr to see debug statements stderr = None else: stderr = PIPE try: cmd = Popen([token_cmd] + args, stdout=PIPE, stderr=stderr) except OSError as e: print('Error trying to obtain Google credentials: %s' % e) return retcode = cmd.wait() if retcode != 0: print('Error trying to obtain Google credentials: command returned %d' % retcode) return return cmd.stdout.read()