lots o fixes, beets, shellcheck stuff
[distro-setup] / mount-latest-subvol
index 7a179c4fd604480b50af48136d81990a25cef69b..688e4f1b6d512209c5d892e9add1fe5f1d901e8c 100644 (file)
@@ -21,7 +21,7 @@ source /usr/local/lib/err
 
 usage() {
   cat <<EOF
-Usage: ${0##*/} [OPTIONS]
+Usage: ${0##*/} [OPTIONS] [SUBVOLUMES]
 
 -h|--help  Print help and exit.
 -f|--force  Use kill -9 to try fixing unmount errors
@@ -37,7 +37,6 @@ EOF
   exit $1
 }
 
-all_vols=(q a o i ar qr)
 
 
 tu() {
@@ -168,6 +167,12 @@ while true; do
   shift
 done
 
+if (( $# )); then
+  all_vols=( "$@" )
+else
+  all_vols=(q a o i ar qr)
+fi
+
 ##### end command line parsing ########
 
 ret=0
@@ -188,15 +193,11 @@ 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
@@ -208,7 +209,8 @@ 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
+  # todo: I think I had an idea to not setup /o in this case,
+  # but never finished implementing it
   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
@@ -221,7 +223,7 @@ fi
 
 
 # dont tax the cpus of old laptops
-if ((`nproc` > 2)); then
+if (( $(nproc) > 2)); then
   mopts+=,compress=zstd
 fi
 
@@ -235,7 +237,7 @@ shopt -s nullglob
 # ownership, and ssh doesn\'t allow any group writable parent
 # directories, so we are forced to use a directory structure similar
 # to home directories
-f=(/mnt/root/btrbk/q.*); f=${f[0]}
+fa=(/mnt/root/btrbk/q.*); f=${fa[0]}
 if [[ -e $f ]]; then
   fstab <<EOF
 $crypt_dev  /q  btrfs  noatime,subvol=q,gid=1000$mopts  0 0
@@ -243,14 +245,14 @@ $crypt_dev  /q  btrfs  noatime,subvol=q,gid=1000$mopts  0 0
 EOF
 fi
 
-f=(/mnt/root/btrbk/qr.*); f=${f[0]}
+fa=(/mnt/root/btrbk/qr.*); f=${fa[0]}
 if [[ -e $f ]]; then
   fstab <<EOF
 $crypt_dev  /qr  btrfs  noatime,subvol=qr$mopts  0 0
 EOF
 fi
 
-f=(/mnt/root/btrbk/ar.*); f=${f[0]}
+fa=(/mnt/root/btrbk/ar.*); f=${fa[0]}
 if [[ -e $f ]]; then
   fstab <<EOF
 $crypt_dev  /ar  btrfs  noatime,subvol=ar,uid=1000,gid=1000$mopts  0 0
@@ -258,14 +260,16 @@ EOF
 fi
 
 
-f=(/mnt/o/btrbk/o.*); f=${f[0]}
+fa=(/mnt/o/btrbk/o.*); f=${fa[0]}
 if [[ -e $f ]]; then
-  fstab <<EOF
+  if [[ $o_dev != "$root_dev" ]]; then
+    fstab <<EOF
 $o_dev  /o  btrfs  noatime,subvol=o$mopts  0 0
+EOF
+  fi
+  fstab <<EOF
 /o/m  /m  none  bind$mopts  0 0
 EOF
-else
-  do_o=false
 fi
 
 
@@ -275,7 +279,7 @@ fi
 my_pids=($$ $PPID)
 loop_limit=30
 count=0
-while [[ ${my_pids[-1]} != 1 && ${my_pids[-1]} != ${my_pids[-2]} && $count -lt $loop_limit  ]]; do
+while [[ ${my_pids[-1]} != 1 && ${my_pids[-1]} != "${my_pids[-2]}" && $count -lt $loop_limit  ]]; do
   count=$((count + 1))
   p=$(ps -p ${my_pids[-1]} -o ppid=)
   if [[ $p == 0 || ! $p ]]; then
@@ -287,7 +291,7 @@ done
 
 for vol in ${all_vols[@]}; do
   d=/$vol
-  if ! awk '{print $2}' /etc/fstab | grep -xF $d &>/dev/null; then
+  if ! awk '$3 == "btrfs" {print $2}' /etc/fstab | grep -xF $d &>/dev/null; then
     continue
   fi
 
@@ -320,7 +324,7 @@ for vol in ${all_vols[@]}; do
     for b in ${binds[@]}; do
       if mountpoint -q $b; then
         bid=$(stat -c%d $b)
-        if [[ $did != $bid ]]; then
+        if [[ $did != "$bid" ]]; then
           umount-kill $b
         fi
       fi
@@ -393,7 +397,6 @@ for vol in ${all_vols[@]}; do
       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
@@ -415,7 +418,7 @@ for vol in ${all_vols[@]}; do
     # 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
-      leaf_time=$(date -d ${leaf#$vol.leaf.} +%s)
+      leaf_time=$(date -d ${leaf#"$vol".leaf.} +%s)
       if (( leaf_limit_time > leaf_time || ( leaf_new_limit_time > leaf_time && count > 15 ) )); then
         x btrfs sub del $leaf
       fi