cloudpex/cloudpex no longer carries the NAS host, share name, SMB user, mount point or SMB version. It reads /etc/cloudpex.conf (root:root 0600, KEY=value) line by line, never sources it, and dies with a hint when the file is missing, incomplete or has a relative mount point. cloudpex/install.sh prompts for the five values (regex-validated, re-asked on bad input so the main installer never aborts), shows and keeps an existing config unless answered n, and skips the config when no terminal is attached. README (FR) + root README + CLAUDE.md updated.
86 lines
2.9 KiB
Bash
86 lines
2.9 KiB
Bash
#!/usr/bin/env bash
|
|
# cloudpex — monte / démonte le partage SMB du NAS déclaré dans /etc/cloudpex.conf
|
|
# Usage : cloudpex -> monte (demande le mot de passe)
|
|
# cloudpex -u -> démonte
|
|
# cloudpex -s -> état
|
|
# Aucun credential n'est écrit sur disque ni passé en argument (invisible dans ps).
|
|
|
|
set -euo pipefail
|
|
|
|
CONF="/etc/cloudpex.conf"
|
|
|
|
# Re-lance le script en root si nécessaire (avant toute saisie du mot de passe,
|
|
# et avant de lire la config, lisible par root seulement)
|
|
if [[ $EUID -ne 0 ]]; then
|
|
exec sudo -- "$0" "$@"
|
|
fi
|
|
|
|
# Propriétaire des fichiers montés : l'utilisateur qui a lancé sudo, sinon 1000
|
|
OWNER_UID="${SUDO_UID:-1000}"
|
|
OWNER_GID="${SUDO_GID:-1000}"
|
|
|
|
die() { echo "Erreur : $*" >&2; exit 1; }
|
|
|
|
# Valeurs propres au site (hôte, partage, utilisateur, point de montage, version),
|
|
# écrites par cloudpex/install.sh au format CLÉ=valeur. Lues ligne à ligne,
|
|
# jamais sourcées : le fichier de config n'exécute rien.
|
|
conf_get() { sed -n "s/^$1=//p" "$CONF" | head -n 1; }
|
|
|
|
[[ -r $CONF ]] || die "config absente : $CONF (lance cloudpex/install.sh)"
|
|
HOST="$(conf_get HOST)"
|
|
SHARE_NAME="$(conf_get SHARE)"
|
|
SMB_USER="$(conf_get SMB_USER)"
|
|
MNT="$(conf_get MNT)"
|
|
SMB_VERS="$(conf_get SMB_VERS)"
|
|
[[ -n $HOST && -n $SHARE_NAME && -n $SMB_USER && -n $MNT && -n $SMB_VERS ]] \
|
|
|| die "config incomplète : $CONF (relance cloudpex/install.sh)"
|
|
[[ $MNT == /* ]] || die "MNT doit être un chemin absolu ($CONF)"
|
|
SHARE="//${HOST}/${SHARE_NAME}"
|
|
|
|
is_mounted() { mountpoint -q "$MNT"; }
|
|
|
|
do_status() {
|
|
if is_mounted; then
|
|
echo "Monté : $SHARE -> $MNT"
|
|
df -h "$MNT" | tail -n 1
|
|
else
|
|
echo "Non monté."
|
|
fi
|
|
}
|
|
|
|
do_umount() {
|
|
is_mounted || { echo "Déjà démonté."; return 0; }
|
|
umount "$MNT" || die "démontage impossible (fichiers ouverts ? voir : lsof +D $MNT)"
|
|
echo "Démonté : $MNT"
|
|
}
|
|
|
|
do_mount() {
|
|
command -v mount.cifs >/dev/null || die "cifs-utils absent (sudo apt install cifs-utils)"
|
|
is_mounted && { echo "Déjà monté : $MNT"; return 0; }
|
|
|
|
mkdir -p "$MNT"
|
|
|
|
local pass
|
|
read -rsp "Mot de passe SMB pour ${SMB_USER}@${SHARE} : " pass
|
|
echo
|
|
[[ -n "$pass" ]] || die "mot de passe vide"
|
|
|
|
# mount.cifs lit PASSWD dans l'environnement : pas d'exposition dans ps ni sur disque
|
|
if PASSWD="$pass" mount -t cifs "$SHARE" "$MNT" \
|
|
-o "username=${SMB_USER},uid=${OWNER_UID},gid=${OWNER_GID},iocharset=utf8,vers=${SMB_VERS},file_mode=0640,dir_mode=0750,nosuid,nodev,noexec"; then
|
|
unset pass
|
|
echo "Monté : $SHARE -> $MNT"
|
|
else
|
|
unset pass
|
|
die "échec du montage (mot de passe, réseau ou version SMB ; voir : dmesg | tail)"
|
|
fi
|
|
}
|
|
|
|
case "${1:-}" in
|
|
"") do_mount ;;
|
|
-u|-d|--umount|dc|disconnect|disable) do_umount ;;
|
|
-s|--status) do_status ;;
|
|
-h|--help) sed -n '2,6p' "$0" ;;
|
|
*) die "option inconnue : $1 (voir -h)" ;;
|
|
esac
|