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()