98 lines
2.6 KiB
Bash
98 lines
2.6 KiB
Bash
#! /bin/bash
|
|
#
|
|
# nfs - start NFS in response to interface change
|
|
#
|
|
# Bastian Senst <bholst@lusku.de>
|
|
|
|
function net_umount {
|
|
umount -l -f $1 &>/dev/null
|
|
}
|
|
|
|
function net_mount {
|
|
mountpoint -q $1 || mount $1
|
|
}
|
|
|
|
function test_reach {
|
|
if [ "$(ip link show up $1)" = "" ]; then
|
|
return 1
|
|
else
|
|
ping -n -c1 -w2 -I "$1" "$2" 2>&1 > /dev/null
|
|
fi
|
|
}
|
|
|
|
DEVICE="$1"
|
|
COMMAND="$2"
|
|
|
|
function test_other_reaches {
|
|
for other in $(ls /sys/class/net); do
|
|
if [[ "$other" != "$DEVICE" ]]; then
|
|
if test_reach "$other" "$1"; then
|
|
return 0
|
|
fi
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
declare -A reaches
|
|
|
|
function other_reaches {
|
|
if [[ "${reaches[$1]-}" == "yes" ]]; then
|
|
return 0
|
|
elif [[ "${reaches[$1]-}" == "no" ]]; then
|
|
return 1
|
|
else
|
|
if test_other_reaches $1; then
|
|
reaches[$1]="yes"
|
|
return 0
|
|
else
|
|
reaches[$1]="no"
|
|
return 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
NET_MOUNTS=$(sed -e '/^.*#/d' -e '/^.*:/!d' -e 's/\t/ /g' -e '/x-systemd.automount/d' /etc/fstab | tr -s " ")$'\n'
|
|
|
|
case "$COMMAND" in
|
|
up|dhcp4-change|dhcp6-change)
|
|
# Check with systemd if nfs service is enabled
|
|
if /usr/bin/systemctl is-enabled nfs-client.target >/dev/null 2>&1; then
|
|
printf %s "$NET_MOUNTS" | while IFS= read -r line; do
|
|
MOUNT_OPTIONS=$(echo $line | cut -f4 -d" ")
|
|
MOUNT_POINT=$(echo $line | cut -f2 -d" ")
|
|
FS_TYPE=$(echo $line | cut -f3 -d" ")
|
|
# Only mount it if not "noauto "set in options
|
|
case ",${MOUNT_OPTIONS}," in
|
|
*,noauto,*) continue ;;
|
|
esac
|
|
# Only mount it when the type is nfs or nfs4
|
|
if [ "$FS_TYPE" == "nfs" -o "$FS_TYPE" == "nfs4" ]; then
|
|
net_mount "$MOUNT_POINT"
|
|
fi
|
|
done
|
|
fi
|
|
;;
|
|
pre-down|down|vpn-pre-down)
|
|
printf %s "$NET_MOUNTS" | while IFS= read -r line; do
|
|
[[ $line ]] || continue
|
|
MOUNT_POINT=$(echo $line | cut -f2 -d" ")
|
|
FS_TYPE=$(echo $line | cut -f3 -d" ")
|
|
HOST=$(echo $line | cut -f1 -d":")
|
|
if other_reaches $HOST; then
|
|
echo >&2 "Other network interfaces reach $HOST for $MOUNT_POINT."
|
|
else
|
|
# Only unmount it when the type is nfs or nfs4
|
|
if [ "$FS_TYPE" == "nfs" -o "$FS_TYPE" == "nfs4" ]; then
|
|
net_umount "$MOUNT_POINT"
|
|
fi
|
|
fi
|
|
done
|
|
exit 0
|
|
;;
|
|
*)
|
|
exit 0
|
|
;;
|
|
esac
|
|
|