mirror of
https://github.com/ZettaIO/restic-compose-backup.git
synced 2025-12-15 02:01:08 +00:00
Move package to src/ to properly separate what goes into docker image
This commit is contained in:
102
src/restic_compose_backup/restic.py
Normal file
102
src/restic_compose_backup/restic.py
Normal file
@@ -0,0 +1,102 @@
|
||||
"""
|
||||
Restic commands
|
||||
"""
|
||||
import logging
|
||||
from typing import List, Tuple
|
||||
from subprocess import Popen, PIPE
|
||||
from restic_compose_backup import commands
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def init_repo(repository: str):
|
||||
"""
|
||||
Attempt to initialize the repository.
|
||||
Doing this after the repository is initialized
|
||||
"""
|
||||
return commands.run(restic(repository, [
|
||||
"init",
|
||||
]))
|
||||
|
||||
|
||||
def backup_files(repository: str, source='/volumes'):
|
||||
return commands.run(restic(repository, [
|
||||
"--verbose",
|
||||
"backup",
|
||||
source,
|
||||
]))
|
||||
|
||||
|
||||
def backup_from_stdin(repository: str, filename: str, source_command: List[str]):
|
||||
"""
|
||||
Backs up from stdin running the source_command passed in.
|
||||
It will appear in restic with the filename (including path) passed in.
|
||||
"""
|
||||
dest_command = restic(repository, [
|
||||
'backup',
|
||||
'--stdin',
|
||||
'--stdin-filename',
|
||||
filename,
|
||||
])
|
||||
|
||||
# pipe source command into dest command
|
||||
# NOTE: Using the default buffer size: io.DEFAULT_BUFFER_SIZE = 8192
|
||||
# We might want to tweak that to speed up large dumps.
|
||||
# Actual tests tests must be done.
|
||||
source_process = Popen(source_command, stdout=PIPE)
|
||||
dest_process = Popen(dest_command, stdin=source_process.stdout, stdout=PIPE, stderr=PIPE)
|
||||
stdout, stderr = dest_process.communicate()
|
||||
|
||||
if stdout:
|
||||
for line in stdout.decode().split('\n'):
|
||||
logger.debug(line)
|
||||
|
||||
if stderr:
|
||||
for line in stderr.decode().split('\n'):
|
||||
logger.error(line)
|
||||
|
||||
# Ensure both processes exited with code 0
|
||||
source_exit, dest_exit = source_process.poll(), dest_process.poll()
|
||||
return 0 if (source_exit == 0 and dest_exit == 0) else 1
|
||||
|
||||
|
||||
def snapshots(repository: str, last=True) -> Tuple[str, str]:
|
||||
args = ["snapshots"]
|
||||
if last:
|
||||
args.append('--last')
|
||||
return commands.run_capture_std(restic(repository, args))
|
||||
|
||||
|
||||
def forget(repository: str, daily: str, weekly: str, monthly: str, yearly: str):
|
||||
return restic(repository, [
|
||||
'forget',
|
||||
'--keep-daily',
|
||||
daily,
|
||||
'--keep-weekly',
|
||||
weekly,
|
||||
'--keep-monthly',
|
||||
monthly,
|
||||
'--keep-yearly',
|
||||
yearly,
|
||||
])
|
||||
|
||||
|
||||
def prune(repository: str):
|
||||
return restic(repository, [
|
||||
'prune',
|
||||
])
|
||||
|
||||
|
||||
def check(repository: str):
|
||||
return commands.run(restic(repository, [
|
||||
"check",
|
||||
]))
|
||||
|
||||
|
||||
def restic(repository: str, args: List[str]):
|
||||
"""Generate restic command"""
|
||||
return [
|
||||
"restic",
|
||||
"-r",
|
||||
repository,
|
||||
] + args
|
||||
Reference in New Issue
Block a user