tons of misc updates
[distro-setup] / mount-latest-subvol
index d39b8823f89a1da652c035f320a513d1cf13dc45..186b9602dd72010b67a3da62a100717c932950fd 100644 (file)
@@ -81,6 +81,33 @@ fstab() {
         tu /etc/fstab <<<"$l"
     done
 }
+kill-dir() {
+    for sig; do
+        echo kill-dir $sig
+        found_pids=false
+        if pids=$(timeout 4 lsof -t $dir); then
+            found_pids=true
+            timeout 4 lsof -w $dir
+            kill -$sig $pids
+        fi
+        # fuser will find open sockets that lsof won't, for example from gpg-agent.
+        # note: -v shows kernel processes, which then doesn't return true when we want
+        if timeout 4 fuser -m $dir &>/dev/null; then
+            found_pids=true
+            fuser -$sig -mvk $dir
+        fi
+        sleep .5
+        if ! $found_pids; then
+            return 0
+        fi
+    done
+    return 1
+}
+
+force=false
+if [[ $1 == -f ]]; then
+    force=true
+fi
 
 ret=0
 
@@ -92,10 +119,14 @@ EOF
 
 shopt -s nullglob
 
+# ssh and probably some other things care about parent directory
+# 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.*)
 if [[ -e $f ]]; then
     fstab <<EOF
-$first_root_crypt  /q  btrfs  noatime,subvol=q  0 0
+$first_root_crypt  /q  btrfs  noatime,subvol=q,gid=1000  0 0
 /q/p  /p  none  bind  0 0
 EOF
 fi
@@ -163,18 +194,10 @@ for vol in q a o i; do
             if e umount -R $dir; then
                 unmounted+=($dir)
             else
-                if pids=$(timeout 4 lsof -t $dir); then
-                    timeout 4 lsof -w $dir
-                    kill $pids
-                fi
-
-                # fuser will find open sockets that lsof won't, for example from gpg-agent.
-                # note: -v shows kernel processes, which then doesn't return true when we want
-                if timeout 4 fuser -m $dir &>/dev/null; then
-                    fuser -TERM -mvk $dir
+                if ! kill-dir TERM TERM TERM INT INT HUP HUP; then
+                    if $force; then  kill-dir KILL; fi
                 fi
 
-                sleep .5
                 if e umount -R $dir; then
                     unmounted+=($dir)
                 else
@@ -197,7 +220,7 @@ for vol in q a o i; do
     # todo: decipher /mnt/root, like we do in check-subvol-stale
     cd /mnt/root
     if [[ -e $vol ]]; then
-        e mv $vol $vol.leaf.$(date +%Y%m%dT%H%M%S%z)
+        e mv $vol $vol.leaf.$(date +%Y-%m-%dT%H:%M:%S-%z)
     fi
     # Note, we make a few assumptions in this script, like
     # $d was not a different subvol id than $vol, and
@@ -211,7 +234,7 @@ for vol in q a o i; do
 done
 
 ### disabled
-if [[ $HOSTNAME == treetowlxxxxxxxxx ]]; then
+if [[ $HOSTNAME == kdxxxxxxxxx ]]; then
     # partitioned it with fai partitioner outside of fai,
     # because it\'s worth it to have 1% space reserved for boot and
     # swap partitions in case I ever want to boot off those drives.
@@ -240,7 +263,7 @@ if [[ $HOSTNAME == treetowlxxxxxxxxx ]]; then
 EOF
         fi
         tu /etc/crypttab <<EOF
-crypt_dev_$dev  /dev/disk/by-id/$dev  /q/root/luks/host-treetowl  discard,luks
+crypt_dev_$dev  /dev/disk/by-id/$dev  /q/root/luks/host-kd  discard,luks
 EOF
         if [[ ! -e /dev/mapper/crypt_dev_$dev ]]; then
             cryptdisks_start crypt_dev_$dev