revamped decision logic
[rrq/nilfs2sss.git] / sss.sh
1 #!/bin/bash
2 #
3 # Snapshot Snapping Scheme
4 #
5 # This is a cron bot to manage the snapshots of an nilfs2 file system,
6 # so as to preserve 7 most recent daily, 4 most recent weekly and 12
7 # most recent monthly snapshots, in addition to labelled ones.
8 #
9 # The cron bot is expected to run once a minute
10
11 # The hour-of-day to preserve as daily snapshot
12 KEEPHH=12
13
14 # The day-of-month to preserve as monthly snapshot
15 KEEPDD=15
16
17 DEV=$1
18 if [ -z "$DEV" ] ; then
19     DEVS=( $( mount | grep nilfs2 | sed 's/ .*//' ) )
20     DEV=${DEVS[0]}
21     if [ -z "$DEV" ] ; then
22         echo "Error* cannot find a mounted nilfs2 partition" >&2
23         exit 1
24     fi
25 fi
26
27 FIVELY="$(date -d '-5 minutes' '+%Y-%m-%d %H:%M:%S')"
28 HOURLY="$(date -d '-1 hour' '+%Y-%m-%d %H:%M:%S')"
29 DAILY="$(date -d '-1 day' '+%Y-%m-%d %H:%M:%S')"
30 MONTHLY="$(date -d '-1 month' '+%Y-%m-%d %H:%M:%S')"
31 WEEKLY="$(date -d '-7 days' '+%Y-%m-%d %H:%M:%S')"
32 YEARLY="$(date -d '-1 year' '+%Y-%m-%d %H:%M:%S')"
33
34 MARK=( )
35 function marksnap() {
36     if [[ "${MARK[0]}" == "$1" ]] && [[ "${MARK[1]}" = "$2" ]] ; then
37         chcp cp $DEV ${MARKYEAR[2]}
38     fi
39     MARK=( "$1" "$2" $3 )
40 fi
41
42 { flock 9
43
44 date "+$DEV: %Y-%m-%d %H:%M:%S ---- checking" >&2
45 lscp -s $DEV | while read CNO DATE TIME REST ; do
46     TS="$DATE $TIME"
47     [ "$CNO" = "CNO" ] && continue
48     if [[ "$TS" > "$YEARLY" ]] ; then
49         marksnap YEAR "${DATE:0:4}" $CNO
50     elif [[ "$TS" > "$MONTHLY" ]]
51          marksnap MONTH "${DATE:5:2}" $CNO
52     elif [[ "$TS" > "$WEEKLY" ]]
53          # For older than most recent week, keep last snapshot each week
54          marksnap WEEK "$(( 7${DATE:8:2} / 7 - 100 ))" $CNO
55     elif [[ "$TS" > "$DAILY" ]]
56          marksnap DAY "${DATE:8:2}" $CNO
57     elif [[ "$TS" > "$HOURLY" ]]
58          marksnap HOUR "${DATE:8:2}-${TIME:0:2}" $CNO
59     else
60         echo "$CNO $DATE $TIME within last hour"
61     fi
62 done | if read X ; then
63     : # snapshot within last hour
64 else
65     date "+$DEV: new snapshot at %Y-%m-%d %H:%M:%S" >&2
66     mkcp -s $DEV
67 fi
68 } 9> /var/run/lock/sss.lock