From d7a19bfb59596ec4891dbd25fd95554d07f6be6c Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Wed, 5 Sep 2018 22:25:54 +0200 Subject: [PATCH] Add color to sysout --- configsync.py | 104 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 42 deletions(-) diff --git a/configsync.py b/configsync.py index 830db69..b4dd81c 100644 --- a/configsync.py +++ b/configsync.py @@ -13,22 +13,32 @@ import grp CONFIG_SYNC_VERSION = "1.0.0" CONFIG_SYNC_FILE = "/etc/configsync.conf" +class bcolors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + def check_dependencies(): status = True try: subprocess.call(["git", "version"], stdout=subprocess.DEVNULL) except OSError: status = False - print("git cannot be found on your system!") + print(bcolors.FAIL + "git cannot be found on your system!" + bcolors.ENDC) print("Install git: pacman -S git") return status def print_splash(): - print("---=== CONFIG-SYNC ===---") + print(bcolors.HEADER + "---=== CONFIG-SYNC ===---" + bcolors.ENDC) print("Version: " + CONFIG_SYNC_VERSION) print() - print("---=== USAGE ===---") + print(bcolors.HEADER + "---=== USAGE ===---" + bcolors.ENDC) print("configsync init") print("configsync add ") print("configsync remove ") @@ -38,7 +48,7 @@ def print_splash(): def validate_or_create_config(config): if not os.path.exists(CONFIG_SYNC_FILE): - print("Creating default configuration file: " + CONFIG_SYNC_FILE) + print(bcolors.OKBLUE + "Creating default configuration file: " + CONFIG_SYNC_FILE + bcolors.ENDC) config['DEFAULT'] = {} config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] = "/opt/configsync/storage" config['DEFAULT']['INITIALIZED'] = "" @@ -64,44 +74,44 @@ def update_config(config): try: config.write(open(CONFIG_SYNC_FILE, 'w')) except PermissionError as e: - print("Unable to write config file! Error: " + e.strerror) + print(bcolors.FAIL + "Unable to write config file! Error: " + e.strerror + bcolors.ENDC) sys.exit(1) except Exception as e: - print("Unable to write config file! Error: " + str(e)) + print(bcolors.FAIL + "Unable to write config file! Error: " + str(e) + bcolors.ENDC) sys.exit(1) def init_dialog(): config = get_config() - print("Welcome to CONFIG-SYNC!") + print(bcolors.HEADER + "---=== Welcome to CONFIG-SYNC! ===---" + bcolors.ENDC) print() if config['DEFAULT']['INITIALIZED']: - reinitialize = input("WARNING: CONFIG-SYNC has already been initialized! Do you really want to change the configuration? [y/N]: ") + reinitialize = input(bcolors.WARNING + "WARNING: CONFIG-SYNC has already been initialized! Do you really want to change the configuration? [y/N]: " + bcolors.ENDC) if not reinitialize or reinitialize != "y": print("Skipping new initialization!") sys.exit(0) - local_path = input("Enter the local storage directory for configuration files [" + config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] + "]: ") + local_path = input(bcolors.OKBLUE + "Enter the local storage directory for configuration files [" + config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] + "]: " + bcolors.ENDC) if not local_path: local_path = config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] = local_path - remote_repo = input("Enter the remote repository url [" + config['GIT']['REMOTE_REPOSITORY'] + "]: ") + remote_repo = input(bcolors.OKBLUE + "Enter the remote repository url [" + config['GIT']['REMOTE_REPOSITORY'] + "]: " + bcolors.ENDC) if not remote_repo: remote_repo = config['GIT']['REMOTE_REPOSITORY'] config['GIT']['REMOTE_REPOSITORY'] = remote_repo - git_ssh_key = input("Enter the path to the ssh key to use [" + config['GIT']['SSHKEY'] + "]: ") + git_ssh_key = input(bcolors.OKBLUE + "Enter the path to the ssh key to use [" + config['GIT']['SSHKEY'] + "]: " + bcolors.ENDC) if not git_ssh_key: git_ssh_key = config['GIT']['SSHKEY'] config['GIT']['SSHKEY'] = git_ssh_key - git_user = input("Enter the git user name (displayname) [" + config['GIT']['USER'] + "]: ") + git_user = input(bcolors.OKBLUE + "Enter the git user name (displayname) [" + config['GIT']['USER'] + "]: " + bcolors.ENDC) if not git_user: git_user = config['GIT']['USER'] config['GIT']['USER'] = git_user - git_email = input("Enter the git user email address [" + config['GIT']['EMAIL'] + "]: ") + git_email = input(bcolors.OKBLUE + "Enter the git user email address [" + config['GIT']['EMAIL'] + "]: " + bcolors.ENDC) if not git_email: git_email = config['GIT']['EMAIL'] config['GIT']['EMAIL'] = git_email @@ -115,19 +125,19 @@ def create_initialization_file(path): with open(path + "/configsync.info", mode='w') as file: file.write('CONFIG-SYNC Repo initialized: %s.\n' % ( datetime.datetime.now())) except PermissionError as e: - print("Unable to write initialization file! Error: " + e.strerror) + print(bcolors.FAIL + "Unable to write initialization file! Error: " + e.strerror + bcolors.ENDC) sys.exit(1) except Exception as e: - print("Unable to write initialization file! Error: " + str(e)) + print(bcolors.FAIL + "Unable to write initialization file! Error: " + str(e) + bcolors.ENDC) sys.exit(1) try: open(path + "/configsync.db", mode='a').close() except PermissionError as e: - print("Unable to write database file! Error: " + e.strerror) + print(bcolors.FAIL + "Unable to write database file! Error: " + e.strerror + bcolors.ENDC) sys.exit(1) except Exception as e: - print("Unable to write database file! Error: " + str(e)) + print(bcolors.FAIL + "Unable to write database file! Error: " + str(e) + bcolors.ENDC) sys.exit(1) def add_file_to_db(file_path): @@ -143,10 +153,10 @@ def add_file_to_db(file_path): with open(config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] + "/configsync.db", mode='a') as file: file.write('%s\n' % (file_path)) except PermissionError as e: - print("Unable to write db file! Error: " + e.strerror) + print(bcolors.FAIL + "Unable to write db file! Error: " + e.strerror + bcolors.ENDC) sys.exit(1) except Exception as e: - print("Unable to write db file! Error: " + str(e)) + print(bcolors.FAIL + "Unable to write db file! Error: " + str(e) + bcolors.ENDC) sys.exit(1) def delete_file_from_db(file_path): @@ -160,10 +170,10 @@ def delete_file_from_db(file_path): search.write(line.rstrip() + "\n") search.truncate() except PermissionError as e: - print("Unable to write db file! Error: " + e.strerror) + print(bcolors.FAIL + "Unable to write db file! Error: " + e.strerror + bcolors.ENDC) sys.exit(1) except Exception as e: - print("Unable to write db file! Error: " + str(e)) + print(bcolors.FAIL + "Unable to write db file! Error: " + str(e) + bcolors.ENDC) sys.exit(1) def setup_git_ssh_environment(): @@ -208,8 +218,8 @@ def git_pull(path): def git_check_status(status): config = get_config() if not status: - print("FATAL: Git operation failed! Repository has to be recovered manually!") - print("FATAL: Repository path: " + config['DEFAULT']['LOCAL_STORAGE_DIRECTORY']) + print(bcolors.FAIL + bcolors.BOLD + "FATAL: Git operation failed! Repository has to be recovered manually!" + bcolors.ENDC) + print(bcolors.FAIL + "FATAL: Repository path: " + config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] + bcolors.ENDC) sys.exit(1) def init_local_repo(): @@ -217,11 +227,11 @@ def init_local_repo(): print("Setting up local repository.") if not os.path.exists(config['DEFAULT']['LOCAL_STORAGE_DIRECTORY']): - print("Creating new directory: " + config['DEFAULT']['LOCAL_STORAGE_DIRECTORY']) + print(bcolors.OKBLUE + "Creating new directory: " + config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] + bcolors.ENDC) try: os.makedirs(config['DEFAULT']['LOCAL_STORAGE_DIRECTORY']) except OSError as e: - print("Failed to create local repository directory: " + e.strerror) + print(bcolors.FAIL + "Failed to create local repository directory: " + e.strerror + bcolors.ENDC) sys.exit(1) # init git repo @@ -238,20 +248,23 @@ def init_local_repo(): git_check_status(git_push(config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'], "configsync initialized")) git_check_status(git_pull(config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'])) + print(bcolors.OKGREEN + "CONFIG-SYNC initialization successfull!" + bcolors.ENDC) + print(bcolors.OKBLUE + "You can now use CONFIG-SYNC to keep your config files up to date." + bcolors.ENDC) + def add_file(filepath): config = get_config() abs_path = os.path.abspath(filepath) if not os.path.exists(abs_path): - print("Invalid file, skipping!") + print(bcolors.WARNING + "Invalid file, skipping!" + bcolors.ENDC) sys.exit(1) else: - print("Adding '" + abs_path + "' to CONFIG-SYNC...") + print(bcolors.OKBLUE + "Adding '" + abs_path + "' to CONFIG-SYNC..." + bcolors.ENDC) local_path = config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] + abs_path if os.path.exists(local_path): - print("File is already registered to CONFIG-SYNC, skipping!") + print(bcolors.WARNING + "File is already registered to CONFIG-SYNC, skipping!" + bcolors.ENDC) sys.exit(1) else: target_directory = os.path.abspath(os.path.join(local_path, os.pardir)) @@ -269,10 +282,10 @@ def add_file(filepath): with open(local_path + ".cfsinfo", mode='w') as file: file.write('%s;%s;%s;%s;%s' % (file_permissions, file_owner, file_group, file_owner_name, file_group_name)) except PermissionError as e: - print("Unable to write stat file! Error: " + e.strerror) + print(bcolors.FAIL + "Unable to write stat file! Error: " + e.strerror + bcolors.ENDC) sys.exit(1) except Exception as e: - print("Unable to write stat file! Error: " + str(e)) + print(bcolors.FAIL + "Unable to write stat file! Error: " + str(e) + bcolors.ENDC) sys.exit(1) shutil.copy2(abs_path, local_path) @@ -283,8 +296,8 @@ def add_file(filepath): add_file_to_db(abs_path) - print("File added to CONFIG-SYNC!") - print("Use configsync store to push the file to the remote repository!") + print(bcolors.OKGREEN + "File added to CONFIG-SYNC!" + bcolors.ENDC) + print(bcolors.OKBLUE + "Use configsync store to push the file to the remote repository!" + bcolors.ENDC) def remove_file(filepath): config = get_config() @@ -293,19 +306,19 @@ def remove_file(filepath): local_path = config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] + abs_path if not os.path.exists(local_path): - print("File not registered to CONFIG-SYNC, skipping!") + print(bcolors.WARNING + "File not registered to CONFIG-SYNC, skipping!" + bcolors.ENDC) sys.exit(1) else: - print("Removing '" + abs_path + "' from CONFIG-SYNC...") + print(bcolors.OKBLUE + "Removing '" + abs_path + "' from CONFIG-SYNC..." + bcolors.ENDC) target_directory = os.path.abspath(os.path.join(abs_path, os.pardir)) if not os.path.exists(target_directory): os.makedirs(target_directory) if os.path.exists(abs_path): - confirmed = input("Do you really want to override the local file '" + abs_path + "'? [y/N]: ") + confirmed = input(bcolors.OKBLUE + "Do you really want to override the local file '" + abs_path + "'? [y/N]: " + bcolors.ENDC) if not confirmed or confirmed != "y": - print("Skipping removal process!") + print(bcolors.WARNING + "Skipping removal process!" + bcolors.ENDC) sys.exit(0) else: os.remove(abs_path) @@ -324,14 +337,18 @@ def remove_file(filepath): delete_file_from_db(abs_path) - print("File removed from CONFIG-SYNC!") - print("Use configsync store to push the file to the remote repository!") + print(bcolors.OKGREEN + "File removed from CONFIG-SYNC!" + bcolors.ENDC) + print(bcolors.OKBLUE + "Use configsync store to push the file to the remote repository!" + bcolors.ENDC) def store(): config = get_config() setup_git_ssh_environment() git_push(config['DEFAULT']['LOCAL_STORAGE_DIRECTORY']) + print(bcolors.OKGREEN + "CONFIG-SYNC store successfull!" + bcolors.ENDC) + print(bcolors.OKBLUE + "You can now restore the configuration on your other systems." + bcolors.ENDC) + + def update_local_metadata(): config = get_config() with open(config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] + "/configsync.db", "r") as search: @@ -340,7 +357,7 @@ def update_local_metadata(): local_path = config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] + abs_path if not os.path.exists(local_path): - print("Invalid file in database, skipping!") + print(bcolors.WARNING + "Invalid file in database, skipping! (" + abs_path + ")" + bcolors.ENDC) else: with open(local_path + ".cfsinfo", "r") as metadata_file: metadata_string = metadata_file.readline().rstrip() @@ -360,9 +377,9 @@ def restore(): update_local_metadata() - confirmed = input("Do you really want to restore files from the repository? Local files will be overwritten! [y/N]: ") + confirmed = input(bcolors.WARNING + "Do you really want to restore files from the repository? Local files will be overwritten! [y/N]: " + bcolors.ENDC) if not confirmed or confirmed != "y": - print("Skipping restore process!") + print(bcolors.WARNING + "Skipping restore process!" + bcolors.ENDC) sys.exit(0) else: with open(config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] + "/configsync.db", "r") as search: @@ -371,7 +388,7 @@ def restore(): local_path = config['DEFAULT']['LOCAL_STORAGE_DIRECTORY'] + abs_path if not os.path.exists(local_path): - print("Invalid file, skipping!") + print(bcolors.WARNING + "Invalid file, skipping!" + bcolors.ENDC) else: target_directory = os.path.abspath(os.path.join(abs_path, os.pardir)) if not os.path.exists(target_directory): @@ -388,6 +405,9 @@ def restore(): os.chown(abs_path, file_owner, file_group, follow_symlinks=False) + print(bcolors.OKGREEN + "CONFIG-SYNC restore successfull!" + bcolors.ENDC) + print(bcolors.OKBLUE + "Configuration files have been updated. A reboot might be required." + bcolors.ENDC) + def main(argv): if not check_dependencies(): sys.exit(1)