lots of fixes, new music stuff
[distro-setup] / mount-latest-subvol
index 894ece520546cf9b099072ba00327df8b12ea5b0..7a179c4fd604480b50af48136d81990a25cef69b 100644 (file)
@@ -28,8 +28,8 @@ Usage: ${0##*/} [OPTIONS]
 -v|--verbose  Be more verbose
 
 
-Note, at source location, intentionally not executable, run and read
-install-my-scripts.
+Note: In git this is not not executable because it's meant to be installed
+using ./install-my-scripts
 
 Note: Uses util-linux getopt option parsing: spaces between args and
 options, short options can be combined, options before args.
@@ -37,6 +37,8 @@ EOF
   exit $1
 }
 
+all_vols=(q a o i ar qr)
+
 
 tu() {
   while read -r line; do
@@ -132,6 +134,7 @@ umount-kill() {
 }
 
 # duplicated in check-subvol
+# Reassign $1 var from /dev/dm- to corresponding /dev/mapper/
 mapper-dev() {
   local mapdev
   local -n devref=$1
@@ -185,8 +188,15 @@ if [[ -e /mnt/root/root2-fstab ]]; then
   mnt /mnt/boot2
 fi
 
+do_o=true
 root_dev=$(awk '$2 == "/" {print $1}' /etc/mtab)
 mapper-dev root_dev
+o_dev=$(awk '$2 == "/mnt/o" {print $1}' /etc/mtab)
+mapper-dev o_dev
+
+if [[ $o_dev == "$root_dev" ]]; then
+  do_o=false
+fi
 
 # root2_dev=$(awk '$2 == "/mnt/root2" {print $1}' /etc/mtab)
 # mapper-dev root2_dev
@@ -198,6 +208,7 @@ if cryptsetup status $root_dev &>/dev/null; then
   crypt_dev=$root_dev
 else # if we are in a recovery boot, find the next best crypt device
   mopts=,noauto
+  do_o=false
   for dev in $(dmsetup ls --target crypt | awk '{print $1}'); do
     dev=/dev/mapper/$dev
     if awk '{print $1}' /etc/mtab | grep -Fx $dev &>/dev/null; then
@@ -232,21 +243,31 @@ $crypt_dev  /q  btrfs  noatime,subvol=q,gid=1000$mopts  0 0
 EOF
 fi
 
-f=(/mnt/root/btrbk/o.*); f=${f[0]}
+f=(/mnt/root/btrbk/qr.*); f=${f[0]}
 if [[ -e $f ]]; then
   fstab <<EOF
-$crypt_dev  /o  btrfs  noatime,subvol=o$mopts  0 0
-/o/m  /m  none  bind$mopts  0 0
+$crypt_dev  /qr  btrfs  noatime,subvol=qr$mopts  0 0
 EOF
 fi
 
-if [[ $HOSTNAME == frodo ]]; then
+f=(/mnt/root/btrbk/ar.*); f=${f[0]}
+if [[ -e $f ]]; then
   fstab <<EOF
-$crypt_dev  /i  btrfs  noatime,subvol=i$mopts  0 0
+$crypt_dev  /ar  btrfs  noatime,subvol=ar,uid=1000,gid=1000$mopts  0 0
 EOF
 fi
 
 
+f=(/mnt/o/btrbk/o.*); f=${f[0]}
+if [[ -e $f ]]; then
+  fstab <<EOF
+$o_dev  /o  btrfs  noatime,subvol=o$mopts  0 0
+/o/m  /m  none  bind$mopts  0 0
+EOF
+else
+  do_o=false
+fi
+
 
 ##### end setup fstab for subvols we care about ######
 
@@ -264,7 +285,7 @@ while [[ ${my_pids[-1]} != 1 && ${my_pids[-1]} != ${my_pids[-2]} && $count -lt $
 done
 ### end get pids that this program depends on so we dont kill them
 
-for vol in q a o i; do
+for vol in ${all_vols[@]}; do
   d=/$vol
   if ! awk '{print $2}' /etc/fstab | grep -xF $d &>/dev/null; then
     continue
@@ -308,10 +329,11 @@ for vol in q a o i; do
     continue
   fi
 
-  if [[ $vol == q ]]; then
-    # allow to fail, user might not be logged in
-    x sudo -u $(id -nu 1000) XDG_RUNTIME_DIR=/run/user/1000 systemctl --user stop arbtt ||:
-  fi
+  ## not using arbtt at the moment
+  # if [[ $vol == q ]]; then
+  #   ## allow to fail, user might not be logged in
+  #   x sudo -u $(id -nu 1000) XDG_RUNTIME_DIR=/run/user/1000 systemctl --user stop arbtt ||:
+  # fi
   umount_ret=true
   unmounted=()
   for dir in $(echo $d ${binds[*]}\ |tac -s\ ); do
@@ -360,47 +382,27 @@ for vol in q a o i; do
     m btrfs property set -ts $leaf ro true
 
     ### begin check if leaf is different, delete it if not ###
-    if [[ -e /a/opt/btrfs-snapshots-diff/btrfs-snapshots-diff.py ]]; then
-      source /a/bin/distro-functions/src/package-manager-abstractions
-      #pi python-jmespath # dependency of btrfs-snapshots-diff
-      # todo: need python3 port of btrfs-snapshots-diff, py2 no exist on nabia
-      parentid=$(btrfs sub show $leaf | awk '$1 == "Parent" && $2 == "UUID:" {print $3}')
-      bsubs=(/mnt/root/btrbk/$vol.*)
-      bsub=
-      # go in reverse order as its more likely to be at the end
-      for ((i=${#bsubs[@]}-1; i>=0; i--)); do
-        if [[ $parentid == $(btrfs sub show ${bsubs[i]} | awk '$1 == "UUID:" {print $2}') ]]; then
-          bsub=${bsubs[i]}
-          break
-        fi
-      done
-      if [[ $bsub ]]; then
-        tmp=$(mktemp)
-        # in testing, same subvol is 136 bytes. allow some overhead. 32 happens sometimes under systemd.
-        # $ errno 32
-        # EPIPE 32 Broken pipe
-        btrfs send --no-data -p $bsub $leaf | head -c 1000 > $tmp || [[ $? == 141 || ${PIPESTATUS[0]} == 32 ]]
-        if (( $(stat -c%s $tmp) < 1000)); then
-          # example output for an empty diff:
-          # Found a valid Btrfs stream header, version 1
-          # o.leaf.2019-05-15T14:00:50-0400;snapshot: uuid=ba045ea30737dd449003f1ee40ec12d0, ctrasid=109533, clone_uuid=3c7e3544e486834aa71d89e5b8f30056, clone_ctransid=109533
-          lines=$(/a/opt/btrfs-snapshots-diff/btrfs-snapshots-diff.py -s -f $tmp | \
-                    grep -vxF "Found a valid Btrfs stream header, version 1" | \
-                    grep -cv "^[^;]*;snapshot: ") ||:
-          if [[ $lines == 0 ]]; then
-            # rotate in case we find a bug, weve got 2 old ones
-            tmpleaf=($vol.tmpleaf2.*)
-            if (( ${#tmpleaf[@]} )); then
-              x btrfs sub del ${tmpleaf[@]}
-            fi
-            tmpleaf=($vol.tmpleaf1.*)
-            if (( ${#tmpleaf[@]} )); then
-              x mv ${tmpleaf[0]} $vol.tmpleaf2.${tmpleaf[0]#$vol.tmpleaf1.}
-            fi
-            echo suspected identical: $bsub $leaf
-            x mv $leaf $vol.tmpleaf1.${leaf#$vol.leaf.}
-          fi
-        fi
+    parentid=$(btrfs sub show $leaf | awk '$1 == "Parent" && $2 == "UUID:" {print $3}')
+    bsubs=(btrbk/$vol.*)
+    bsub= # base subvolume
+    # go in reverse order as its more likely to be at the end
+    for ((i=${#bsubs[@]}-1; i>=0; i--)); do
+      if [[ $parentid == $(btrfs sub show ${bsubs[i]} | awk '$1 == "UUID:" {print $2}') ]]; then
+        bsub=${bsubs[i]}
+        break
+      fi
+    done
+    if [[ $bsub ]]; then
+      tmp=$(mktemp)
+      # in testing, same subvol is 136 bytes. allow some overhead. 32 happens sometimes under systemd.
+      # $ errno 32
+      # EPIPE 32 Broken pipe
+      lines=$(btrfs send --no-data -p $bsub $leaf | btrfs receive --dump | head -n 100 | wc -l || [[ $? == 141 || ${PIPESTATUS[0]} == 32 ]])
+      if [[ $lines == 0 ]]; then
+        # example output of no differences:
+        # snapshot        ./qrtest                        uuid=c41ff6b7-0527-f34d-95ac-190eecf54ff5 transid=2239 parent_uuid=64949e1b-4a3e-3945-9a8e-cd7b7c15d7d6 parent_transid=2239
+        echo suspected identical: $bsub $leaf
+        x btrfs sub del $leaf
       fi
     fi
     ### end check if leaf is different, delete it if not ###
@@ -408,8 +410,8 @@ for vol in q a o i; do
     ## begin expire leaf vols ##
     leaf_vols=($vol.leaf.*)
     count=${#leaf_vols[@]}
-    leaf_limit_time=$(( $(date +%s) - 60*60*24*60 )) # 60 days
-    leaf_new_limit_time=$(( $(date +%s) - 60*60*24 )) # 1 day
+    leaf_limit_time=$(( EPOCHSECONDS - 60*60*24*60 )) # 60 days
+    leaf_new_limit_time=$(( EPOCHSECONDS - 60*60*24 )) # 1 day
     # this goes backwards from oldest. leaf_new_limit_time is just in case
     # the order gets screwed up or something.
     for leaf in ${leaf_vols[@]}; do
@@ -430,17 +432,20 @@ for vol in q a o i; do
   for dir in $d ${binds[@]}; do
     m mnt $dir
   done
-  if [[ $vol == q ]]; then
-    # maybe this will fail if X is not running
-    x sudo -u $(id -nu 1000) XDG_RUNTIME_DIR=/run/user/1000 systemctl --user start arbtt ||:
-  fi
+
+  ## arbtt disabled for now
+  # if [[ $vol == q ]]; then
+  #   # maybe this will fail if X is not running
+  #   x sudo -u $(id -nu 1000) XDG_RUNTIME_DIR=/run/user/1000 systemctl --user start arbtt ||:
+  # fi
+
   stale_dir=/nocow/btrfs-stale
   rm -f $stale_dir/$d
 done
 
 
 
-for dir in /mnt/r7/amy/{root,boot}_ubuntubionic /mnt/{root2/root,boot2/boot}_ubuntubionic; do
+for dir in /mnt/r7/amy/{root/root,boot/boot}_ubuntubionic /mnt/{root2/root,boot2/boot}_ubuntubionic; do
   vol=${dir##*/}
   root_dir=${dir%/*}
   if [[ ! -d $root_dir ]]; then