initial setup
[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 an hour
10
11 # hourly = every hour
12 # daily = .. keep one of the hourly yesterday
13 # weekly = .. keep one of the daily last week
14 # monthly = .. keep one of the daily last month
15
16 DEV=/dev/sda5
17 KEEPHH=12
18 KEEPDD=15
19
20 FIVELY="$(date -d '-5 minutes' '+%Y-%m-%d %H:%M:%S')"
21 HOURLY="$(date -d '-1 hour' '+%Y-%m-%d %H:%M:%S')"
22 DAILY="$(date -d '-1 days' '+%Y-%m-%d %H:%M:%S')"
23 MONTHLY="$(date -d '-1 months' '+%Y-%m-%d %H:%M:%S')"
24 WEEKLY="$(date -d '-7 days' '+%Y-%m-%d %H:%M:%S')"
25 YEARLY="$(date -d '-1 years' '+%Y-%m-%d %H:%M:%S')"
26
27 date "+%Y-%m-%d %H:%M:%S ---- checking" >&2
28 lscp -s | while read CNO DATE TIME REST ; do
29     TS="$DATE $TIME"
30     [ "$CNO" = "CNO" ] && continue
31     if [[ "$TS" < "$YEARLY" ]] ; then
32         if [ "$KEEPYY" = "${DATE:0:4}" ] ; then
33             echo "# discard year duplicate $CNO $DATE $TIME" >&2
34             chcp cp $CNO
35         else
36             KEEPYY="${DATE:0:4}"
37         fi
38         echo "# keep first of year $CNO $DATE $TIME" >&2
39         continue
40     fi
41     # Within last year
42     if [[ "$TS" < "$MONTHLY" ]] ; then
43         if [ "$KEEPMM" = "${DATE:0:7}" ] ; then
44             echo "# discard month duplicate $CNO $DATE $TIME" >&2
45             chcp cp $CNO
46         else
47             KEEPMM="${DATE:0:7}"
48         fi
49     fi
50     # Within last month
51     if [[ "$TS" < "$WEEKLY" ]] ; then
52         if [[ "$KEEPDD" = "${DATE:8:2}" ]] ; then
53             if [ -z "$KEEPWW" ] ; then
54                 KEEPWW="${DATE:8:2}"
55                 continue
56             fi
57             echo "# discard duplicate day $KEEPDD: $CNO $DATE $TIME" >&2
58         else 
59             echo "# discard not day $KEEPDD: $CNO $DATE $TIME" >&2
60         fi
61         chcp cp $CNO
62         continue
63     fi
64     # Within last week
65     if [[ "$TS" < "$DAILY" ]] ; then
66         [[ "$KEEPHH" = "${TIME:0:2}" ]] && continue
67         echo "# discard not hour $KEEPHH: $CNO $DATE $TIME" >&2
68         chcp cp $CNO
69         continue
70     fi
71     # Within last day
72     if [[ "$TS" < "$HOURLY" ]] ; then
73         if [ "$KEEP55" = "${TIME:0:2}" ] ; then
74             echo "# discard duplicate for hour $KEEP55: $CNO $DATE $TIME" >&2
75             chcp cp $CNO
76         else
77             KEEP55="${TIME:0:2}"
78             #echo "# keep first of hour $KEEP55: $CNO $DATE $TIME" >&2
79         fi
80         continue
81     fi
82     # Within last hour
83     #echo "# keep within last hour $CNO $DATE $TIME" >&2
84     [[ "$TS" < "$FIVELY" ]] && continue
85     echo "$CNO $DATE $TIME is within last five minutes"
86     #echo "# $CNO is within last five minutes " >&2
87 done | if read X ; then
88     :
89 else
90     date "+# new snapshot at %Y-%m-%d %H:%M:%S" >&2
91     mkcp -s $DEV
92 fi