dotfiles

*nix config files
git clone git://git.pyratebeard.net/dotfiles.git
Log | Files | Refs | README

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