diff options
| author | Sam Scholten | 2025-10-22 14:23:12 +1000 |
|---|---|---|
| committer | Sam Scholten | 2025-10-22 15:32:14 +1000 |
| commit | 5abbc944a50bf9e563d38e51f3ea5ff60076093b (patch) | |
| tree | af2b20f64c9d3f1b6ea7e532aface65c11b3ab78 /update.sh | |
| parent | eded676575e6ef6150235b71d34ec4612f1a7bfb (diff) | |
| download | drestic-5abbc944a50bf9e563d38e51f3ea5ff60076093b.tar.gz drestic-5abbc944a50bf9e563d38e51f3ea5ff60076093b.zip | |
Release v1.2.0: Add automated update script
- Add update.sh script for seamless upgrades
- Automatically detects user/system installations
- Backs up configurations before updating
- Migrates bandwidth limit from 1M to 2M
- Updates scripts and services safely
Diffstat (limited to 'update.sh')
| -rwxr-xr-x | update.sh | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/update.sh b/update.sh new file mode 100755 index 0000000..6bc6de8 --- /dev/null +++ b/update.sh @@ -0,0 +1,189 @@ +#!/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 "$@"
\ No newline at end of file |
