70 lines
1.8 KiB
Python
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()
|