feat(cloudpex): site values out of the script, prompted at install into /etc/cloudpex.conf
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.
This commit is contained in:
+73
-13
@@ -1,26 +1,86 @@
|
||||
#!/usr/bin/env bash
|
||||
# cloudpex/install.sh — installe la commande `cloudpex` (montage à la demande du
|
||||
# partage SMB CloudPex du NAS, voir README.md) telle qu'elle est déployée ici :
|
||||
# /usr/local/bin/cloudpex root:root 0755
|
||||
# /mnt/cloudpex point de montage (vide tant que rien n'est monté)
|
||||
# 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 en place. Ne monte rien, ne stocke aucun identifiant.
|
||||
# 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
|
||||
MNT=/mnt/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
|
||||
if command -v apt-get >/dev/null 2>&1; then
|
||||
sudo apt-get install -y cifs-utils
|
||||
else
|
||||
echo "mount.cifs absent et apt-get introuvable : installe cifs-utils à la main" >&2
|
||||
exit 1
|
||||
fi
|
||||
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"
|
||||
sudo install -d -m 0755 "$MNT"
|
||||
configure
|
||||
ensure_mountpoint
|
||||
echo "cloudpex installé : $TARGET (monter : cloudpex · état : cloudpex -s · démonter : cloudpex -u)"
|
||||
|
||||
Reference in New Issue
Block a user