"""Script to stage delivery specs to secret manager.""" import argparse import base64 import json import logging import os import sys import config from connector import mysql from secrets_manager.python_ext import PythonSecretsManager from sql import dd sys.path.append(os.path.join(os.path.dirname(__file__), '..')) def encode_key(private_key_path): """Method to read private key file and encode it.""" private_file = open(private_key_path).read().encode('utf8') base64_bytes = base64.b64encode(private_file) return base64_bytes.decode('utf8') def get_private_key(dms_id, private_key_file): """ Method to find key in private_key/store. if there is no key found then fallback to find from private_key directory """ try: private_key_path = 'private_keys/{dms_id}/{private_key}'.format( dms_id=dms_id, private_key=private_key_file) key_string = encode_key(private_key_path) except Exception: private_key_path = 'private_keys/{private_key}'.format( private_key=private_key_file) key_string = encode_key(private_key_path) return key_string def main(): """Method to bulk create secret values for dms specs.""" parser = argparse.ArgumentParser() parser.add_argument('--dms_ids', type=str, default=None) args = parser.parse_args() sys.path.append(os.path.join(os.path.dirname(__file__), '..')) log = logging.getLogger('main') log.setLevel(logging.DEBUG) fmt = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') sh = logging.StreamHandler(sys.stdout) sh.setFormatter(fmt) log.addHandler(sh) secrets_manager_client = PythonSecretsManager() client = secrets_manager_client.get_client() dd_db = None cursor = None dms_id = None order_type = None dd_db = mysql.get_dd_mysql_connection() cursor = dd_db.cursor() if args.dms_ids: log.info('Script is running to stage dms_ids : %s', args.dms_ids) cursor.execute(dd.SQL_DELIVERY_SPEC.format(args.dms_ids)) else: print('are you sure, ' 'you wanna stage all dms delivery spec to secret manager?' 'yes|y only.') user_input = input() if user_input in ['yes', 'y']: log.info('Script is running to stage all dms_ids.') cursor.execute(dd.SQL_DELIVERY_SPEC_ALL) else: return log.info('Exiting script per user input.') dms_specs = cursor.fetchall() for single_spec in dms_specs: dms_id = single_spec['dms_id'] order_type = single_spec['order_type'] secret_name = config.SECRET_NAME.format( environment=config.Environment, secret_name='connection_info/{dms_id}/{order_type}'.format( dms_id=dms_id, order_type=order_type)) # add private_key as base64 encoded private_key = get_private_key(dms_id, single_spec['private_key_file']) single_spec.update(private_key=private_key) # get rid of the extra props single_spec.pop('dms_id') single_spec.pop('order_type') try: res = client.create_secret( Name=secret_name, SecretString=str(json.dumps(single_spec))) log.info('Secret created. dms_id : %s and ' 'secret manager response : %s', dms_id, json.dumps(res)) except Exception as e: # update secret when secret already exist if hasattr(e, 'response') and e.response['Error']['Code'] == \ 'ResourceExistsException': res = client.put_secret_value( SecretId=secret_name, SecretString=str(json.dumps(single_spec))) log.info('Secret updated. dms_id : %s ' 'and secret manager response : %s', dms_id, json.dumps(res)) else: raise e if __name__ == '__main__': main()