#!/bin/bash
set -euo pipefail
# Update script for drestic installations
# Detects installation type and updates files safely
log() {
echo "--- $* ---"
}
error() {
echo "Error: $*" >&2
exit 1
}
# Detect installation type
detect_installation() {
if [ -f "/root/.restic_env" ] && [ -d "/etc/restic" ]; then
echo "system"
elif [ -f "$HOME/.config/restic/env" ]; then
echo "user"
else
error "Cannot detect drestic installation. Not found in system (/root/.restic_env) or user ($HOME/.config/restic/env) locations."
fi
}
# Check if running as root for system installation
check_permissions() {
local install_type="$1"
if [ "$install_type" = "system" ] && [ "$EUID" -ne 0 ]; then
error "System installation update requires root. Run with sudo."
fi
}
# Backup existing configuration files
backup_configs() {
local install_type="$1"
local backup_dir
if [ "$install_type" = "system" ]; then
backup_dir="/etc/restic/backup-$(date +%Y%m%d-%H%M%S)"
sudo mkdir -p "$backup_dir"
else
backup_dir="$HOME/.config/restic/backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$backup_dir"
fi
log "Backing up configuration to $backup_dir"
if [ "$install_type" = "system" ]; then
sudo cp -r /etc/restic/* "$backup_dir/" 2>/dev/null || true
else
cp -r "$HOME/.config/restic"/* "$backup_dir/" 2>/dev/null || true
fi
echo "$backup_dir"
}
# Update scripts
update_scripts() {
local install_type="$1"
local install_dir
if [ "$install_type" = "system" ]; then
install_dir="/usr/local/bin"
log "Updating scripts in $install_dir"
sudo cp restic_backup.sh "$install_dir/"
sudo cp restic_check.sh "$install_dir/"
sudo cp common.sh "$install_dir/"
sudo chmod +x "$install_dir/restic_*.sh" "$install_dir/common.sh"
else
install_dir="$HOME/.local/bin"
mkdir -p "$install_dir"
log "Updating scripts in $install_dir"
cp restic_backup.sh "$install_dir/"
cp restic_check.sh "$install_dir/"
cp common.sh "$install_dir/"
chmod +x "$install_dir/restic_*.sh" "$install_dir/common.sh"
fi
}
# Update systemd services
update_services() {
local install_type="$1"
local systemd_dir
if [ "$install_type" = "system" ]; then
systemd_dir="/etc/systemd/system"
log "Updating systemd services in $systemd_dir"
sudo cp systemd/restic-backup.service "$systemd_dir/"
sudo cp systemd/restic-check.service "$systemd_dir/"
sudo systemctl daemon-reload
else
systemd_dir="$HOME/.config/systemd/user"
mkdir -p "$systemd_dir"
log "Updating systemd services in $systemd_dir"
cp systemd/restic-backup.service "$systemd_dir/"
cp systemd/restic-check.service "$systemd_dir/"
systemctl --user daemon-reload
fi
}
# Optional: Update bandwidth limit in environment file
update_bandwidth() {
local install_type="$1"
local env_file
if [ "$install_type" = "system" ]; then
env_file="/root/.restic_env"
else
env_file="$HOME/.config/restic/env"
fi
# Check if file exists and has old bandwidth setting
if [ -f "$env_file" ] && grep -q "RCLONE_BWLIMIT=1M" "$env_file"; then
log "Updating rclone bandwidth limit from 1M to 2M"
if [ "$install_type" = "system" ]; then
sudo sed -i 's/RCLONE_BWLIMIT=1M/RCLONE_BWLIMIT=2M/' "$env_file"
else
sed -i 's/RCLONE_BWLIMIT=1M/RCLONE_BWLIMIT=2M/' "$env_file"
fi
fi
}
# Restart services
restart_services() {
local install_type="$1"
log "Restarting systemd timers"
if [ "$install_type" = "system" ]; then
sudo systemctl restart restic-backup.timer restic-check.timer
echo "System services updated. Check status with:"
echo " sudo systemctl status restic-backup.timer restic-check.timer"
else
systemctl --user restart restic-backup.timer restic-check.timer
echo "User services updated. Check status with:"
echo " systemctl --user status restic-backup.timer restic-check.timer"
fi
}
# Main update logic
main() {
log "Starting drestic update process"
# Get script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# Check we're in a git repo
if ! git rev-parse --git-dir > /dev/null 2>&1; then
error "Not in a git repository. Please run from drestic directory."
fi
# Detect installation type
install_type=$(detect_installation)
log "Detected $install_type installation"
# Check permissions
check_permissions "$install_type"
# Backup configs
backup_dir=$(backup_configs "$install_type")
log "Configuration backed up to: $backup_dir"
# Update scripts
update_scripts "$install_type"
# Update services
update_services "$install_type"
# Update bandwidth (optional)
update_bandwidth "$install_type"
# Restart services
restart_services "$install_type"
log "Update completed successfully!"
echo ""
echo "Key improvements in this update:"
echo " - Memory limits increased (512M RAM, 1G swap) to prevent OOM"
echo " - Prune coordination (2-4 AM window) to avoid multi-device conflicts"
echo " - Lock retry settings for robust multi-device operation"
echo " - Bandwidth increased from 1M to 2M for better performance"
echo ""
echo "If you encounter issues, restore from: $backup_dir"
}
# Run main function
main "$@"