mirror of
https://codeberg.org/puppe/mpbackup.git
synced 2025-12-20 05:52:18 +01:00
Compare commits
No commits in common. "master" and "v0.3.0" have entirely different histories.
2 changed files with 76 additions and 95 deletions
1
.envrc
Normal file
1
.envrc
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
use nix
|
||||||
168
mpbackup
168
mpbackup
|
|
@ -6,27 +6,17 @@ require 'yaml'
|
||||||
|
|
||||||
DEFAULT_CONFIG_FILE = Pathname.new('/etc/mpbackup/config.yaml')
|
DEFAULT_CONFIG_FILE = Pathname.new('/etc/mpbackup/config.yaml')
|
||||||
NAME = 'mpbackup'
|
NAME = 'mpbackup'
|
||||||
VERSION = '0.6.0'
|
VERSION = '0.3.0'
|
||||||
|
|
||||||
def set_restic_vars(config)
|
def set_restic_vars(config)
|
||||||
if config['repository-file']
|
|
||||||
puts "Reading repository from file #{config['repository-file']} …"
|
|
||||||
repo = File.open(config['repository-file'], &:gets).chomp
|
|
||||||
elsif config['repository']
|
|
||||||
repo = config['repository']
|
repo = config['repository']
|
||||||
else
|
puts "Repository: #{repo}"
|
||||||
error(1, 'No repository has been specified.')
|
|
||||||
end
|
|
||||||
if config['password-file']
|
if config['password-file']
|
||||||
puts "Reading password from file #{config['password-file']} …"
|
puts "Reading password from file #{config['password-file']} …"
|
||||||
password = File.open(config['password-file'], &:gets).chomp
|
password = File.open(config['password-file'], &:gets).chomp
|
||||||
else
|
else
|
||||||
password = STDIN.getpass('Please put in your restic password: ')
|
password = STDIN.getpass('Please put in your restic password: ')
|
||||||
end
|
end
|
||||||
if config['cache-dir']
|
|
||||||
puts "Setting RESTIC_CACHE_DIR to #{config['cache-dir']} …"
|
|
||||||
ENV['RESTIC_CACHE_DIR'] = config['cache-dir']
|
|
||||||
end
|
|
||||||
|
|
||||||
ENV['RESTIC_REPOSITORY'] = repo
|
ENV['RESTIC_REPOSITORY'] = repo
|
||||||
ENV['RESTIC_PASSWORD'] = password
|
ENV['RESTIC_PASSWORD'] = password
|
||||||
|
|
@ -35,13 +25,6 @@ end
|
||||||
def unset_restic_vars
|
def unset_restic_vars
|
||||||
ENV.delete('RESTIC_REPOSITORY')
|
ENV.delete('RESTIC_REPOSITORY')
|
||||||
ENV.delete('RESTIC_PASSWORD')
|
ENV.delete('RESTIC_PASSWORD')
|
||||||
ENV.delete('RESTIC_CACHE_DIR')
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_restic_path(config)
|
|
||||||
if !config.key? 'restic-path'
|
|
||||||
config['restic-path'] = 'restic'
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def error(exit_status, message)
|
def error(exit_status, message)
|
||||||
|
|
@ -49,81 +32,6 @@ def error(exit_status, message)
|
||||||
exit exit_status
|
exit exit_status
|
||||||
end
|
end
|
||||||
|
|
||||||
def check(config)
|
|
||||||
puts 'Checking restic repo …'
|
|
||||||
check_command = [config['restic-path'], 'check']
|
|
||||||
puts("Command: #{check_command.join(' ')}")
|
|
||||||
system(*check_command)
|
|
||||||
if $?.exitstatus > 0
|
|
||||||
error(1, "Checking restic repository failed.")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def backup(config)
|
|
||||||
puts "Backing up with restic …"
|
|
||||||
# https://restic.readthedocs.io/en/latest/040_backup.html#including-and-excluding-files
|
|
||||||
flags = config['backup'].select{|k,v|
|
|
||||||
k != 'exclude' && k != 'paths' && k != 'tags'}
|
|
||||||
flags = flags.map{|k,v| "--#{k}=#{v.to_s}"}
|
|
||||||
exclude = config.dig('backup', 'exclude')&.flat_map{|e| ['--exclude', e]} || []
|
|
||||||
tags = config.dig('backup', 'tags')&.flat_map{|t| ['--tag', t]} || []
|
|
||||||
paths = config.dig('backup', 'paths') || []
|
|
||||||
backup_command = [config['restic-path'], 'backup', *exclude, *paths, *flags]
|
|
||||||
puts("Command: #{backup_command.join(' ')}")
|
|
||||||
system(*backup_command)
|
|
||||||
if $?.exitstatus > 0
|
|
||||||
error(1, 'Failed to do backup.')
|
|
||||||
end
|
|
||||||
|
|
||||||
check(config)
|
|
||||||
|
|
||||||
if config.dig('forget', 'enable')
|
|
||||||
puts 'Forgetting unnecessary snapshots …'
|
|
||||||
flags = config['forget'].select{|k,v| k != 'enable'}
|
|
||||||
flags = flags.flat_map{|k,v| ['--' + k, v.to_s]}
|
|
||||||
forget_command = [config['restic-path'], 'forget'] + flags
|
|
||||||
puts("Command: #{forget_command.join(' ')}")
|
|
||||||
system(*forget_command)
|
|
||||||
# Data will only be deleted when `restic prune` is executed or when
|
|
||||||
# `restic forget` is called with `--prune`.
|
|
||||||
if $?.exitstatus > 0
|
|
||||||
error(1, "Forgetting snapshots failed.")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def prune(config)
|
|
||||||
puts 'Pruning restic repo …'
|
|
||||||
prune_command = [config['restic-path'], 'prune']
|
|
||||||
puts("Command: #{prune_command.join(' ')}")
|
|
||||||
system(*prune_command)
|
|
||||||
if $?.exitstatus > 0
|
|
||||||
error(1, 'Failed to prune.')
|
|
||||||
end
|
|
||||||
|
|
||||||
check
|
|
||||||
end
|
|
||||||
|
|
||||||
def run_restic(config)
|
|
||||||
puts 'Executing restic with the following arguments …'
|
|
||||||
puts "ARGV: #{ARGV}"
|
|
||||||
exec(config['restic-path'], *ARGV)
|
|
||||||
end
|
|
||||||
|
|
||||||
def act(config, options)
|
|
||||||
puts "Applying configuration ‘#{config['name']}’ …"
|
|
||||||
set_restic_vars(config)
|
|
||||||
set_restic_path(config)
|
|
||||||
if options[:prune]
|
|
||||||
prune config
|
|
||||||
elsif options[:run_restic]
|
|
||||||
run_restic config
|
|
||||||
else
|
|
||||||
backup config
|
|
||||||
end
|
|
||||||
unset_restic_vars
|
|
||||||
end
|
|
||||||
|
|
||||||
unset_restic_vars
|
unset_restic_vars
|
||||||
|
|
||||||
options = {}
|
options = {}
|
||||||
|
|
@ -172,6 +80,78 @@ if !Pathname.new(config_file).exist? then
|
||||||
error(1, "Config file #{config_file} has not been found!")
|
error(1, "Config file #{config_file} has not been found!")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def check
|
||||||
|
puts 'Checking restic repo …'
|
||||||
|
check_command = ['restic', 'check']
|
||||||
|
puts("Command: #{check_command.join(' ')}")
|
||||||
|
system(*check_command)
|
||||||
|
if $?.exitstatus > 0
|
||||||
|
error(1, "Checking restic repository #{ENV['RESTIC_REPOSITORY']} failed.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def backup(config)
|
||||||
|
puts "Backing up with restic …"
|
||||||
|
# https://restic.readthedocs.io/en/latest/040_backup.html#including-and-excluding-files
|
||||||
|
exclude = config.dig('backup', 'exclude')&.flat_map{|e| ['--exclude', e]} || []
|
||||||
|
paths = config.dig('backup', 'paths') || []
|
||||||
|
backup_command = ['restic', 'backup', *exclude, *paths]
|
||||||
|
puts("Command: #{backup_command.join(' ')}")
|
||||||
|
system(*backup_command)
|
||||||
|
if $?.exitstatus > 0
|
||||||
|
error(1, 'Failed to do backup.')
|
||||||
|
end
|
||||||
|
|
||||||
|
check
|
||||||
|
|
||||||
|
if config.dig('forget', 'enable')
|
||||||
|
puts 'Forgetting unnecessary snapshots …'
|
||||||
|
flags = config['forget'].select{|k,v| k != 'enable'}
|
||||||
|
flags = flags.flat_map{|k,v| ['--' + k, v.to_s]}
|
||||||
|
forget_command = ['restic', 'forget'] + flags
|
||||||
|
puts("Command: #{forget_command.join(' ')}")
|
||||||
|
system(*forget_command)
|
||||||
|
# Data will only be deleted when `restic prune` is executed or when
|
||||||
|
# `restic forget` is called with `--prune`.
|
||||||
|
if $?.exitstatus > 0
|
||||||
|
error(1, "Forgetting snapshots failed.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
unset_restic_vars
|
||||||
|
end
|
||||||
|
|
||||||
|
def prune(config)
|
||||||
|
puts 'Pruning restic repo …'
|
||||||
|
prune_command = ['restic', 'prune']
|
||||||
|
puts("Command: #{prune_command.join(' ')}")
|
||||||
|
system(*prune_command)
|
||||||
|
if $?.exitstatus > 0
|
||||||
|
error(1, 'Failed to prune.')
|
||||||
|
end
|
||||||
|
|
||||||
|
check
|
||||||
|
end
|
||||||
|
|
||||||
|
def run_restic(config)
|
||||||
|
puts 'Executing restic with the following arguments …'
|
||||||
|
puts "ARGV: #{ARGV}"
|
||||||
|
exec('restic', *ARGV)
|
||||||
|
end
|
||||||
|
|
||||||
|
def act(config, options)
|
||||||
|
puts "Applying configuration ‘#{config['name']}’ …"
|
||||||
|
set_restic_vars(config)
|
||||||
|
if options[:prune]
|
||||||
|
prune config
|
||||||
|
elsif options[:run_restic]
|
||||||
|
run_restic config
|
||||||
|
else
|
||||||
|
backup config
|
||||||
|
end
|
||||||
|
unset_restic_vars
|
||||||
|
end
|
||||||
|
|
||||||
puts "Using config file #{config_file} …"
|
puts "Using config file #{config_file} …"
|
||||||
configs = YAML.load_stream(File.open(config_file))
|
configs = YAML.load_stream(File.open(config_file))
|
||||||
config_names = options[:config_names]
|
config_names = options[:config_names]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue