sdd (4120B)
1 #!/bin/sh 2 # ██ ██ 3 # ░██ ░██ 4 # ██████ ░██ ░██ 5 # ██░░░░ ██████ ██████ 6 # ░░█████ ██░░░██ ██░░░██ 7 # ░░░░░██░██ ░██░██ ░██ 8 # ██████ ░░██████░░██████ 9 # ░░░░░░ ░░░░░░ ░░░░░░ 10 # s e c u r e d e d u p 11 # 12 # author ▓▒ pyratebeard 13 # code ▓▒ https://git.pyratebeard.net/dotfiles/file/bin/bin/sdd.html 14 15 BASENAME="${0##*/}" 16 DEDUP_PATH="$HOME/src/warez/dedup" 17 DEDUP_DIR="/var/dedup" 18 DEDUP_KEY="$HOME/lib/keys/dedup.key" 19 ARCHIVE_NAME="$(date +%Y%m%d)" 20 21 usage() { 22 echo "Usage: ${BASENAME} [-p <file|dir>] [-u <file|dir>] 23 24 -d: (daily) run daily via cron to backup important items 25 -f: (full) packs \$HOME to external drive (/mnt/dedup) 26 -h: (help) prints this page 27 -l: (list) print all backup repos and latest archive 28 -p: (pack) backup file or directory 29 -r: (rclone) upload all repos to cloud storage 30 -u: (unpack) restore file or directory 31 " 32 } 33 34 pager() { 35 # notify in irc channel 36 # https://serverfault.com/a/259877 37 msg="${1}" 38 irc_serv="irc.local" 39 irc_port="6667" 40 irc_nick="pager" 41 irc_chan="#pager" 42 43 echo -e "USER ${irc_nick} guest tolmoon tolsun\nNICK ${irc_nick}\nJOIN ${irc_chan}\nPRIVMSG ${irc_chan} :$(date +%T) ${BASENAME} : ${msg}\nQUIT\n" | \ 44 nc ${irc_serv} ${irc_port} 45 46 # notify using ntfy 47 curl -d "${msg}" https://pager.pyratebeard.net/sdd 48 } 49 50 fnd_latest() { 51 item="${1}" 52 latest=$(find ${DEDUP_DIR}/${item}/archive -type f \ 53 -exec stat -c '%X %n' {} \; | \ 54 sort -nr | \ 55 awk -F\/ 'NR==1 {print $NF}') 56 return ${latest} 57 } 58 59 list() { 60 local repos=$(find ${DEDUP_DIR}/* -maxdepth 1 -type d -prune -printf '%f\n') 61 for r in ${repos} ; do 62 fnd_latest ${r} 63 echo "${r}: ${latest}" 64 done 65 } 66 67 pack() { 68 pack_path="$(readlink -f ${1})" 69 pack_item="$(echo $pack_path | awk -F\/ '{print $NF}')" 70 # trim period from hidden {file,dir} 71 pack_item="${pack_item#.*}" 72 # trim file extension 73 pack_item="${pack_item%.*}" 74 75 [ -d ${DEDUP_DIR}/${pack_item} ] || \ 76 ${DEDUP_PATH}/dup-init \ 77 -k ${DEDUP_KEY} \ 78 -E XChaCha20-Poly1305 \ 79 ${DEDUP_DIR}/${pack_item} 80 81 fnd_latest ${pack_item} 82 [[ ${latest} == ${ARCHIVE_NAME} ]] && exit 0 83 84 sudo tar -pcf - ${pack_path} | \ 85 ${DEDUP_PATH}/dup-pack \ 86 -k ${DEDUP_KEY} \ 87 -r ${DEDUP_DIR}/${pack_item} \ 88 ${ARCHIVE_NAME} 89 } 90 91 unpack(){ 92 unpack_item=${1} 93 fnd_latest ${unpack_item} 94 ${DEDUP_PATH}/dup-unpack \ 95 -k ${DEDUP_KEY} \ 96 -r ${DEDUP_DIR}/${unpack_item} \ 97 ${latest} | \ 98 sudo tar -C / -pxf - 99 } 100 101 upload() { 102 storage=${1} 103 echo "$(date +%Y%m%dT%T) : starting sync" >> $HOME/var/log/sdd 104 rclone sync ${DEDUP_DIR}/ ${storage}:securededup 105 echo "$(date +%Y%m%dT%T) : finished sync" >> $HOME/var/log/sdd 106 echo "$(date +%Y%m%dT%T) : starting cleanup" >> $HOME/var/log/sdd 107 rclone cleanup ${storage}:securededup 108 echo "$(date +%Y%m%dT%T) : finished cleanup" >> $HOME/var/log/sdd 109 } 110 111 daily() { 112 buku_dir="$HOME/var/bkmrks" 113 backup_list=( 114 "$HOME/var/mbox" 115 "${buku_dir}/buku.db" 116 "$HOME/lib/documents/work/octotech" 117 "$HOME/lib/keys" 118 "$HOME/.password-store" 119 "$HOME/dot" 120 "$HOME/.zhistory" 121 "$HOME/.todo" 122 "$HOME/lib/documents/grimoire" 123 "$HOME/lib/images/pictures" 124 ) 125 storage_list=( 126 "backblaze" 127 ) 128 129 if [ -f "${buku_dir}/buku.db" ] ; then 130 rm -f ${buku_dir}/buku.db 131 fi 132 buku -e ${buku_dir}/buku.db >/dev/null 133 134 for item in ${backup_list[@]} ; do 135 pack ${item} || pager "packing of ${item} failed" 136 done 137 138 for storage in ${storage_list[@]} ; do 139 upload ${storage} || pager "upload to ${storage} failed" 140 done 141 } 142 143 full_bak() { 144 DEDUP_DIR="/mnt/dedup" 145 146 sudo tar -pcf - ${HOME} | \ 147 ${DEDUP_PATH}/dup-pack \ 148 -k ${DEDUP_KEY} \ 149 -r ${DEDUP_DIR}/$(hostname -s)-home \ 150 $(date +%Y%m%d) 151 } 152 153 if [ $# -eq 0 ] ; then 154 usage 155 else 156 while getopts ":dflp:r:u:" opt ; do 157 case ${opt} in 158 d) daily ;; 159 f) full_bak ;; 160 h) usage ;; 161 l) list ;; 162 p) pack "${OPTARG}" ;; 163 r) upload ${OPTARG} ;; 164 u) unpack "${OPTARG}" ;; 165 *) usage ;; 166 esac 167 done 168 fi