Deux defauts vus au retour de l'update 7.4.1 : - le montage NFS du depot est noexec, donc la tache DSM qui appelait le chemin nu du script donnait « Permission denied » et ne chargeait rien. Commande corrigee en `sh <chemin>` (lit le script au lieu de l'executer). - la boucle faisait confiance au code retour de modprobe (0 sans charger sur DSM). Elle verifie maintenant l'etat reel via lsmod apres chaque tentative. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
61 lines
2.7 KiB
Bash
Executable File
61 lines
2.7 KiB
Bash
Executable File
#!/bin/sh
|
|
# Charge le pilote USB-serie sur le Synology .17 (ARCHIVE3, DS920+) et rend le
|
|
# port accessible au conteneur du releve. A LANCER EN ROOT.
|
|
#
|
|
# Pourquoi : DSM 7.3.2 embarque les modules (/lib/modules/usbserial.ko et
|
|
# ftdi_sio.ko) mais ne les charge pas d'office, et un cable branche ne cree donc
|
|
# aucun /dev/ttyUSB*. Ce script charge les deux modules puis ouvre les droits du
|
|
# device (le conteneur tourne en uid 1026, pas en root).
|
|
#
|
|
# QUAND : au demarrage du NAS, ET a chaque fois qu'on rebranche le cable apres
|
|
# coup. A automatiser via Planificateur de taches DSM -> tache declenchee
|
|
# « Au demarrage », utilisateur root, commande :
|
|
# /volume1/homes/TMZF5455/projects/EVCS/EVCS/deploy/releve-cellules/charger-pilotes.sh
|
|
#
|
|
# Idempotent : relançable sans risque.
|
|
|
|
# insmod exige root. La tache DSM « Au demarrage » peut tourner en utilisateur
|
|
# simple (verifie le 24/09 : owner 1026, pas root) : on s'eleve alors via
|
|
# sudo -n, passwordless pour cet utilisateur sur ce NAS. Sans ca, insmod echoue
|
|
# en silence au boot et le device n'existe jamais.
|
|
if [ "$(id -u)" -ne 0 ]; then
|
|
SUDO=$(command -v sudo || echo /usr/bin/sudo)
|
|
if "$SUDO" -n true 2>/dev/null; then
|
|
exec "$SUDO" -n /bin/sh "$0" "$@"
|
|
fi
|
|
echo "PAS root et sudo -n indisponible : impossible de charger les pilotes."
|
|
echo "Configurer la tache DSM pour tourner en root, ou donner sudo NOPASSWD."
|
|
exit 1
|
|
fi
|
|
|
|
# usbserial AVANT ftdi_sio (dependance). On ne code PAS le chemin en dur : une
|
|
# mise a jour DSM majeure (7.3 -> 7.4, 24/09) peut deplacer ou renommer les .ko.
|
|
# On tente modprobe (gere les dependances), sinon on cherche le .ko dans les
|
|
# arborescences de modules connues.
|
|
# On VERIFIE le chargement via lsmod apres chaque tentative, sans jamais faire
|
|
# confiance au code retour de modprobe : sur DSM il peut renvoyer 0 sans rien
|
|
# charger. On tente modprobe (gere les dependances), et si le module n'est
|
|
# toujours pas dans lsmod on insmod le .ko trouve.
|
|
charge() { /sbin/lsmod | grep -q "^$1 "; }
|
|
for ko in usbserial ftdi_sio; do
|
|
if charge "$ko"; then echo "$ko deja charge"; continue; fi
|
|
modprobe "$ko" 2>/dev/null
|
|
if ! charge "$ko"; then
|
|
kof=$(find /lib/modules /usr/lib/modules -name "$ko.ko" 2>/dev/null | head -1)
|
|
[ -n "$kof" ] && /sbin/insmod "$kof" 2>/dev/null
|
|
fi
|
|
if charge "$ko"; then echo "$ko charge"; else echo "$ko : ECHEC (introuvable ou incompatible)"; fi
|
|
done
|
|
|
|
# Laisse le temps a udev de creer le device si le cable est deja branche.
|
|
sleep 2
|
|
|
|
if [ -e /dev/ttyUSB0 ]; then
|
|
chmod 666 /dev/ttyUSB0
|
|
echo "/dev/ttyUSB0 present, droits ouverts :"
|
|
ls -l /dev/ttyUSB0
|
|
else
|
|
echo "/dev/ttyUSB0 absent : cable non branche, ou adaptateur non reconnu."
|
|
echo "Rebrancher le cable puis relancer ce script."
|
|
fi
|