Files
Linux_post_install/bin/pos-system-nfs-client
T

139 lines
4.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# POS: system nfs-client — Mount NFS shares (ephemeral or persistent systemd mount units)
source "$(dirname "$0")/../lib/common.sh" 2>/dev/null || source "$(dirname "$0")/common.sh"
source "$(dirname "$0")/../lib/notify.sh" 2>/dev/null || source "$(dirname "$0")/notify.sh"
command -v mount.nfs &>/dev/null || err "mount.nfs not found (install nfs-common)"
command -v systemd-escape &>/dev/null || err "systemd-escape not found"
usage() {
cat <<EOF
Usage: pos system nfs-client <command> [args]
Mount and manage NFS shares from remote servers (nfs-common).
Commands:
mount <server:export> <local-dir> One-shot mount (creates local-dir if needed)
unmount <local-dir> Unmount the share
list Show active NFS mounts
persist <server:export> <local-dir> Persistent mount via a systemd .mount unit
(ordered after network-online.target)
unpersist <local-dir> Stop, disable and remove the mount unit
Examples:
pos system nfs-client mount 100.100.100.1:/srv/media /mnt/nfs/media
pos system nfs-client persist 100.100.100.1:/srv/media /mnt/nfs/media
pos system nfs-client list
pos system nfs-client unmount /mnt/nfs/media
EOF
exit 0
}
cmd="${1:-}"
case "$cmd" in
-h|--help) usage ;;
mount|unmount|list|persist|unpersist) ;;
"") err "Missing command (mount|unmount|list|persist|unpersist)" ;;
*) err "Unknown command '$cmd' (see --help)" ;;
esac
validate_share() {
local what="$1"
case "$what" in
/*) err "Invalid share '$what' — expected <server:export> (e.g. 10.0.0.5:/srv/data)" ;;
*:*) ;;
*) err "Invalid share '$what' — expected <server:export> (e.g. 10.0.0.5:/srv/data)" ;;
esac
}
validate_dir() {
local where="$1"
case "$where" in
/*) ;;
*) err "Mount point must be an absolute path: $where" ;;
esac
}
case "$cmd" in
mount)
what="${2:-}"
where="${3:-}"
[ -n "$what" ] && [ -n "$where" ] || err "Usage: pos system nfs-client mount <server:export> <local-dir>"
validate_share "$what"
validate_dir "$where"
sudo mkdir -p "$where"
sudo mount -t nfs -o rw,noatime "$what" "$where"
log "Mounted $what at $where"
;;
unmount)
where="${2:-}"
[ -n "$where" ] || err "Usage: pos system nfs-client unmount <local-dir>"
validate_dir "$where"
sudo umount "$where"
log "Unmounted $where"
;;
list)
if findmnt -t nfs,nfs4 >/dev/null 2>&1; then
findmnt -t nfs,nfs4
else
echo "No NFS mounts"
fi
;;
persist)
what="${2:-}"
where="${3:-}"
[ -n "$what" ] && [ -n "$where" ] || err "Usage: pos system nfs-client persist <server:export> <local-dir>"
validate_share "$what"
validate_dir "$where"
unit="$(systemd-escape --path --suffix=mount "$where")"
unit_file="/etc/systemd/system/${unit}"
sudo mkdir -p "$where"
cat <<UNIT | sudo tee "$unit_file" >/dev/null
[Unit]
Description=NFS mount of ${what} at ${where}
After=network-online.target
Wants=network-online.target
[Mount]
What=${what}
Where=${where}
Type=nfs
Options=defaults,_netdev,rw,noatime
UNIT
sudo systemctl daemon-reload
sudo systemctl enable --now "$unit"
log "Persistent NFS mount: ${what}${where} (${unit})"
notify_send "NFS mount persisted: ${what}${where}"
;;
unpersist)
where="${2:-}"
[ -n "$where" ] || err "Usage: pos system nfs-client unpersist <local-dir>"
validate_dir "$where"
unit="$(systemd-escape --path --suffix=mount "$where")"
unit_file="/etc/systemd/system/${unit}"
if [ ! -f "$unit_file" ]; then
warn "No systemd mount unit for $where (${unit})"
exit 0
fi
sudo systemctl disable "$unit" 2>/dev/null || true
sudo systemctl stop "$unit" 2>/dev/null || true
sudo rm -f "$unit_file"
sudo systemctl daemon-reload
log "Removed persistent NFS mount: $where"
notify_send "NFS persistent mount removed: $where"
;;
esac