X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=snaps%2Ffile_utils.py;h=a421dd3da2a5c8d2c692bf54855b14de9c3dedf9;hb=d41992fe773fc88d8aa32723c93df8ba2e1c75b7;hp=f7c9af4ce9edae9abd4b477a6bca375f6d808a96;hpb=48da17bfedb683b624faf08d2e0b7552d56cff21;p=snaps.git diff --git a/snaps/file_utils.py b/snaps/file_utils.py index f7c9af4..a421dd3 100644 --- a/snaps/file_utils.py +++ b/snaps/file_utils.py @@ -14,6 +14,9 @@ # limitations under the License. import os import logging + +from cryptography.hazmat.primitives import serialization + try: import urllib.request as urllib except ImportError: @@ -32,13 +35,15 @@ logger = logging.getLogger('file_utils') def file_exists(file_path): """ - Returns True if the image file already exists and throws an exception if the path is a directory + Returns True if the image file already exists and throws an exception if + the path is a directory :return: """ - if os.path.exists(file_path): - if os.path.isdir(file_path): + expanded_path = os.path.expanduser(file_path) + if os.path.exists(expanded_path): + if os.path.isdir(expanded_path): return False - return os.path.isfile(file_path) + return os.path.isfile(expanded_path) return False @@ -55,16 +60,93 @@ def download(url, dest_path, name=None): dest = dest_path + '/' + name logger.debug('Downloading file from - ' + url) # Override proxy settings to use localhost to download file - f = None + download_file = None + + if not os.path.isdir(dest_path): + try: + os.mkdir(dest_path) + except: + raise try: - with open(dest, 'wb') as f: - logger.debug('Saving file to - ' + dest) + with open(dest, 'wb') as download_file: + logger.debug('Saving file to - %s', + os.path.abspath(download_file.name)) response = __get_url_response(url) - f.write(response.read()) - return f + download_file.write(response.read()) + return download_file finally: - if f: - f.close() + if download_file: + download_file.close() + + +def save_keys_to_files(keys=None, pub_file_path=None, priv_file_path=None): + """ + Saves the generated RSA generated keys to the filesystem + :param keys: the keys to save generated by cryptography + :param pub_file_path: the path to the public keys + :param priv_file_path: the path to the private keys + """ + if keys: + if pub_file_path: + # To support '~' + pub_expand_file = os.path.expanduser(pub_file_path) + pub_dir = os.path.dirname(pub_expand_file) + + if not os.path.isdir(pub_dir): + os.mkdir(pub_dir) + + public_handle = None + try: + public_handle = open(pub_expand_file, 'wb') + public_bytes = keys.public_key().public_bytes( + serialization.Encoding.OpenSSH, + serialization.PublicFormat.OpenSSH) + public_handle.write(public_bytes) + finally: + if public_handle: + public_handle.close() + + os.chmod(pub_expand_file, 0o400) + logger.info("Saved public key to - " + pub_expand_file) + if priv_file_path: + # To support '~' + priv_expand_file = os.path.expanduser(priv_file_path) + priv_dir = os.path.dirname(priv_expand_file) + if not os.path.isdir(priv_dir): + os.mkdir(priv_dir) + + private_handle = None + try: + private_handle = open(priv_expand_file, 'wb') + private_handle.write( + keys.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.TraditionalOpenSSL, + encryption_algorithm=serialization.NoEncryption())) + finally: + if private_handle: + private_handle.close() + + os.chmod(priv_expand_file, 0o400) + logger.info("Saved private key to - " + priv_expand_file) + + +def save_string_to_file(string, file_path, mode=None): + """ + Stores + :param string: the string contents to store + :param file_path: the file path to create + :param mode: the file's mode + :return: the file object + """ + save_file = open(file_path, 'w') + try: + save_file.write(string) + if mode: + os.chmod(file_path, mode) + return save_file + finally: + save_file.close() def get_content_length(url): @@ -96,32 +178,45 @@ def read_yaml(config_file_path): :return: a dictionary """ logger.debug('Attempting to load configuration file - ' + config_file_path) - with open(config_file_path) as config_file: - config = yaml.safe_load(config_file) - logger.info('Loaded configuration') - config_file.close() - logger.info('Closing configuration file') - return config + config_file = None + try: + with open(config_file_path) as config_file: + config = yaml.safe_load(config_file) + logger.info('Loaded configuration') + return config + finally: + if config_file: + logger.info('Closing configuration file') + config_file.close() def read_os_env_file(os_env_filename): """ Reads the OS environment source file and returns a map of each key/value - Will ignore lines beginning with a '#' and will replace any single or double quotes contained within the value + Will ignore lines beginning with a '#' and will replace any single or + double quotes contained within the value :param os_env_filename: The name of the OS environment file to read :return: a dictionary """ if os_env_filename: - logger.info('Attempting to read OS environment file - ' + os_env_filename) + logger.info('Attempting to read OS environment file - %s', + os_env_filename) out = {} - for line in open(os_env_filename): - line = line.lstrip() - if not line.startswith('#') and line.startswith('export '): - line = line.lstrip('export ').strip() - tokens = line.split('=') - if len(tokens) > 1: - # Remove leading and trailing ' & " characters from value - out[tokens[0]] = tokens[1].lstrip('\'').lstrip('\"').rstrip('\'').rstrip('\"') + env_file = None + try: + env_file = open(os_env_filename) + for line in env_file: + line = line.lstrip() + if not line.startswith('#') and line.startswith('export '): + line = line.lstrip('export ').strip() + tokens = line.split('=') + if len(tokens) > 1: + # Remove leading and trailing ' & " characters from + # value + out[tokens[0]] = tokens[1].lstrip('\'').lstrip('\"').rstrip('\'').rstrip('\"') + finally: + if env_file: + env_file.close() return out @@ -132,7 +227,12 @@ def read_file(filename): :return: """ out = str() - for line in open(filename): - out += line - - return out + the_file = None + try: + the_file = open(filename) + for line in the_file: + out += line + return out + finally: + if the_file: + the_file.close()