shell-base/modules/utility/bindfs.lib

106 lines
2.6 KiB
Bash

#!/bin/bash
if ! which fusermount &> /dev/null; then
echo unabled to load bindfs module because bindfs is not installed
exit 1
fi
# echo loading bindfs
export BFS_MOUNT_DIR=${BFS_MOUNT_DIR:-/mnt/bfs}
if [ -v PS1 ]; then
alias rbfsu="dir_rebind_user"
alias rbfs="dir_rebind"
alias bfsu="dir_bind_user"
alias bfs="dir_bind"
alias bfsum="dir_bind_unmount"
alias bfse="bfs_vscode"
sudo mkdir $BFS_MOUNT_DIR 2> /dev/null
sudo chown $USER:$USER $BFS_MOUNT_DIR
fi
mounted () {
mountpoint "$1" &> /dev/null && echo yes || return 1
}
dir_bind_unmount () {
local usesudo
local mp=${1:-$PWD}
[[ ! $(mounted $mp) ]] && echo no mountpoint at $mp && mp=$BFS_MOUNT_DIR/$(basename $mp)
[[ ! $(mounted $mp) ]] && echo no mountpoint at $mp either, aborting && return 1
[[ $EUID -ne 0 ]] && usesudo=sudo
if $usesudo fusermount -u $mp; then
echo unmounted $mp, removing empty mountpoint directory
rm -rf $mp
else
echo error, unable to unmount $mp
fi
}
dir_bind_user () {
local usesudo; local dir;local user;local group;local mp
if [ $# -lt 3 ]; then
echo "minimum 3 args needed to rebind <user? <source dir> <mountpoint>"
echo passed were $@
return 1
fi
[[ $EUID -ne 0 ]] && usesudo=sudo
[[ $(id -u $1 2> /dev/null) ]] || { echo user $1 does not exist can not continue; return 2; }
dir=$(realpath $2)
mp=$3
[[ $(mounted $mp) ]] && echo something already mounted at $mp, aborting && return 1
if ! $usesudo mkdir -p $mp; then echo unable to make mountpoint aborting; return 2; fi
$usesudo chown $1:$1 $mp
user=$(stat -c '%u' $dir)
group=$(stat -c '%g' $dir)
$usesudo bindfs --force-user=$1 --force-group=$1 --create-for-user=$user --create-for-group=$group --chown-ignore --chgrp-ignore $dir $mp
[[ $? -gt 0 ]] && echo error in call to bindfs
if [[ $(mounted $mp) ]]; then
echo $dir has been mounted at $mp for user $1
echo "to unmount use: dir_bind_unmount $mp or bfsum $mp"
else
echo unable to mount $dir at $mp as user $user
fi
}
dir_bind () {
dir=${1:-$PWD}
mp=${2:-$BFS_MOUNT_DIR/$(basename "$dir")}
dir_bind_user $USER $dir $mp
if [ -v PS1 ]; then
if [[ $BFSEDIT ]]; then /opt/bin/vscode $mp 1>/dev/null ; else xdg-open $mp; fi
echo $BFSEDIT
echo enter \"u\" to unmount, otherwise any other key will leave mounted
unset BFSEDIT
read -n1 ans
echo -e "\n"
[[ $ans == "u" ]] && dir_bind_unmount $mp
fi
}
dir_rebind () {
dir_bind_user $USER $1 $1
}
dir_rebind_user () {
dir_bind_user $1 $2 $2
}
bfs_vscode () {
BFSEDIT="When done editing FIRST close your vscode window then"
dir_bind "$@"
}
(return 0 2>/dev/null) || dir_bind_user $@