Moving utils functions in separate module
parent
2b09b2d27a
commit
7a8215ae16
|
@ -7,188 +7,14 @@ 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
|
||||
|
||||
# FUNCTIONS
|
||||
########################################
|
||||
def yes_no_question(question="Yes or no?", default=False):
|
||||
prompt=""
|
||||
if(default is True):
|
||||
prompt = " [Y/n]"
|
||||
else:
|
||||
prompt = " [y/N]"
|
||||
|
||||
answer = input(question + prompt).lower()
|
||||
|
||||
if(len(answer) == 0):
|
||||
return default
|
||||
else:
|
||||
answer = answer[0]
|
||||
|
||||
if(default is True):
|
||||
if answer in ['n','0']:
|
||||
return False
|
||||
else:
|
||||
if answer in ['y','o','1']:
|
||||
return True
|
||||
|
||||
return default
|
||||
|
||||
def contractuser(path):
|
||||
home = os.path.expanduser("~")
|
||||
|
||||
if path.startswith(home):
|
||||
return path.replace(home, "~", 1) # Replace only one instance:
|
||||
# the first one
|
||||
else:
|
||||
return path
|
||||
|
||||
def copy_file_or_directory(logger, path_dst, path_src, overwrite=True):
|
||||
|
||||
# Expand '~' as user's home dir
|
||||
dst = os.path.expanduser(path_dst)
|
||||
src = os.path.expanduser(path_src)
|
||||
|
||||
if overwrite:
|
||||
|
||||
# --------------------------------------
|
||||
def replace_backup():
|
||||
try:
|
||||
logger.info("Putting backup back in place")
|
||||
shutil.move(dst + ".bak", dst)
|
||||
|
||||
except FileNotFoundError:
|
||||
logger.error("No backup of %s found. Oops" % dst)
|
||||
return False
|
||||
|
||||
except PermissionError:
|
||||
logger.error("Cannot replace backup %s because of permissions"
|
||||
% (dst + ".bak"))
|
||||
return False
|
||||
|
||||
except FileExistsError:
|
||||
logger.error("%s has been created, you need to chose " \
|
||||
"manually to keep it or to use the backup %s"
|
||||
% (dst, dst + ".bak"))
|
||||
return False
|
||||
|
||||
return True
|
||||
# --------------------------------------
|
||||
|
||||
|
||||
try:
|
||||
logger.info("Moving old directory %s" % dst)
|
||||
shutil.move(dst, dst + ".bak")
|
||||
|
||||
except FileNotFoundError:
|
||||
logger.info("No file %s exists yet" % dst)
|
||||
|
||||
except PermissionError:
|
||||
logger.error("Unable to write %s, please check permissions"
|
||||
% (dst + ".bak"))
|
||||
return False
|
||||
|
||||
except FileExistsError:
|
||||
logger.error("%s already exists" % (dst + ".bak"))
|
||||
return False
|
||||
|
||||
|
||||
# No overwrite ? No problem.
|
||||
else:
|
||||
|
||||
def replace_backup():
|
||||
return True
|
||||
|
||||
|
||||
# Copy the conf dir
|
||||
# --------------------------------------
|
||||
try:
|
||||
logger.info("Copying directory %s" % src)
|
||||
shutil.copytree(src, dst)
|
||||
|
||||
except FileNotFoundError:
|
||||
logger.error("%s does not seem to exist" % src)
|
||||
replace_backup()
|
||||
return False
|
||||
|
||||
except PermissionError:
|
||||
logger.error("Unable to write %s, please check permissions" % dst)
|
||||
replace_backup()
|
||||
return False
|
||||
|
||||
except FileExistsError:
|
||||
logger.error("The directory '%s' already exists" % dst)
|
||||
replace_backup()
|
||||
return False
|
||||
|
||||
# It's not a dir, it's a file !
|
||||
# --------------------------------------
|
||||
except NotADirectoryError:
|
||||
|
||||
# Try not to overwrite an existing file.
|
||||
# Note that if 'overwrite' was set to True, any existing file would
|
||||
# have been moved at this point.
|
||||
if os.path.exists(dst):
|
||||
logger.error("The file %s already exists" % dst)
|
||||
replace_backup()
|
||||
return False
|
||||
|
||||
try:
|
||||
logger.info("Copying file %s" % src)
|
||||
shutil.copyfile(src, dst)
|
||||
|
||||
except PermissionError:
|
||||
logger.error("Unable to write %s, please check permissions" % dst)
|
||||
replace_backup()
|
||||
return False
|
||||
|
||||
# Everything went well, time to remove the backup
|
||||
# --------------------------------------
|
||||
if overwrite:
|
||||
delete_file_or_dir((dst + ".bak"), logger)
|
||||
|
||||
# The End.
|
||||
return True
|
||||
|
||||
|
||||
# ======================================
|
||||
def delete_file_or_dir(path, logger=None):
|
||||
|
||||
# Set logger to '/dev/null' if it's not set
|
||||
if logger is None:
|
||||
logger = logging.getLogger("/dev/null")
|
||||
logger.addHandler(logging.NullHandler())
|
||||
|
||||
# Try it as a dir first
|
||||
try:
|
||||
logger.info("Removing directory %s" % path)
|
||||
shutil.rmtree(path)
|
||||
|
||||
except FileNotFoundError:
|
||||
logger.warning("File %s seems to be already deleted" % path)
|
||||
return False
|
||||
except PermissionError:
|
||||
logger.warning("Cannot remove dir %s, you will have to do it manually"
|
||||
% path)
|
||||
return False
|
||||
|
||||
# If not, try it as a file
|
||||
except NotADirectoryError:
|
||||
try:
|
||||
logger.info("Removing file %s" % path)
|
||||
os.remove(path)
|
||||
|
||||
except PermissionError:
|
||||
logger.warning( "Cannot remove file %s, you'll have to do it " \
|
||||
"manually"
|
||||
% path )
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
|
||||
# ARGPARSE
|
||||
|
|
|
@ -0,0 +1,184 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os, os.path
|
||||
import shutil
|
||||
|
||||
# FUNCTIONS
|
||||
########################################
|
||||
def yes_no_question(question="Yes or no?", default=False):
|
||||
prompt=""
|
||||
if(default is True):
|
||||
prompt = " [Y/n]"
|
||||
else:
|
||||
prompt = " [y/N]"
|
||||
|
||||
answer = input(question + prompt).lower()
|
||||
|
||||
if(len(answer) == 0):
|
||||
return default
|
||||
else:
|
||||
answer = answer[0]
|
||||
|
||||
if(default is True):
|
||||
if answer in ['n','0']:
|
||||
return False
|
||||
else:
|
||||
if answer in ['y','o','1']:
|
||||
return True
|
||||
|
||||
return default
|
||||
|
||||
def contractuser(path):
|
||||
home = os.path.expanduser("~")
|
||||
|
||||
if path.startswith(home):
|
||||
return path.replace(home, "~", 1) # Replace only one instance:
|
||||
# the first one
|
||||
else:
|
||||
return path
|
||||
|
||||
def copy_file_or_directory(logger, path_dst, path_src, overwrite=True):
|
||||
|
||||
# Expand '~' as user's home dir
|
||||
dst = os.path.expanduser(path_dst)
|
||||
src = os.path.expanduser(path_src)
|
||||
|
||||
if overwrite:
|
||||
|
||||
# --------------------------------------
|
||||
def replace_backup():
|
||||
try:
|
||||
logger.info("Putting backup back in place")
|
||||
shutil.move(dst + ".bak", dst)
|
||||
|
||||
except FileNotFoundError:
|
||||
logger.error("No backup of %s found. Oops" % dst)
|
||||
return False
|
||||
|
||||
except PermissionError:
|
||||
logger.error("Cannot replace backup %s because of permissions"
|
||||
% (dst + ".bak"))
|
||||
return False
|
||||
|
||||
except FileExistsError:
|
||||
logger.error("%s has been created, you need to chose " \
|
||||
"manually to keep it or to use the backup %s"
|
||||
% (dst, dst + ".bak"))
|
||||
return False
|
||||
|
||||
return True
|
||||
# --------------------------------------
|
||||
|
||||
|
||||
try:
|
||||
logger.info("Moving old directory %s" % dst)
|
||||
shutil.move(dst, dst + ".bak")
|
||||
|
||||
except FileNotFoundError:
|
||||
logger.info("No file %s exists yet" % dst)
|
||||
|
||||
except PermissionError:
|
||||
logger.error("Unable to write %s, please check permissions"
|
||||
% (dst + ".bak"))
|
||||
return False
|
||||
|
||||
except FileExistsError:
|
||||
logger.error("%s already exists" % (dst + ".bak"))
|
||||
return False
|
||||
|
||||
|
||||
# No overwrite ? No problem.
|
||||
else:
|
||||
|
||||
def replace_backup():
|
||||
return True
|
||||
|
||||
|
||||
# Copy the conf dir
|
||||
# --------------------------------------
|
||||
try:
|
||||
logger.info("Copying directory %s" % src)
|
||||
shutil.copytree(src, dst)
|
||||
|
||||
except FileNotFoundError:
|
||||
logger.error("%s does not seem to exist" % src)
|
||||
replace_backup()
|
||||
return False
|
||||
|
||||
except PermissionError:
|
||||
logger.error("Unable to write %s, please check permissions" % dst)
|
||||
replace_backup()
|
||||
return False
|
||||
|
||||
except FileExistsError:
|
||||
logger.error("The directory '%s' already exists" % dst)
|
||||
replace_backup()
|
||||
return False
|
||||
|
||||
# It's not a dir, it's a file !
|
||||
# --------------------------------------
|
||||
except NotADirectoryError:
|
||||
|
||||
# Try not to overwrite an existing file.
|
||||
# Note that if 'overwrite' was set to True, any existing file would
|
||||
# have been moved at this point.
|
||||
if os.path.exists(dst):
|
||||
logger.error("The file %s already exists" % dst)
|
||||
replace_backup()
|
||||
return False
|
||||
|
||||
try:
|
||||
logger.info("Copying file %s" % src)
|
||||
shutil.copyfile(src, dst)
|
||||
|
||||
except PermissionError:
|
||||
logger.error("Unable to write %s, please check permissions" % dst)
|
||||
replace_backup()
|
||||
return False
|
||||
|
||||
# Everything went well, time to remove the backup
|
||||
# --------------------------------------
|
||||
if overwrite:
|
||||
delete_file_or_dir((dst + ".bak"), logger)
|
||||
|
||||
# The End.
|
||||
return True
|
||||
|
||||
|
||||
# ======================================
|
||||
def delete_file_or_dir(path, logger=None):
|
||||
|
||||
# Set logger to '/dev/null' if it's not set
|
||||
if logger is None:
|
||||
logger = logging.getLogger("/dev/null")
|
||||
logger.addHandler(logging.NullHandler())
|
||||
|
||||
# Try it as a dir first
|
||||
try:
|
||||
logger.info("Removing directory %s" % path)
|
||||
shutil.rmtree(path)
|
||||
|
||||
except FileNotFoundError:
|
||||
logger.warning("File %s seems to be already deleted" % path)
|
||||
return False
|
||||
except PermissionError:
|
||||
logger.warning("Cannot remove dir %s, you will have to do it manually"
|
||||
% path)
|
||||
return False
|
||||
|
||||
# If not, try it as a file
|
||||
except NotADirectoryError:
|
||||
try:
|
||||
logger.info("Removing file %s" % path)
|
||||
os.remove(path)
|
||||
|
||||
except PermissionError:
|
||||
logger.warning( "Cannot remove file %s, you'll have to do it " \
|
||||
"manually"
|
||||
% path )
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
Loading…
Reference in New Issue