#!/bin/bash ############################### # # # spapshot script for btrfs # # --- daemon --- # # v0.1 # # # ############################### ## settings ## export logfile="../var/log/backsnap.log" function main { #foar each hour while [ true ]; do for volume in `ls ../etc/backsnap/volumes/`; do [ -n "`cat "../etc/backsnap/volumes/$volume" | tr [:upper:] [:lower:] | grep enabled=true`" ] && snap_volume "../etc/backsnap/volumes/$volume" & done sleep 30s ## Debug ## norm 10m done } ## snap_ ## #snap_volume function snap_volume { conf="$1" prof="`basename $conf`" timestamp="../etc/backsnap/stamps/$prof" [ -f "$timestamp" ] || touch "$timestamp" chmod +x "$timestamp" . "$timestamp" #getconf for t in years months weeks days hours path_vol path_bak; do eval "$t=`cat "$conf" | grep -v "#" | tr [:upper:] [:lower:] | grep "$t=" | sed -s 's/'"$t="'/''/g' | tr -d " "`" [ -z "${!t}" ] && eval "$t=0" done #check conf ... #path_vol & path_bak exist (ar not 0 ...) #min one time number gt 0 for t in years months weeks days hours; do var="`echo $t | tr -d s`" [ "${!t}" -gt 0 ] && [ "`timeget_$var`" != "${!var}" ] && { #eigendliches backupen... logon echo "$prof: SETTINGS: \"years=$years\" \"months=$months\" \"weeks=$weeks\" \"days=$days\" \"hours=$hours\" \"path_vol=$path_vol\" \"path_bak=$path_bak\"" logon "$prof: MODE: $var" i=$((--$t)) #delete oldest if border is reached [ -d "$path_bak$var.$i" ] && { logon "$prof: SNAP: DEL: \"$path_bak$var.$i\"" #logon "$prof: SNAP: DEL: ERROR: `echo rm btrfs snapshot delete "$path_bak$var.$i" 3>&1 1>&2 2>&3`" rm -r "$path_bak$var.$i" ## Debug ## sleep 3 } #move all snaps one back while [ $i -ge 1 ]; do [ -d "$path_bak$var.$((--i))" ] && { logon "$prof: SNAP: MV: \"$path_bak$var.$i\" \"$path_bak$var.$((i+1))\"" #logon "$prof: SNAP: MV: ERROR: `echo mv "$path_bak$var.$i" "$path_bak$var.$((i+1))" 3>&1 1>&2 2>&3`" mv "$path_bak$var.$i" "$path_bak$var.$((i+1))" ## Debug ## sleep 3 } done #mk new snap logon "$prof: SNAP: MK: \"$path_vol\" \"$path_bak$var.$i\"" #logon "$prof: SNAP: MK: ERROR: `echo btrfs subfolume snapshot -r "$path_vol" "$path_bak$var.$i" 3>&1 1>&2 2>&3`" cp -f -r "$path_vol" "$path_bak$var.$i" ## Debug ## wr_stamp "$timestamp" "$prof" break } done } function timeget_year { date +%Y; } function timeget_month { date +%m; } function timeget_week { date +%V; } function timeget_day { date +%d; } function timeget_hour { date +%H; } #wr_stamp function wr_stamp { timestamp="$1" echo $1 reason="$2" echo "## timestamp for $reason ##" > "$timestamp" echo "## `date +%Y-%m-%d_%H-%M` ##" >> "$timestamp" echo >> "$timestamp" echo "year=`timeget_year`" >> "$timestamp" echo "month=`timeget_month`" >> "$timestamp" echo "week=`timeget_week`" >> "$timestamp" echo "day=`timeget_day`" >> "$timestamp" echo "hour=`timeget_hour`" >> "$timestamp" } function logon { delimeter="#" echo "`date +%Y%m%d%H%M%S` $delimeter `echo $@ | tr -d "$delimeter"`" >> "$logfile" } main