krateng/maloja

View on GitHub
maloja/proccontrol/tasks/backup.py

Summary

Maintainability
A
55 mins
Test Coverage
import tarfile
import time
import glob
import os
from ...pkg_global.conf import dir_settings
from pathlib import PurePath

from doreah.logging import log
from doreah.io import col


basic_files = [
    ('config',    ['rules/*.tsv','settings.ini','apikeys.yml','custom_css/*.css']),
    ('state',    ['auth/auth.ddb','malojadb.sqlite'])
]
expanded_files = [
    ('state',    ['images'])
]

def backup(targetfolder=None,include_images=False):

    if targetfolder is None:
        targetfolder = os.getcwd()

    if include_images:
        file_patterns = basic_files + expanded_files
    else:
        file_patterns = basic_files

    real_files = {}
    for category,patterns in file_patterns:
        real_files.setdefault(category,[])
        for pattern in patterns:
            real_files[category] += glob.glob(os.path.join(dir_settings[category],pattern))

    log("Creating backup...")


    timestr = time.strftime("%Y_%m_%d_%H_%M_%S")
    filename = f"maloja_backup_{timestr}.tar.gz"
    outputfile = os.path.join(targetfolder,filename)
    assert not os.path.exists(outputfile)

    with tarfile.open(name=outputfile,mode="x:gz") as archive:
        for category, filelist in real_files.items():
            for f in filelist:
                p = PurePath(f)
                r = p.relative_to(dir_settings[category])
                archive.add(f,arcname=os.path.join(category,r))
    log("Backup created: " + col['yellow'](outputfile))
    return outputfile