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.
87 lines
3.3 KiB
Bash
Executable File
87 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# cloudpex/install.sh — installe la commande `cloudpex` (montage à la demande d'un
|
|
# partage SMB, voir README.md) telle qu'elle est déployée ici :
|
|
# /usr/local/bin/cloudpex le script, root:root 0755
|
|
# /etc/cloudpex.conf hôte, partage, utilisateur SMB, point de montage,
|
|
# version SMB : demandés ici, root:root 0600
|
|
# cifs-utils installé si mount.cifs manque (apt-get)
|
|
# Réexécutable : réinstalle le script en place et propose de garder la config
|
|
# existante. Sans terminal (curl | bash), la config n'est ni créée ni modifiée.
|
|
# Ne monte rien, ne stocke aucun mot de passe.
|
|
# Usage : ./cloudpex/install.sh (appelé aussi par ../install.sh sur Linux)
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
TARGET=/usr/local/bin/cloudpex
|
|
CONF=/etc/cloudpex.conf
|
|
|
|
die() { echo "Erreur : $*" >&2; exit 1; }
|
|
|
|
# Saisie validée : ask VAR "libellé" "défaut" "regex autorisée". Redemande tant
|
|
# que la valeur ne correspond pas ; la valeur vide prend le défaut.
|
|
ask() {
|
|
local value
|
|
while :; do
|
|
read -rp "$2${3:+ [$3]} : " value || die "saisie interrompue"
|
|
value="${value:-$3}"
|
|
[[ $value =~ ^$4$ ]] && break
|
|
echo " valeur invalide, format attendu : $4" >&2
|
|
done
|
|
printf -v "$1" '%s' "$value"
|
|
}
|
|
|
|
# Demande les cinq valeurs propres au site et les écrit dans $CONF (root, 0600).
|
|
# Les formats refusent ce qui casserait la ligne d'options de mount.cifs
|
|
# (virgule, espace, guillemet) ; seul le nom de partage admet des espaces.
|
|
write_conf() {
|
|
local host share user mnt vers tmp
|
|
ask host "Hôte du NAS (IP ou nom)" "" '[A-Za-z0-9.-]+'
|
|
ask share "Nom du partage SMB" "" '[A-Za-z0-9._ -]+'
|
|
ask user "Utilisateur SMB" "" '[A-Za-z0-9._-]+'
|
|
ask mnt "Point de montage" "/mnt/cloudpex" '/[A-Za-z0-9._/-]+'
|
|
ask vers "Version SMB" "3.0" '[0-9]+(\.[0-9]+)*'
|
|
tmp="$(mktemp)"
|
|
printf 'HOST=%s\nSHARE=%s\nSMB_USER=%s\nMNT=%s\nSMB_VERS=%s\n' \
|
|
"$host" "$share" "$user" "$mnt" "$vers" > "$tmp"
|
|
sudo install -m 0600 -o root -g root "$tmp" "$CONF"
|
|
rm -f "$tmp"
|
|
}
|
|
|
|
# Config : créée au clavier, ou gardée si elle existe déjà (répondre n pour la
|
|
# refaire). Sans terminal, rien n'est demandé.
|
|
configure() {
|
|
local keep=""
|
|
if [ ! -t 0 ]; then
|
|
[ -f "$CONF" ] || echo "Pas de terminal : $CONF non créé, relance ./cloudpex/install.sh depuis un terminal" >&2
|
|
return 0
|
|
fi
|
|
if [ -f "$CONF" ]; then
|
|
echo "Configuration existante ($CONF) :"
|
|
sudo sed 's/^/ /' "$CONF"
|
|
read -rp "La garder ? [Y/n] " keep || true
|
|
case "$keep" in
|
|
[nN]*) write_conf ;;
|
|
esac
|
|
else
|
|
write_conf
|
|
fi
|
|
}
|
|
|
|
# Le point de montage déclaré dans la config, créé vide s'il manque.
|
|
ensure_mountpoint() {
|
|
local mnt
|
|
[ -f "$CONF" ] || return 0
|
|
mnt="$(sudo sed -n 's/^MNT=//p' "$CONF" | head -n 1)"
|
|
[ -n "$mnt" ] && sudo install -d -m 0755 "$mnt"
|
|
}
|
|
|
|
if ! command -v mount.cifs >/dev/null 2>&1; then
|
|
command -v apt-get >/dev/null 2>&1 || die "mount.cifs absent et apt-get introuvable : installe cifs-utils à la main"
|
|
sudo apt-get install -y cifs-utils
|
|
fi
|
|
|
|
sudo install -m 0755 -o root -g root "$SCRIPT_DIR/cloudpex" "$TARGET"
|
|
configure
|
|
ensure_mountpoint
|
|
echo "cloudpex installé : $TARGET (monter : cloudpex · état : cloudpex -s · démonter : cloudpex -u)"
|