Rollback Procedures and Recovery Planning

Rollback Procedures and Recovery Planning

Implement rollback capabilities for failed updates:

#!/bin/bash
# /usr/local/bin/update-rollback.sh

# Configuration
BACKUP_DIR="/backup/system-snapshots"
LOG_FILE="/var/log/update-rollback.log"

# Create system snapshot before updates
create_snapshot() {
    local snapshot_name="pre-update-$(date +%Y%m%d-%H%M%S)"
    
    echo "Creating system snapshot: $snapshot_name"
    
    # For LVM systems
    if command -v lvcreate &> /dev/null; then
        lvcreate -L10G -s -n "$snapshot_name" /dev/vg0/root
    fi
    
    # For ZFS systems
    if command -v zfs &> /dev/null; then
        zfs snapshot rpool/ROOT/ubuntu@"$snapshot_name"
    fi
    
    # For Btrfs systems
    if command -v btrfs &> /dev/null; then
        btrfs subvolume snapshot / "/snapshot/$snapshot_name"
    fi
    
    # Backup package states
    dpkg --get-selections > "$BACKUP_DIR/package-selections-$snapshot_name.txt"
    apt-mark showmanual > "$BACKUP_DIR/manual-packages-$snapshot_name.txt"
    
    echo "$snapshot_name" > /tmp/last-snapshot
}

# Rollback to previous state
rollback_updates() {
    local snapshot_name=$(cat /tmp/last-snapshot 2>/dev/null)
    
    if [ -z "$snapshot_name" ]; then
        echo "No snapshot found for rollback"
        return 1
    fi
    
    echo "Rolling back to snapshot: $snapshot_name"
    
    # Stop services
    systemctl stop apache2 nginx
    
    # Restore package states
    if [ -f "$BACKUP_DIR/package-selections-$snapshot_name.txt" ]; then
        dpkg --set-selections < "$BACKUP_DIR/package-selections-$snapshot_name.txt"
        apt-get dselect-upgrade -y
    fi
    
    # Restore configurations
    if [ -d "$BACKUP_DIR/configs-$snapshot_name" ]; then
        cp -a "$BACKUP_DIR/configs-$snapshot_name"/etc/apache2/* /etc/apache2/
        cp -a "$BACKUP_DIR/configs-$snapshot_name"/etc/nginx/* /etc/nginx/
    fi
    
    # Start services
    systemctl start apache2 nginx
    
    echo "Rollback completed"
}

# Test rollback procedure
test_rollback() {
    echo "Testing rollback procedure..."
    
    # Create test snapshot
    create_snapshot
    
    # Make harmless change
    touch /tmp/rollback-test-file
    
    # Perform rollback
    rollback_updates
    
    # Verify rollback
    if [ ! -f /tmp/rollback-test-file ]; then
        echo "Rollback test successful"
        return 0
    else
        echo "Rollback test failed"
        return 1
    fi
}