192 lines
6.7 KiB
Python
Executable File
192 lines
6.7 KiB
Python
Executable File
#!/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)
|