| # Copyright 2016 The ChromiumOS Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| """cros cidbcreds: get the cidb credentials from gs.""" | |
| import logging | |
| import os | |
| import shutil | |
| from chromite.cli import command | |
| from chromite.lib import gs | |
| from chromite.lib import locking | |
| from chromite.lib import path_util | |
| PROD_REPLICA_CIDB_READONLY_BUCKET = ( | |
| "gs://chromeos-cidb-creds/prod_replica_cidb_gen2_readonly/" | |
| ) | |
| def GetCIDBCreds(cidb_dir): | |
| """Download CIDB creds from google storage to local cidb diretory.""" | |
| ctx = gs.GSContext(init_boto=True) | |
| ctx.Copy(PROD_REPLICA_CIDB_READONLY_BUCKET + "*", cidb_dir) | |
| def CheckAndGetCIDBCreds(force_update=False, folder=None): | |
| """Check if CIDB creds exist, download creds if necessary.""" | |
| cache_dir = path_util.GetCacheDir() | |
| dir_name = folder if folder is not None else "cidb_creds" | |
| cidb_dir = os.path.join(cache_dir, dir_name) | |
| cidb_dir_lock = cidb_dir + ".lock" | |
| with locking.FileLock(cidb_dir_lock).write_lock(): | |
| if os.path.exists(cidb_dir): | |
| if force_update: | |
| shutil.rmtree(cidb_dir, ignore_errors=True) | |
| logging.debug( | |
| "Force updating CIDB creds. Deleted %s.", cidb_dir | |
| ) | |
| else: | |
| logging.debug("Using cached credentials %s", cidb_dir) | |
| return cidb_dir | |
| os.mkdir(cidb_dir) | |
| try: | |
| GetCIDBCreds(cidb_dir) | |
| return cidb_dir | |
| except Exception as e: | |
| if isinstance(e, gs.GSCommandError): | |
| logging.warning( | |
| "Please check if the GS credentials is configured " | |
| "correctly. Please note the permissions to fetch " | |
| "these credentials are for Googlers only," | |
| ) | |
| logging.error( | |
| "Failed to get CIDB credentials. Deleting %s", cidb_dir | |
| ) | |
| shutil.rmtree(cidb_dir, ignore_errors=True) | |
| raise | |
| @command.command_decorator("cidbcreds") | |
| class CidbCredsCommand(command.CliCommand): | |
| """cros cidbcreds: download the prod_replica_cidb_readonly credentials.""" | |
| @classmethod | |
| def AddParser(cls, parser): | |
| super(cls, CidbCredsCommand).AddParser(parser) | |
| parser.add_argument( | |
| "--folder", | |
| action="store", | |
| help="The folder name to store the credentials.", | |
| ) | |
| parser.add_argument( | |
| "--force-update", | |
| action="store_true", | |
| help="force updating the credentials.", | |
| ) | |
| return parser | |
| def Run(self): | |
| """Run cros cidbcreds.""" | |
| cidb_dir = CheckAndGetCIDBCreds( | |
| force_update=self.options.force_update, folder=self.options.folder | |
| ) | |
| logging.notice("CIDB credentials at: %s", cidb_dir) |