host info updates
[distro-setup] / mount-latest-subvol
index 3844e7279e488d33d8f479820650a9c4c2bb895a..433c7c2a06c4ed7c2a465476d1670ac375a3b514 100644 (file)
@@ -1,24 +1,30 @@
 #!/bin/bash
-# Copyright (C) 2016 Ian Kelling
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
+
+# On Ian's computers, mount received subvolumes after btrbk.
+# Copyright (C) 2024  Ian Kelling
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# SPDX-License-Identifier: GPL-3.0-or-later
 
 this_file="$(readlink -f -- "${BASH_SOURCE[0]}")"
 readonly this_file
 cd /
 [[ $EUID == 0 ]] || exec sudo -E "$this_file" "$@"
 
-source /usr/local/lib/err
+set -e; . /usr/local/lib/bash-bear; set +e
+shopt -s nullglob
 
 usage() {
   cat <<EOF
@@ -38,7 +44,7 @@ EOF
   exit $1
 }
 
-
+pre="mount-latest-subvol:${SSH_CLIENT:+ $HOSTNAME:}"
 
 tu() {
   while read -r line; do
@@ -48,17 +54,17 @@ tu() {
 }
 d() {
   if $verbose; then
-    printf "%s\n" "$*"
+    printf "$pre %s\n" "$*"
   fi
 }
 m() {
   if $verbose; then
-    printf "%s\n" "$*"
+    printf "$pre %s\n" "$*"
   fi
   "$@"
 }
 x() {
-  printf "%s\n" "$*"
+  printf "$pre %s\n" "$*"
   "$@"
 }
 
@@ -171,7 +177,11 @@ done
 if (( $# )); then
   all_vols=( "$@" )
 else
-  all_vols=(q a o i ar qd qr)
+  all_vols=(q a o i qd qr)
+  ar_snaps=(/mnt/root/btrbk/ar.*)
+  if [[ -e /mnt/root/ar ]] || (( ${#ar_snaps[@]} > 0 )); then
+    all_vols+=(ar)
+  fi
 fi
 
 ##### end command line parsing ########
@@ -232,7 +242,6 @@ fstab <<EOF
 $crypt_dev  /a  btrfs  noatime,subvol=a$mopts  0 0
 EOF
 
-shopt -s nullglob
 
 # ssh and probably some other things care about parent directory
 # ownership, and ssh doesn\'t allow any group writable parent
@@ -241,8 +250,8 @@ shopt -s nullglob
 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
-$crypt_dev  /qd  btrfs  noatime,subvol=qd,gid=1000$mopts  0 0
+$crypt_dev  /q  btrfs  noatime,subvol=q$mopts  0 0
+$crypt_dev  /qd  btrfs  noatime,subvol=qd$mopts  0 0
 /q/p  /p  none  bind$mopts  0 0
 EOF
 fi
@@ -254,23 +263,27 @@ $crypt_dev  /qr  btrfs  noatime,subvol=qr$mopts  0 0
 EOF
 fi
 
-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
-EOF
-fi
+# not syncing ar at the moment
+# fa=(/mnt/root/btrbk/ar.*); f=${fa[0]}
+# if [[ -e $f ]]; then
+#   fstab <<EOF
+# $crypt_dev  /ar  btrfs  noatime,subvol=ar$mopts  0 0
+# EOF
+# fi
 
 
 fa=(/mnt/o/btrbk/o.*); f=${fa[0]}
 if [[ -e $f ]]; then
   if [[ $o_dev != "$root_dev" ]]; then
+    # ,compress=zstd regardless of mopts since these are all text files
+    # and it cuts disk use by about half.
     fstab <<EOF
-$o_dev  /o  btrfs  noatime,subvol=o$mopts  0 0
+$o_dev  /o  btrfs  noatime,subvol=o${mopts/,compress=zstd/},compress=zstd  0 0
 EOF
   fi
   fstab <<EOF
 /o/m  /m  none  bind$mopts  0 0
+/o/debbugs  /debbugs  none  bind$mopts  0 0
 EOF
 fi
 
@@ -317,6 +330,7 @@ for vol in ${all_vols[@]}; do
   ##### end building up list of bind mounts  ######
 
 
+
   # if latest is already mounted, make sure binds are mounted and move on
   m check-subvol-stale $d
   # populated by check-subvol-stale if stale
@@ -335,6 +349,28 @@ for vol in ${all_vols[@]}; do
     continue
   fi
 
+
+  ##### begin checking for loopback mounts ####
+  found_loop=false
+  for l in $(losetup -ln|awk '{print $6}'); do
+    for dir in $d ${binds[@]}; do
+      if [[ $l == $dir* ]]; then
+        echo "$0: found loopback mount $l. giving up on unmounting $dir"
+        ret=1
+        found_loop=true
+        break
+      fi
+    done
+    if $found_loop; then
+      break
+    fi
+  done
+  if $found_loop; then
+    continue
+  fi
+  ##### end end checking loopback mounts ####
+
+
   ## not using arbtt at the moment
   # if [[ $vol == q ]]; then
   #   ## allow to fail, user might not be logged in
@@ -477,7 +513,7 @@ for dir in /mnt/r7/amy/{root/root,boot/boot}_ubuntubionic /mnt/{root2/root,boot2
   rm -f /nocow/btrfs-stale/$vol
 done
 
-if (( $ret )); then
+if (( ret >= 1 )); then
   echo "$0: exit status $ret. see error above"
 fi
 exit $ret