async def merge_extended_paths(self, extends, dir_path): for s in extends: extend_config = {} # This decode and YAML-load a string stored in AWS Secrets Manager if s.startswith("AWS_SECRETS_MANAGER:"): secret_name = "".join(s.split("AWS_SECRETS_MANAGER:")[1:]) extend_config = yaml.safe_load( get_aws_secret(secret_name, os.environ.get("EC2_REGION", "us-east-1"))) else: try: extend_path = os.path.join(dir_path, s) with open(extend_path, "r") as ymlfile: extend_config = yaml.safe_load(ymlfile) except FileNotFoundError: logging.error(f"Unable to open file: {s}", exc_info=True) dict_merge(self.config, extend_config) if extend_config.get("extends"): await self.merge_extended_paths(extend_config.get("extends"), dir_path)
def get_config_location(): config_location = os.environ.get("CONFIG_LOCATION") default_save_location = f"{os.curdir}/consoleme.yaml" if config_location: if config_location.startswith("s3://"): import boto3 client = boto3.client("s3") bucket, key = split_s3_path(config_location) obj = client.get_object(Bucket=bucket, Key=key) s3_object_content = obj["Body"].read() with open(default_save_location, "w") as f: f.write(s3_object_content.decode()) elif config_location.startswith("AWS_SECRETS_MANAGER:"): secret_name = "".join( config_location.split("AWS_SECRETS_MANAGER:")[1:]) aws_secret_content = get_aws_secret( secret_name, os.environ.get("EC2_REGION", "us-east-1")) with open(default_save_location, "w") as f: f.write(aws_secret_content) else: return config_location config_locations: List[str] = [ default_save_location, os.path.expanduser("~/.config/consoleme/config.yaml"), "/etc/consoleme/config/config.yaml", "example_config/example_config_development.yaml", ] for loc in config_locations: if os.path.exists(loc): return loc raise Exception( "Unable to find ConsoleMe's configuration. It either doesn't exist, or " "ConsoleMe doesn't have permission to access it. Please set the CONFIG_LOCATION environment variable " "to the path of the configuration, or to an s3 location with your configuration" "(i.e: s3://YOUR_BUCKET/path/to/config.yaml). Otherwise, ConsoleMe will automatically search for the" f"configuration in these locations: {', '.join(config_locations)}")