python-test/Module 2/Task 6/backup.py

70 lines
1.8 KiB
Python

import argparse
import logging
from pathlib import Path
import shutil
import datetime
import time
logging.basicConfig(
level=logging.INFO,
format="%(message)s",
)
logger = logging.getLogger("__main__")
parser = argparse.ArgumentParser(description="Backup tool")
parser.add_argument("source", help="source folder for backup")
parser.add_argument("dest", help="destination folder")
parser.add_argument("--compress", "-c", help="compress", action="store_true")
def timing(func):
def wrapper(*args, **kwargs):
start_time: float = time.time()
result = func(*args, **kwargs)
logger.info(f"Copying completed for {time.time() - start_time:.2f}s")
return result
return wrapper
def main():
args = parser.parse_args()
try:
source = Path(args.source)
if not source.exists():
raise FileExistsError()
dest = Path(args.dest)
dest.mkdir(exist_ok=True)
backup(source, dest, args.compress)
except FileExistsError:
logger.error("Source folder not found")
except OSError:
logger.error("Can't create destination folder")
@timing
def backup(source: Path, dest: Path, compress: bool):
timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
target_file = dest / f"backup_{timestamp}"
if compress:
logger.info(
f"Chosen compression, making archive of {source.absolute()} and copying to {dest.absolute()}"
)
shutil.make_archive(f"{target_file}", "zip", source.absolute())
logger.info(f"Created backup zip file {target_file}")
logger.info(f"Chosen raw copy, copying {source.absolute()} folder to {target_file}")
shutil.copytree(source.absolute(), target_file)
logger.info("Copying completed")
if __name__ == "__main__":
main()