#!/usr/bin/env python3 import argparse import logging import os, os.path import shutil import time import tarfile from utils import yes_no_question, contractuser, \ copy_file_or_directory, delete_file_or_dir from metafile import Metafile, MalformedMetafileError, NoPathDefinedError from persoconf import Persoconf, FileInsteadOfDirError, \ PersoconfRootDoesNotExistError import commands.list, commands.package, commands.update, commands.add, \ commands.delete, commands.check # ARGPARSE ############################################################################## # Argument parsing using argparse # ============================================================================= parser = argparse.ArgumentParser() parser.add_argument( "--rootdir", type=str, default="~/.config/persoconf/", help="The persoconf directory to use" ) parser.add_argument( "--metafile", type=str, default="META", help="The name of the metadata files" ) parser.add_argument( "--verbose", "-v", action="store_true", help="Spout out more logs" ) subparsers = parser.add_subparsers( dest="command", title="commands" ) # Help # ----------------------------------------------------------------------------- parser_help = subparsers.add_parser( "help", help="Print this help" ) # List # ----------------------------------------------------------------------------- parser_list = subparsers.add_parser( "list", help="List backuped apps" ) commands.list.init(parser_list) # Package # ----------------------------------------------------------------------------- parser_package = subparsers.add_parser( "package", help="Package a persoconf repository" ) commands.package.init(parser_package) # Update # ----------------------------------------------------------------------------- parser_update = subparsers.add_parser( "update", help="Backup an app configuration in " \ "the persoconf directory with " \ "the configuration in use now" ) commands.update.init(parser_update) # Add # ----------------------------------------------------------------------------- parser_add = subparsers.add_parser( "add", help="Add an app to the persoconf " \ "directory, or add a config file " \ "to an existing app" ) commands.add.init(parser_add) # Check # ----------------------------------------------------------------------------- parser_check = subparsers.add_parser( "check", help="Checks if the backuped and the " \ "original file are different." ) commands.check.init(parser_check) # Delete # ----------------------------------------------------------------------------- parser_del = subparsers.add_parser( "delete", help="Delete an app from the persoconf " \ "directory, or a config file from " \ "an existing app" ) commands.delete.init(parser_del) # Parse arguments # ============================================================================= args = parser.parse_args() # Transform paths args.rootdir = os.path.expanduser(args.rootdir) # LOGGING ############################################################################## log = logging.getLogger("persoconf") log.setLevel(logging.DEBUG) # Console handler log_handler_console = logging.StreamHandler() log_handler_console.setLevel(logging.WARNING) # Let's adjust the console handler to the verbosity level required if(args.verbose): log_handler_console.setLevel(logging.DEBUG) log_formatter_console = logging.Formatter("%(name)s:%(levelname)s: %(message)s") log_handler_console.setFormatter(log_formatter_console) log.addHandler(log_handler_console) # SCRIPT ############################################################################## # If we were asked for help, let's give some if args.command in [ "help", None ]: parser.print_help() exit() # Try to create the Persoconf # ============================================================================= try: persoconf = Persoconf(path=args.rootdir, metafile=args.metafile) # If the place is already taken, there's nothing we can do except FileInsteadOfDirError: log.error("'%s' exists but is a file" % str(args.rootdir)) # Otherwise, maybe we can create the directory ? except PersoconfRootDoesNotExistError: log.warning("'%s' does not exist" % str(args.rootdir)) # Ask before creating the directory if not yes_no_question( "Do you want to create the persoconf directory " \ "'%s'?" % str(args.rootdir) ) : log.info("The persoconf directory was not created") exit() # Create the directory log.info("Creating persoconf directory...") os.mkdir(args.rootdir) log.info("New persoconf directory created at '%s'" % args.rootdir) # Finally retry to create the Persoconf try: persoconf = Persoconf(args.rootdir, metafile=args.metafile) except Error as err: log.error("Something very unexpected occured, I'm sorry") log.error("Error dump follows") log.error(str(err)) exit() # LIST COMMAND # ============================================================================= if args.command == "list": commands.list.run(args, persoconf, log) # DELETE COMMAND # ============================================================================= if args.command == "delete": commands.delete.run(args, persoconf, log) # ADD COMMAND # ============================================================================= if args.command == "add": commands.add.run(args, persoconf, log) # CHECK COMMAND # ============================================================================= if args.command == "check": commands.check.run(args, persoconf, log) # UPDATE COMMAND # ============================================================================= if args.command == "update": commands.update.run(args, persoconf, log) # PACKAGE COMMAND # ============================================================================= if args.command == "package": commands.package.run(args, persoconf, log)