community-backup/community_backup/webui/deployments.py

66 lines
1.9 KiB
Python

from collections import defaultdict
from logging import getLogger
import shutil
from django.conf import settings
logger = getLogger("deployments")
# sync users
def sync_repos(dry_run=False):
"""Synchronize the repos"""
from .models import BorgRepository
repos = BorgRepository.objects.all()
print(repos)
repos_by_key = defaultdict(list)
for repo in repos:
repos_by_key[repo.key].append(repo)
print(repos)
# create .ssh directory
ssh_dir = settings.BACKUP_AUTHORIZED_KEYS.parent
if not dry_run:
ssh_dir.mkdir(
mode=0o750,
exist_ok=True,
parents=True,
)
# create authorized_keys file
authorized_keys = settings.BACKUP_AUTHORIZED_KEYS
commands = []
for key, repositories in repos_by_key.items():
repo_paths = [f"--restrict-to-repository {repo.path}" for repo in repositories]
commands.append(
f"""command="cd {str(settings.BACKUP_BORG_DIR)}; borg serve {" ".join(repo_paths)} --storage-quota=500G",restrict {key}"""
)
if not dry_run:
authorized_keys.write_text("\n".join(commands) + "\n")
print(repos)
# remove repositories that do no longer exist
repo_paths = {repo.path for repo in repos}
print(repo_paths)
for user_dir in settings.BACKUP_BORG_DIR.iterdir():
print(user_dir)
for dir in user_dir.iterdir():
if dir.is_dir() and not dir.name.startswith("."):
if dir not in repo_paths:
print(f"removing unused repo '{dir}'")
if not dry_run:
shutil.rmtree(dir)
# create the repositories
for repo in repos:
print(f"creating repo {repo}")
if not dry_run:
repo.path.mkdir(mode=0o750, exist_ok=True, parents=True)
shutil.chown(repo.path, user=settings.BACKUP_USER)