syntax fix and indentation
[rrq/nilfs2sss.git] / sss.sh
diff --git a/sss.sh b/sss.sh
index c514643279ecacde1ba546a4d79bfc9ca1c60e22..0207686ef7a3e54d510fb0080852fa056a9cebf7 100755 (executable)
--- a/sss.sh
+++ b/sss.sh
@@ -6,87 +6,63 @@
 # so as to preserve 7 most recent daily, 4 most recent weekly and 12
 # most recent monthly snapshots, in addition to labelled ones.
 #
-# The cron bot is expected to run once an hour
+# The cron bot is expected to run once a minute
 
-# hourly = every hour
-# daily = .. keep one of the hourly yesterday
-# weekly = .. keep one of the daily last week
-# monthly = .. keep one of the daily last month
-
-DEV=/dev/sda5
+# The hour-of-day to preserve as daily snapshot
 KEEPHH=12
+
+# The day-of-month to preserve as monthly snapshot
 KEEPDD=15
 
+DEV=$1
+if [ -z "$DEV" ] ; then
+    DEVS=( $( mount | grep nilfs2 | sed 's/ .*//' ) )
+    DEV=${DEVS[0]}
+    if [ -z "$DEV" ] ; then
+       echo "Error* cannot find a mounted nilfs2 partition" >&2
+       exit 1
+    fi
+fi
+
 FIVELY="$(date -d '-5 minutes' '+%Y-%m-%d %H:%M:%S')"
 HOURLY="$(date -d '-1 hour' '+%Y-%m-%d %H:%M:%S')"
-DAILY="$(date -d '-1 days' '+%Y-%m-%d %H:%M:%S')"
-MONTHLY="$(date -d '-1 months' '+%Y-%m-%d %H:%M:%S')"
+DAILY="$(date -d '-1 day' '+%Y-%m-%d %H:%M:%S')"
+MONTHLY="$(date -d '-1 month' '+%Y-%m-%d %H:%M:%S')"
 WEEKLY="$(date -d '-7 days' '+%Y-%m-%d %H:%M:%S')"
-YEARLY="$(date -d '-1 years' '+%Y-%m-%d %H:%M:%S')"
+YEARLY="$(date -d '-1 year' '+%Y-%m-%d %H:%M:%S')"
 
-date "+%Y-%m-%d %H:%M:%S ---- checking" >&2
-lscp -s | while read CNO DATE TIME REST ; do
-    TS="$DATE $TIME"
-    [ "$CNO" = "CNO" ] && continue
-    if [[ ! "$TS" > "$YEARLY" ]] ; then
-       if [ "$KEEPYY" = "${DATE:0:4}" ] ; then
-           echo "# discard year duplicate $CNO $DATE $TIME" >&2
-           chcp cp $CNO
-       else
-           KEEPYY="${DATE:0:4}"
-       fi
-       echo "# keep first of year $CNO $DATE $TIME" >&2
-       continue
-    fi
-    # Within last year
-    if [[ ! "$TS" > "$MONTHLY" ]] ; then
-       if [ "$KEEPMM" = "${DATE:0:7}" ] ; then
-           echo "# discard month duplicate $CNO $DATE $TIME" >&2
-           chcp cp $CNO
-       else
-           KEEPMM="${DATE:0:7}"
-       fi
+MARK=( )
+function marksnap() {
+    if [[ "${MARK[0]}" == "$1" ]] && [[ "${MARK[1]}" = "$2" ]] ; then
+       chcp cp $DEV ${MARKYEAR[2]}
     fi
-    # Within last month
-    if [[ ! "$TS" > "$WEEKLY" ]] ; then
-       if [[ "$KEEPDD" = "${DATE:8:2}" ]] ; then
-           if [ -z "$KEEPWW" ] ; then
-               KEEPWW="${DATE:8:2}"
-               continue
-           fi
-           echo "# discard duplicate day $KEEPDD: $CNO $DATE $TIME" >&2
-       else 
-           echo "# discard not day $KEEPDD: $CNO $DATE $TIME" >&2
-       fi
-       chcp cp $CNO
-       continue
-    fi
-    # Within last week
-    if [[ ! "$TS" > "$DAILY" ]] ; then
-       [[ "$KEEPHH" = "${TIME:0:2}" ]] && continue
-       echo "# discard not hour $KEEPHH: $CNO $DATE $TIME" >&2
-       chcp cp $CNO
-       continue
-    fi
-    # Within last day
-    if [[ ! "$TS" > "$HOURLY" ]] ; then
-       if [ "$KEEP55" = "${TIME:0:2}" ] ; then
-           echo "# discard duplicate for hour $KEEP55: $CNO $DATE $TIME" >&2
-           chcp cp $CNO
-       else
-           KEEP55="${TIME:0:2}"
-           #echo "# keep first of hour $KEEP55: $CNO $DATE $TIME" >&2
-       fi
-       continue
-    fi
-    # Within last hour
-    #echo "# keep within last hour $CNO $DATE $TIME" >&2
-    [[ ! "$TS" > "$FIVELY" ]] && continue
-    echo "$CNO $DATE $TIME is within last five minutes"
-    #echo "# $CNO is within last five minutes " >&2
-done | if read X ; then
-    :
-elif [[ $(( $(date +%M) % 5 )) = 0 ]] ; then
-    date "+# new snapshot at %Y-%m-%d %H:%M:%S" >&2
-    mkcp -s $DEV
-fi
+    MARK=( "$1" "$2" $3 )
+}
+
+{ flock 9
+
+  date "+$DEV: %Y-%m-%d %H:%M:%S ---- checking" >&2
+  lscp -s $DEV | while read CNO DATE TIME REST ; do
+      TS="$DATE $TIME"
+      [ "$CNO" = "CNO" ] && continue
+      if [[ "$TS" > "$YEARLY" ]] ; then
+         marksnap YEAR "${DATE:0:4}" $CNO
+      elif [[ "$TS" > "$MONTHLY" ]]
+          marksnap MONTH "${DATE:5:2}" $CNO
+      elif [[ "$TS" > "$WEEKLY" ]]
+          # For older than most recent week, keep last snapshot each week
+          marksnap WEEK "$(( 7${DATE:8:2} / 7 - 100 ))" $CNO
+      elif [[ "$TS" > "$DAILY" ]]
+          marksnap DAY "${DATE:8:2}" $CNO
+      elif [[ "$TS" > "$HOURLY" ]]
+          marksnap HOUR "${DATE:8:2}-${TIME:0:2}" $CNO
+      else
+         echo "$CNO $DATE $TIME within last hour"
+      fi
+  done | if read X ; then
+      : # snapshot within last hour
+  else
+      date "+$DEV: new snapshot at %Y-%m-%d %H:%M:%S" >&2
+      mkcp -s $DEV
+  fi
+} 9> /var/run/lock/sss.lock