Intégration Node-RED: Donner accès aux ports USB au container Docker

Je vais redemarrer de zero pour confirmer que j’ai bien les privileges , car j’ai tellement supprimer et remis de commandes, que je prefere reéssayer.
Mais je suis pratiquement sûr qu’a l’origine, j’ai pris la commande que tu m’as validé et donc pas de connexion du Node serial
voila la commande :

je reviens vers toi :wink:

bonsoir @pierre-gilles
Je viens de refaire l’installation de Gladys avec la commande ci-dessus (message precedent)
voila le resultat :


voici les permissions des ports :

crw-rw---- 1 root dialout 188,  0 Feb 20 18:13 /dev/ttyUSB0
lrwxrwxrwx 1 root root          7 Feb 20 18:13 /dev/tty-usb-arduino-nano -> ttyUSB0
ça ne fonctionne pas 

mais quand je donne les droits à « autre » pour le port USB0, avec cette commande :

pi@rasp3b:~ $ sudo chmod a+rw /dev/ttyUSB0

le node serial se connecte.
j’ai 2 ecrans sur mon PC et j’ai vu que dès que j’ai validé la commande chmod
le node serial s’est connecté immediatement et renvoie son message pour dire que le RFLINK est pret

donc pour moi --privileged \, ne donne pas tous les droits
et comme je t’ai dis quand on debranche le Rflink, les droits du port USB0 se réinitialisent.

@Psoy je viens de trouver ça (peut-être toi aussi) : Docker - a way to give access to a host USB or serial device? - Stack Overflow
Il faut descendre jusqu’à The Safe and Proper way of accessing tty devices without *--privileged* mode
En lisant le reste ça me semble pas mal mais je n’ai rien pour tester chez moi, à voir ce que ça donne sur ton host.
En gros, à chaque fois que tu replugges ton rflink, un script se lance pour le rattacher au bon endroit sur ton host.

Bonsoir @mutmut
Je nai pas vu, ce que tu as trouvé, j’ai travaillé avec Gemini pour comprendre pourquoi le node serial sur Node red ne se connectait pas au port USB, reponse « acces interdit », donc j’ai rechercher les droits des ports, (tout ce que j’explique plus haut).
J’ai lu ce que tu m’as envoyé, mais je pense entre un peu leger pour
modifier le docker run, dont il parle. En plus, je ne sais pas s’il faut modifier le fichier /etc/udev/rules.d/99-docker-tty.rules, qui existe deja dans Gladys ou bien faut-il l’adapter ou en créer un nouveau?
Effectivement ca parait etre une solution. Si tu maitrises le sujet, je veux bien que tu me fasses une trame pour m’aider à tester ça, si tu veux!

Mais d’abord il faudrait deja, que quand on ouvre Node-Red par Gladys, que les acces du port USB0 soit donner comme je l’ai mentionné.
:blush:

@Psoy En tant que quel utilisateur lances-tu le container Gladys ?

Si tu veux que le --privileged fonctionne, il faut que l’utilisateur soit root.

Je pense que ce n’est pas le cas chez toi !

Tu fais bien sudo docker run... ?

Effectivement je ne tapais pas sudo devant docker run :worried:.
Donc j’ai retapé la commande docker run avec sudo devant, et j’ai refait trois fois la manip pour etre sûr, mais meme avec sudo les droits du port USB0 ne changent pas et reste tel quel

crw-rw---- 1 root dialout 188,  0 Feb 21 09:59 /dev/ttyUSB0
lrwxrwxrwx 1 root root          7 Feb 21 09:59 /dev/tty-usb-arduino-nano -> ttyUSB0

Je n’arrive qu’a connecté le « node serial », qu’en tapant la commande
sudo chmod a+rw /dev/ttyUSB0

C’est normal, les droits du port USB0 sont sensés rester comme ça.

Les droits ici montre que l’utilisateur « root » est propriétaire de ce port USB, hors si tu as bien lancé ton container en tant que root, tu es censé du coup être propriétaire du port USB

Maintenant, là toi tu as juste lancé le container Gladys, et le container Node-RED a été lancé par Gladys. Peut-être que le container Node-RED n’est pas lancé en tant que root.

Est-ce que tu peux vérifier quel est l’utilisateur qui a lancé le container Gladys, et comparer avec l’utilisateur qui a lancé le container Node-RED ?

(Je te laisse t’aider de Google/IA pour trouver les bonnes commandes pour faire ça :slight_smile: )

ah oui c’est comme ça qu’on apprend :wink: :joy:

(message supprimé par son auteur)

De ce que je viens de tester, toutes les commandes se font sur le host, pas dans le docker gladys.
D’abord il faut que ton docker Gladys et Node-red soit en route.
Ensuite pour voir si ça focntionne tu peux tester :
docker ps -qf name=node-red
et ça doit te renvoyer un numéro/id (celui de ton docker node-red).
Si ce n’est pas bon, on ne va pas continuer et tu peux regarder si les docker sont en route avec docker ps

Donc sur le host, tu peux créer (avec ton éditeur de fichier préféré) :
sudo nano /etc/udev/rules.d/99-docker-tty.rules
puis tu copies/colles :

ACTION=="add", SUBSYSTEM=="tty", RUN+="/usr/local/bin/docker_tty.sh 'added' '%E{DEVNAME}' '%M' '%m'"
ACTION=="remove", SUBSYSTEM=="tty", RUN+="/usr/local/bin/docker_tty.sh 'removed' '%E{DEVNAME}' '%M' '%m'"

Si c’est nano, tu fais ctrl+X et Y (ou O) et Enter pour sauvegarder et quitter.
Ensuite pour appliquer les rules :

sudo udevadm control --reload

Enfin il faut créer le script qui va monter et démonter automatiquement le device sur le port usb :
sudo nano /usr/local/bin/docker_tty.sh
et tu colles :

#!/usr/bin/env bash  
                                                           
echo "Usb event: $1 $2 $3 $4" >> /tmp/docker_tty.log        
if [ ! -z "$(docker ps -qf name=node-red)" ]                                     
then                                                                            
if [ "$1" == "added" ]                                                          
    then                                                                        
        docker exec -u 0 env_dev mknod $2 c $3 $4                               
        docker exec -u 0 env_dev chmod -R 777 $2                                
        echo "Adding $2 to docker" >> /tmp/docker_tty.log                
    else                                                                        
        docker exec -u 0 env_dev rm $2                                          
        echo "Removing $2 from docker" >> /tmp/docker_tty.log            
    fi                                                                          
fi 

On met les droits d’exécution à ce script :
sudo chmod +x /usr/local/bin/docker_tty.sh
Et là tu peux regarder ce qu’il se passe en branchant ton device usb (notamment dans /tmp/docker_tty.log).

Si rien n’est bon, il y une commande à passer mais je ne sais pas exactement ce qu’elle fait (j’ai mes limites :wink: ):
docker run --device-cgroup-rule='c 188:* rmw' -itd --name my_container ubuntu
Et c’est ce que mon lien indique de faire en premier. Je pense que ça lance une ubuntu avec un container qui se nommera my_container et on lui passe un argument. Par contre je ne sais pas si il faut lancer cette commande sur le docker gladys ou sur le docker node-red, et sachant que le docker node-red sera lancé, je ne sais pas si ça fonctionne …
Bref, ça peut coincer à cet endroit.

Dis-moi en tout cas si les premiers tests sont concluants.

EDIT : après je serais tenté de te dire de ne pas passer par Gladys pour créer/lancer le docker node-red mais de t’en créer un à part et là tu pourras passer la commande bizarre dans ce docker.

Bonsoir @pierre-gilles @mutmut
Vous pouvez me confirmer que le nom de l’image du container de gladys- node-red, c’est bien nodered/node-red:3.1?

CONTAINER ID   IMAGE                                       COMMAND                  CREATED         STATUS                   PORTS                                       NAMES
702448e6dba6   nodered/node-red:3.1                        "./entrypoint.sh"        5 minutes ago   Up 5 minutes (healthy)   0.0.0.0:1881->1880/tcp, :::1881->1880/tcp   gladys-node-red
e000d717481c   gladysassistant/gladys:node-red-usb-ports   "docker-entrypoint.s…"   7 minutes ago   Up 7 minutes                                                         gladys
c12621b8b474   containrrr/watchtower                       "/watchtower --clean…"   4 weeks ago     Up 9 minutes (healthy)   8080/tcp                                    watchtower

d’abord il faut que j’initialise les droits (avec CHMOD) car au lancement il ne sont pas bons
Je viens de tester plusieurs fois debranché et rebranché le rflink mais ça ne fonctionne pas,il ne se reconnecte pas tout seul.
Je te mets les logs de /tmp/docker_tty.log

pi@rasp3b:/tmp $ sudo nano docker_tty.log
  GNU nano 5.4                                                            docker_tty.log
Usb event: added /dev/tty14 4 14
Usb event: added /dev/tty15 4 15
Usb event: added /dev/tty16 4 16
Usb event: added /dev/tty17 4 17
Usb event: added /dev/tty18 4 18
Usb event: added /dev/tty20 4 20
Usb event: added /dev/tty2 4 2
Usb event: added /dev/tty22 4 22
Usb event: added /dev/tty24 4 24
Usb event: added /dev/tty19 4 19
Usb event: added /dev/tty21 4 21
Usb event: added /dev/tty23 4 23
Usb event: added /dev/tty25 4 25
Usb event: added /dev/tty26 4 26
Usb event: added /dev/tty27 4 27
Usb event: added /dev/tty29 4 29
Usb event: added /dev/tty28 4 28
Usb event: added /dev/tty3 4 3
Usb event: added /dev/tty30 4 30
Usb event: added /dev/tty31 4 31
Usb event: added /dev/tty32 4 32
Usb event: added /dev/tty33 4 33
Usb event: added /dev/tty34 4 34
Usb event: added /dev/tty35 4 35
Usb event: added /dev/tty36 4 36
Usb event: added /dev/tty37 4 37
Usb event: added /dev/tty38 4 38
Usb event: added /dev/tty39 4 39
Usb event: added /dev/tty4 4 4
Usb event: added /dev/tty40 4 40
Usb event: added /dev/tty41 4 41
Usb event: added /dev/tty42 4 42
Usb event: added /dev/tty43 4 43
Usb event: added /dev/tty44 4 44
Usb event: added /dev/tty45 4 45
Usb event: added /dev/tty46 4 46
Usb event: added /dev/tty47 4 47
Usb event: added /dev/tty48 4 48
Usb event: added /dev/tty49 4 49
Usb event: added /dev/tty5 4 5
Usb event: added /dev/tty50 4 50
Usb event: added /dev/tty51 4 51
Usb event: added /dev/tty52 4 52
Usb event: added /dev/tty53 4 53
Usb event: added /dev/tty54 4 54
Usb event: added /dev/tty55 4 55
Usb event: added /dev/tty56 4 56
Usb event: added /dev/tty57 4 57
Usb event: added /dev/tty58 4 58
Usb event: added /dev/tty59 4 59
Usb event: added /dev/tty6 4 6
Usb event: added /dev/tty60 4 60
Usb event: added /dev/tty61 4 61
Usb event: added /dev/tty62 4 62
Usb event: added /dev/tty63 4 63
Usb event: added /dev/tty7 4 7

Je ne vois pas de port ttyUSB, est ce que ça te parle?
j’ai debranché plusieurs fois mon Rflink.

j’ai tenter de passer cette commande --device-cgroup-rule='c 188:* rmw'dans le docker run, mais ça ne donne toujours pas les droits au ports usb.

Puis j’ai integré cette commande --device=/dev/ttyUSB0 \ au
docker run et là, ça donne les droits au portUSB et le node serial se connecte bien.
Par contre toujours pareil quand on debranche le rflink le port USB perds ces droits et revient en crw-rw---- 1 root dialout 188, 0 Feb 21 22:52 /dev/ttyUSB0 au lieu de crw-rw-rw- 1 root dialout 188, 0 Feb 21 22:52 /dev/ttyUSB0