#!/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
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 ########
$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
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
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
##### 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
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