fixes, prometheus, lots of stuff
[distro-setup] / btrfsmaint
index 6c7dbb1f6788119cafa9cac1dc2cae559cd2c07b..1639a8dd48f450e69fdf67558a4780059583ec1d 100755 (executable)
@@ -15,7 +15,12 @@ source /a/bin/errhandle/err
 dusage="5 10"
 musage="5"
 
-e() { echo "cron: $*"; "$@"; }
+e() {
+  echo "cron: $*"
+  if ! $dryrun; then
+    "$@"
+  fi
+}
 
 check-idle() {
   type -p xprintidle &>/dev/null || return 0
@@ -39,7 +44,7 @@ check-idle() {
 
 usage() {
   cat <<EOF
-Usage: ${0##*/} args
+Usage: ${0##*/} [ARGS]
 Do btrfs maintence or stop if xprintidle shows a user
 
 force  Run regardless of user idle status
@@ -56,6 +61,7 @@ EOF
 
 force=false
 check=false
+dryrun=false
 if [[ $1 ]]; then
   case $1 in
     check)
@@ -64,6 +70,9 @@ if [[ $1 ]]; then
     force)
       force=true
       ;;
+    dryrun)
+      dryrun=true
+      ;;
     *)
       echo "$0: error: unexpected arg" >&2
       usage 1
@@ -93,8 +102,12 @@ main() {
     fi
 
     if ! $idle; then
-      btrfs scrub cancel $mnt &>/dev/null ||:
-      continue
+      if $dryrun; then
+        echo "$0: not idle. if this wasnt a dry run, btrfs scrub cancel $mnt"
+      else
+        btrfs scrub cancel $mnt &>/dev/null ||:
+        continue
+      fi
     fi
     if $check; then
       continue
@@ -118,20 +131,31 @@ main() {
         e ionice -c 3 btrfs balance start -musage=$usage $mnt
       done
     fi
-    # e btrfs filesystem df $mnt
-    # e df -H $mnt
-    date=$(
-      btrfs scrub status $mnt | \
-        sed -rn 's/^\s*scrub started at (.*) and finished.*/\1/p'
-        )
+    date=
+    scrub_status=$(btrfs scrub status $mnt)
+    if printf "%s\n" "$scrub_status" | grep -i '^status:[[:space:]]*finished$' &>/dev/null; then
+      date=$(printf "%s\n" "$scrub_status" | sed -rn 's/^Scrub started:[[:space:]]*(.*)/\1/p')
+    fi
+    if [[ ! $date ]]; then
+      # output from older versions, at least btrfs v4.15.1
+      date=$(
+        printf "%s\n" "$scrub_status" | \
+          sed -rn 's/^\s*scrub started at (.*) and finished.*/\1/p'
+          )
+    fi
     if [[ $date ]]; then
+      if $dryrun; then
+        echo "$0: last scrub finish for $mnt: $date"
+      fi
       date=$(date --date="$date" +%s)
       # if date is sooner than 90 days ago
       # the wiki recommends 30 days or so, but
       # it makes the comp lag like shit for a day,
       # so I'm going with 90 days.
       if (( date > $(date +%s) - 60*60*24*30 )); then
-        echo "cron: skiping scrub of $mnt"
+        if $dryrun; then
+          echo "$0: skiping scrub of $mnt, last was $(( ($(date +%s) - date) / 60/60/24 )) days ago, < 30 days"
+        fi
         continue
       fi
     fi