mirror of
				https://github.com/kevinveenbirkenbach/computer-playbook.git
				synced 2025-11-04 04:08:15 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			86 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/bin/bash
 | 
						|
# @param $1 hostname from which backup should be pulled
 | 
						|
 | 
						|
echo "pulling backups from: $1" &&
 | 
						|
 | 
						|
# error counter
 | 
						|
errors=0 &&
 | 
						|
 | 
						|
echo "loading meta data..." &&
 | 
						|
 | 
						|
remote_host="backup@$1" &&
 | 
						|
echo "host address:         $remote_host" &&
 | 
						|
 | 
						|
remote_machine_id="$( (ssh "$remote_host" sha256sum /etc/machine-id) | head -c 64 )" &&
 | 
						|
echo "remote machine id:    $remote_machine_id" &&
 | 
						|
 | 
						|
general_backup_machine_dir="/Backups/$remote_machine_id/" &&
 | 
						|
echo "backup dir:           $general_backup_machine_dir" &&
 | 
						|
 | 
						|
remote_backup_types="$(ssh "$remote_host" "find $general_backup_machine_dir -maxdepth 1 -type d -execdir basename {} ;")" &&
 | 
						|
echo "backup types:          $remote_backup_types" || exit 1
 | 
						|
 | 
						|
for backup_type in $remote_backup_types; do
 | 
						|
  if [ "$backup_type" != "$remote_machine_id" ]; then
 | 
						|
    echo "backup type:              $backup_type" &&
 | 
						|
    
 | 
						|
    general_backup_type_dir="$general_backup_machine_dir""$backup_type/" &&
 | 
						|
    general_versions_dir="$general_backup_type_dir" &&
 | 
						|
    local_previous_version_dir="$(ls -d $general_versions_dir* | tail -1)" &&
 | 
						|
    echo "last local backup:      $local_previous_version_dir" &&
 | 
						|
 | 
						|
    remote_backup_versions="$(ssh "$remote_host" ls -d "$general_backup_type_dir"\*)" &&
 | 
						|
    echo "remote backup versions:   $remote_backup_versions" &&
 | 
						|
 | 
						|
 | 
						|
    remote_last_backup_dir=$(echo "$remote_backup_versions" | tail -1) &&
 | 
						|
    echo "last remote backup:       $remote_last_backup_dir" &&
 | 
						|
 | 
						|
    remote_source_path="$remote_host:$remote_last_backup_dir/" &&
 | 
						|
    echo "source path:              $remote_source_path" &&
 | 
						|
 | 
						|
    local_backup_destination_path=$remote_last_backup_dir &&
 | 
						|
    echo "backup destination:       $local_backup_destination_path" &&
 | 
						|
 | 
						|
    echo "creating local backup destination folder..." &&
 | 
						|
    mkdir -vp "$local_backup_destination_path" &&
 | 
						|
 | 
						|
    echo "starting backup..."
 | 
						|
    rsync_command='rsync -abP --delete --delete-excluded --rsync-path="sudo rsync" --link-dest="'$local_previous_version_dir'" "'$remote_source_path'" "'$local_backup_destination_path'"'
 | 
						|
 | 
						|
    echo "executing:                $rsync_command"
 | 
						|
 | 
						|
    retry_count=0
 | 
						|
    max_retries=12
 | 
						|
    retry_delay=300  # Retry delay in seconds (5 minutes)
 | 
						|
    last_retry_start=0
 | 
						|
    max_retry_duration=43200  # Maximum duration for a single retry attempt (12 hours)
 | 
						|
 | 
						|
    while [[ $retry_count -lt $max_retries ]]; do
 | 
						|
      echo "Retry attempt: $((retry_count + 1))"
 | 
						|
      if [[ $retry_count -gt 0 ]]; then
 | 
						|
        current_time=$(date +%s)
 | 
						|
        last_retry_duration=$((current_time - last_retry_start))
 | 
						|
        if [[ $last_retry_duration -ge $max_retry_duration ]]; then
 | 
						|
          echo "Last retry took more than 12 hours, increasing max retries to 12."
 | 
						|
          max_retries=12
 | 
						|
        fi
 | 
						|
      fi
 | 
						|
      last_retry_start=$(date +%s)
 | 
						|
      eval "$rsync_command"
 | 
						|
      rsync_exit_code=$?
 | 
						|
      if [[ $rsync_exit_code -eq 0 ]]; then
 | 
						|
        break
 | 
						|
      fi
 | 
						|
      retry_count=$((retry_count + 1))
 | 
						|
      sleep $retry_delay
 | 
						|
    done
 | 
						|
 | 
						|
    if [[ $rsync_exit_code -ne 0 ]]; then
 | 
						|
      echo "Error: rsync failed after $max_retries attempts"
 | 
						|
      ((errors += 1))
 | 
						|
    fi
 | 
						|
  fi
 | 
						|
done
 | 
						|
exit $errors;
 |