Advertisement
Guest User

Backup script

a guest
Aug 19th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 2.47 KB | None | 0 0
  1. #!/bin/bash
  2. function exiterr(){ notify-send -t 8640000 'Backup Script Failed' "${1}"; exit 1; }
  3. function localsum(){ sha512sum "${1}" | grep -oe '[0-9a-f]\{128\}' || exiterr "Unable to get sha512sum for local file ${1##*/}"; }
  4. function remotesum(){ $sshcmd "sha512sum ${remotebkp}${1}" | grep -oe '[0-9a-f]\{128\}' || exiterr "Unable to get sha512sum for remote file ${1}"; }
  5.  
  6. export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
  7. export DISPLAY=:0
  8.  
  9. failssh=0
  10. server='user@server'
  11. gpgrecipient='user@email'
  12. remotebkp='/path/to/remote/dir/'
  13. localbkp='/path/to/local/dir/'
  14. sshcmd="ssh -o BatchMode=yes -o ConnectionAttempts=3 -o ConnectTimeout=2 ${server}"
  15.  
  16. until $sshcmd 'true' >&/dev/null; do
  17.     ((++failssh >= 30)) && exiterr "Cannot establish SSH connection to ${server}"
  18.     sleep 1
  19. done
  20.  
  21. uploaded=()
  22. declare -A bkpfiles=(
  23.     ["${HOME}/folder1.tar.gz.gpg"]="${HOME}/folder1"
  24.     ["${HOME}/folder2.tar.gz.gpg"]="${HOME}/folder2"
  25.     ["${HOME}/Documents/password-db.kdbx"]=''
  26. )
  27.  
  28. for bfile in "${!bkpfiles[@]}"; do
  29.     dirnewer=false
  30.     bkpdir="${bkpfiles[$bfile]}"
  31.    
  32.     if [[ -d "${bkpdir}" ]]; then
  33.         for f in "${bkpdir}"/*; do
  34.             [[ "$f" -nt "${HOME}/${bkpdir##*/}-last-modified" ]] && dirnewer=true
  35.         done
  36.        
  37.         if $dirnewer; then
  38.             tarf="${bfile%.gpg}"
  39.             tar Pczf "${tarf}" "${bkpdir}" || exiterr "Error archiving ${tarf}"
  40.             gpg --batch --yes --output "${bfile}" --encrypt --recipient "${gpgrecipient}" "${tarf}" || exiterr "Error encrypting ${tarf}"
  41.             rm -f "${tarf}"
  42.             touch "${HOME}/${bkpdir##*/}-last-modified"
  43.         fi
  44.     fi
  45.    
  46.     lsha512="$(localsum "${bfile}")"
  47.     rsha512="$(remotesum "${bfile##*/}")"
  48.    
  49.     if [[ "${lsha512}" != "${rsha512}" ]]; then
  50.         lsize="$(stat -c%s "${bfile}")"
  51.         rsize="$($sshcmd "stat -c%s ${remotebkp}${bfile##*/}")"
  52.         ((lsize < rsize)) && exiterr "Local ${bfile##*/} filesize smaller (manual backup required)"
  53.        
  54.         scp -l 8000 -o BatchMode=yes "${bfile}" "${server}:${remotebkp}" || exiterr "Error copying ${bfile##*/} to ${server}"
  55.         [[ -d "${localbkp}" ]] && cp "${bfile}" "${localbkp}"
  56.        
  57.         uploaded+=("${bfile##*/}")
  58.     fi
  59. done
  60.  
  61. if [[ -z "${uploaded[*]}" ]]; then
  62.     notify-send -t 8640000 'Backup Script Successful' 'No uploads were needed'
  63. else
  64.     IFS=$'\n'
  65.     notify-send -t 8640000 'Backup Script Successful' "Successfully uploaded files:\\n${uploaded[*]}"
  66. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement