def config(args): """ List of current baker configs """ configs = settings.values(custom_only=not args.all) for key, value in configs.items(): logger.log(key + '=' + str(value))
def download(url, target=None, force=False): """ Download and storage file from a url """ if not is_url(url): raise TypeError("Str '%s' is not a valid url." % url) storage_folder = target or settings.get('STORAGE_TEMPLATES') auth = str(settings.get('REPOSITORY_AUTH')).replace("'", '') file_name = path.basename(urlsplit(url).path) file_path = storage_folder + file_name if force or not path.isfile(file_path): Storage.create_folders(storage_folder) try: request = Request(url) if auth: request.add_header('Authorization', auth) with urlopen(request) as response: Storage.file(file_path, response.read(), 'wb') logger.log(url, 'download DONE!') except HTTPError as e: e.msg += ": URL '%s' cannot be downloaded" % url raise e else: logger.log(url, 'from CACHE!') return file_path
def list(all_info=False): """ List of recipes saved in index """ recipes = Storage.json(settings.get('STORAGE_RECIPE_INDEX')) meta = _IndexRecipe.calc_length(recipes) meta['id'] = 64 if all_info else 9 extra_space = 8 list_items = '' for key in recipes.keys(): recipe = recipes[key] recipe_id = key[:meta['id']] created = recipe['datetime'] if all_info else recipe['datetime'][:19] list_items += recipe_id + (' ' * (meta['id'] + extra_space - len(recipe_id))) for attr_name in ['remote', 'version', 'filename']: list_items += (recipe[attr_name] + (' ' * (meta[attr_name] + extra_space - len(recipe[attr_name])))) list_items += created + '\n' header = ListRecipes._list_header(meta, extra_space) logger.log(header + list_items)
def generate(key_pass): """ Generate secret key from key pass """ b_key_pass = key_pass.encode(settings.get('ENCODING')) sha256 = SHA256.new(b_key_pass) secret_key = sha256.digest() secret_store = binascii.hexlify(secret_key).decode( settings.get('ENCODING')) Storage.file(settings.get('STORAGE_KEY_PATH'), secret_store) logger.log("Generated secret key '{0}' " "and saved at '{1}'".format( secret_store, settings.get('STORAGE_KEY_PATH'))) return secret_store
def encrypt(args): """ Encrypt values from recipe file or list of strings """ secret_key = str(SecretKey().key) enc = Encryption(secret_key) if args.file: parser = RecipeParser(args.file, case_sensitive=True) for instruction in parser.instructions: instruction.plan_to_secrets() parser.update_secrets() elif args.plantexts: for text in args.plantexts: logger.log(text, enc.encrypt(text))
def remove(rid): """ Remove locally recipe by id """ location = settings.get('STORAGE_RECIPE_INDEX') index = Storage.json(location) if len(rid) != 64: found = list(filter(lambda idx: idx[:9] == rid, index)) if found: rid = found[0] del index[rid] Storage.json(location, index) logger.log("Removed recipe '%s'" % rid)
def execute_command_line(args): """ Execute command line and wrap exceptions to show a friendly message """ del args[0] parser = Parser(args, Commands) options = parser.options try: settings.load(DEBUG=options.verbose) logger.init() if 'multiprocess' in options: logger.log('Baker start <:::> \n') parser.execute() if 'multiprocess' in options: logger.log('\nAll done with success! \\ o /') except Exception as e: logger.debug(str(traceback.format_exc())) logger.log(str(e)) parser.exit_with_error( '\nERROR: Unexpected error was caught. Add --verbose option for more information.\n' )
def download(url, target=None, force=False): """ Download and storage file from a url """ if not is_url(url): raise TypeError("Str '%s' is not a valid url." % url) storage_folder = target or settings.get('STORAGE_TEMPLATES') file_name = path.basename(urlsplit(url).path) file_path = storage_folder + file_name if force or not path.isfile(file_path): Storage.create_folders(storage_folder) try: urlretrieve(url, file_path) logger.log(url, 'download DONE!') except HTTPError as e: e.msg += ": URL '%s' cannot be downloaded" % url raise e else: logger.log(url, 'from CACHE!') return file_path
def replace(self): """ Replace variables in template file based on recipe instructions """ for instruction in self.instructions: target = instruction.template template_path = instruction.template replaced = Storage.file(template_path) if instruction.variables: template = BakerTemplate(replaced) replaced = template.replace(instruction.variables) if hasattr(instruction, 'path'): target = instruction.path if settings.get('TEMPLATE_EXT') and target.endswith( settings.get('TEMPLATE_EXT')): ext_size = len(settings.get('TEMPLATE_EXT')) + 1 target = target[:-ext_size] Storage.file(target, content=replaced) self._add_file_permission(instruction, target) logger.log(instruction.name, instruction.template, target)