[RTEX] installation dépendances plugin-zigbee Raspberry Pi OS 32-bit armhf – Rust Cryptography

Bonjour à tous, c’est akenad :slight_smile: ,

Aujourd’hui je vais vous présenter un retour d’expérience sur l’installation des dépendances du plugin-zigbee sur Raspberry Pi OS 32-bit (architecture armhf/armv7l).

A ma connaissance le dev du plugin zigbee le met au point en premier lieu sur une VM Bullseye (architecture x86_64/amd64), on peut donc potentiellement s’attendre à quelques difficultés sur l’installation des dépendances associées dans d’autres cas d’usages (Buster, Smart, Atlas, RPi …).

Fourniture du log d’installation des dépendances :
/!\ ATTENTION : point important en premier lieu :
Pour arriver à analyser ce qui se passe dans certains cas il est nécessaire d’avoir le log d’installation complète.
Lorsque l’installation des dépendances du plugin zigbee se passe bien cela génère déjà beaucoup de lignes de log (dans fichier zigbee_packages), au moins 1500 lignes de log et bien plus s’il y a des problèmes.
Pour que la totalité du log soit visible il convient d’augmenter le paramètre
« Nombre de lignes maximum dans un fichier de log » par défaut :
Réglages > Système > Configuration > Logs > Logs
(accès direct http://ipjeedom/index.php?v=d&p=administration#log_log )
Mettre 5000.
Puis lancer l’installation des dépendances.
Pour accéder au log d’installation des dépendances du plugin zigbee, cliquer sur le bouton bleu « Zigbee_packages » et attendre que l’install se termine. Cliquer sur le bouton vert « Télécharger » en haut à droite dans la fenêtre Log du plugin. Renommer le fichier en zigbee_packages.txt. Joindre le fichier dans un post.
Il est impératif de fournir une log complète,
Le fichier doit commencer par :

+ echo '*******************Begin of package installation******************'
*******************Begin of package installation******************

et se terminer par :

+ echo '*******************End of package installation******************'
*******************End of package installation******************

Je n’ai pas rencontré de problème en flashant sur un RPI3B+ la dernière image jeedom (jeedom-debian-buster-rpi-4.3.8.zip, du 01/11/2022, buster 10.13) dans Index of /rpi) ou la dernière image RasberryPi (2022-09-22-raspios-bullseye-armhf-lite.img.xz, bullseye 11.5) dans Index of /raspios_lite_armhf/images et en utilisant le plugin-zigbee du 20/10/2022.

Sur un RPI3B+ avec les images citées, l’installation des dépendances du plugin zigbee (rust et cryptography inclus) prend environ 30 minutes.
Donc le mieux serait d’utiliser une de ces 2 images.

Certains jeedomiens semblent rencontrer des problèmes liés au paquet python3 cryptography, mais je n’ai pas connaissance à ce stade de l’origine de l’image qu’ils ont pu utiliser.

Le plugin zigbee utilise en dépendances des paquets python3 (dont par exemple le paquet python3 zigpy) qui ont eux mêmes en dépendance le paquet python3 cryptography.
L’installation des dépendances du plugin zigbee ne pourra être OK que si cryptography est installé.

Pour installer cryptography, pip3 utilise le compilé ou à défaut le source dans ses index : Links for cryptography et piwheels - Links for cryptography
pypi.org héberge le source (.tar.gz) et le compilé (.whl) pour les archi Linux x86_64 (amd64) et aarch64 (arm64).
piwheels.org héberge le compilé (.whl) pour les archi Linux RPi (armhf, armv7l et armv6l)

Plusieurs versions de la librairie cryptography existent, et s’agissant du RPi, avec OS 32-bit, certaines versions cryptography existent en compilé et d’autres pas.

Actuellement ont peut voir dans le log d’installation du plugin-zigbee (zigbee_packages) que pip3 cherche à installer cryptography 38.0.3, plus exactement, pip3 cherche à installer cryptography-38.0.3-cp37-cp37m-linux_armv7l.whl qui n’existe pas à ce jour dans piwheels - Links for cryptography .
(alors qu’avec Raspberry Pi OS 64-bit qui est une architecture « aarch64 », cryptography-38.0.3-cp36-abi3-manylinux_2_28_aarch64.whl existe dans Links for cryptography)
pip3 cherche donc à fabriquer le fichier cryptography-38.0.3-cp37-cp37m-linux_armv7l.whl en compilant le source cryptography-38.0.3.tar.gz avec le compilateur rust.

Lorsque tout ce passe bien rust est installé lors de l’installation des dépendances du plugin zigbee.
Mais l’installation de rust ne se passe pas bien chez certains jeedomiens.
Pour eux cryptography-38.0.3.tar.gz n’est pas compilé car rust ne semble pas avoir été installé.

(Nota : pour voir et éditer des fichiers dans /var/www/html/plugins,
aller dans Réglages > Système > Editeur de fichiers)

L’installation des dépendances par le core jeedom est réalisée à partir du fichier plugins/zigbee/plugin_info/packages.json :

{
  "pre-install" : {
    "script" : "plugins/zigbee/resources/pre-install.sh"
  },
  "apt" : {
    "python3" : {},
    "python3-pip" : {},
    "python3-pyudev" : {},
    "python3-dev" : {},
    "python3-requests" : {},
    "libffi-dev" : {}
  },
  "pip3" : {
    "setuptools" : {"reinstall" : true},
    "wheel" : {"reinstall" : true},
    "six" : {"reinstall" : true},
    "pyudev" : {"reinstall" : true},
    "requests" : {"reinstall" : true},
    "pyserial" : {"reinstall" : true},
    "tornado" : {"reinstall" : true},
    "zha-quirks" : {"reinstall" : true,"version" :"0.0.80"},
    "zigpy-znp" : {"reinstall" : true,"version" :"0.8.2"},
    "zigpy-xbee" : {"reinstall" : true,"version" :"0.15.0"},
    "zigpy-deconz" : {"reinstall" : true,"version" :"0.18.1"},
    "zigpy-zigate" : {"reinstall" : true,"version" :"0.9.2"},
    "bellows" : {"reinstall" : true,"version" :"0.33.1"},
    "zigpy" : {"reinstall" : true,"version" :"0.50.3"},
    "xmodem" : {"reinstall" : true},
    "pycrypto" : {"reinstall" : true},
    "charset-normalizer" : {"reinstall" : true,"version":"2.0.12"},
    "yarl" : {"reinstall" : true,"version":"1.4.2"}
  },
  "post-install" : {
    "script" : "plugins/zigbee/resources/post-install.sh"
  }
}

On peut remarquer en passant que certains paquets python3 seront installés dans leur dernière version disponible alors que d’autres ont leur version figée, ce qui peut potentiellement provoquer à terme des incompatibilités ou des conflits de versions entre eux lors d’une reinstallation des dépendances du plugin et se retrouver avec un statut dépendances « NOK ».

Un extrait de la fin du fichier plugins/zigbee/resources/pre-install.sh concernant l’installation de rust :

sudo apt remove -y rustc
sudo apt remove -y cargo
sudo curl -o rustup.sh -sSf https://sh.rustup.rs
sudo chmod +x rustup.sh
sudo ./rustup.sh -y
sudo rm rustup.sh
sudo ln -s /root/.cargo/bin/rustc /usr/bin/rustc
sudo ln -s /root/.cargo/bin/cargo /usr/bin/cargo

Un extrait de la fin du fichier plugins/zigbee/resources/post-install.sh concernant l’installation de rust :

echo 'Cleaning rustc'
sudo rm -rf /usr/bin/rustc
sudo rm -rf /usr/bin/cargo 
sudo rm -rf /root/.cargo

echo "Everything is successfully installed!"

Le problème semble se situer dans l’exécution des scripts pre-install.sh ou post-install.sh.

A noter par ailleurs qu’à chaque lancement de l’installation des dépendances, le core jeedom purge le cache pip3 et désinstalle et installe chaque paquet python3 de packages.json (et leurs dépendances), ainsi que rust, ce qui peut d’ailleurs engendrer des effets collatéraux si rust était déjà installé sur la machine pour un autre usage que pour le plugin-zigbee.

Voici un exemple de log d’installation OK des dépendances du plugin zigbee, fichier zigbee_packages complet, pour un RPi3B+, flashé avec l’image jeedom, et la version du plugin zigbee indiquées au début de l’article :

zigbee_packages-RPi3Bplus-image-jeedom-4.3.8-rpi-debian-buster-10.13-plugin-zigbee-20102022.txt (72,8 Ko)

la bonne installation des dépendances est vérifiable dans Réglages > Système > Configuration > OS/DB > Vérification des packages système :
pour la partie pip3 :

et dans la configuration du plugin :

dependances-OK

Lors d’investigations sur un problème de dépendances il est préférable de désactiver la gestion automatique des Dépendances et du Démon en cliquant sur le bouton rouge « Désactiver ».

Dans cet exemple, le compilateur rust est correctement installé, dans le log :

info: downloading installer
info: profile set to 'default'
info: default host triple is armv7-unknown-linux-gnueabihf
info: syncing channel updates for 'stable-armv7-unknown-linux-gnueabihf'
info: latest update on 2022-11-03, rust version 1.65.0 (897e37553 2022-11-02)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
info: installing component 'rust-std'
info: installing component 'rustc'
info: installing component 'rustfmt'
info: default toolchain set to 'stable-armv7-unknown-linux-gnueabihf'

  stable-armv7-unknown-linux-gnueabihf installed - rustc 1.65.0 (897e37553 2022-11-02)


Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).

To configure your current shell, run:
source "$HOME/.cargo/env"
+ echo 3

Lorsque rust (rustup ou rustc) n’est pas correctement installé on voit dans le log :

warning: Updating existing toolchain, profile choice will be ignored
ou
error: rustup could not choose a version of rustc to run, because one wasn't specified explicitly, and no default is configured.
ou
error: 'rustc' is not installed for the toolchain 'stable-armv7-unknown-linux-gnueabihf'

Un essai qui serait à faire c’est d’ajouter la ligne :
sudo ln -s /root/.cargo/bin/rustup /usr/bin/rustup
à la fin du fichier plugins/zigbee/resources/pre-install.sh

et ajouter les lignes
sudo rm -rf /usr/bin/rustup
et
sudo rm -rf /root/.rustup
à la fin du fichier plugins/zigbee/resources/post-install.sh

ce qui donne :

pour plugins/zigbee/resources/pre-install.sh :

sudo apt remove -y rustc
sudo apt remove -y cargo
sudo curl -o rustup.sh -sSf https://sh.rustup.rs
sudo chmod +x rustup.sh
sudo ./rustup.sh -y
sudo rm rustup.sh
sudo ln -s /root/.cargo/bin/rustc /usr/bin/rustc
sudo ln -s /root/.cargo/bin/cargo /usr/bin/cargo
sudo ln -s /root/.cargo/bin/rustup /usr/bin/rustup

et pour plugins/zigbee/resources/post-install.sh :

echo 'Cleaning rustc'
sudo rm -rf /usr/bin/rustc
sudo rm -rf /usr/bin/cargo
sudo rm -rf /root/.cargo
sudo rm -rf /usr/bin/rustup
sudo rm -rf /root/.rustup

echo "Everything is successfully installed!"

(évidemment ces modifications seront écrasées à la prochaîne mise à jour du plugin)

et de lancer une premiere fois l’installation des dépendances du plugin, d’attendre la fin, et de relancer une 2 ième fois.
avec un peu de chance le statut des dépendances passera de « NOK » à « OK ».

Si l’on ne souhaite pas que rust soit installé et désinstallé durant l’installation des dépendances, mettre en commentaire (avec #) dans plugins/zigbee/resources/pre-install.sh :

#sudo apt remove -y rustc
#sudo apt remove -y cargo
#sudo curl -o rustup.sh -sSf https://sh.rustup.rs
#sudo chmod +x rustup.sh
#sudo ./rustup.sh -y
#sudo rm rustup.sh
#sudo ln -s /root/.cargo/bin/rustc /usr/bin/rustc
#sudo ln -s /root/.cargo/bin/cargo /usr/bin/cargo
#sudo ln -s /root/.cargo/bin/rustup /usr/bin/rustup

et mettre en commentaire dans plugins/zigbee/resources/post-install.sh

#echo 'Cleaning rustc'
#sudo rm -rf /usr/bin/rustc
#sudo rm -rf /usr/bin/cargo
#sudo rm -rf /root/.cargo
#sudo rm -rf /root/.rustup
#sudo rm -rf /usr/bin/rustup

puis si l’on souhaite que rust soit installé manuellement (et donc pas désinstallé), utiliser SSH.

Pour accéder au RPi en SSH sous windows 10, par exemple,
télécharger putty.exe (64-bit x86) via https://www.putty.org
Le login/password dépend de l’origine de l’image (raspberry ou jeedom) qui a été flashée sur le RPi.

Depuis SSH, connecté avec un compte utilisateur :

Lancer les commandes :

$ sudo su -
# curl -o rustup.sh -sSf https://sh.rustup.rs
# chmod +x rustup.sh
# ./rustup.sh

puis taper touche « entrée » pour lancer l’installation.

(si besoin la désinstallation de rust peut se faire utlérieurement par la commande)
(# rustup self uninstall)

(si besoin pour avoir plus d’informations, commande avec option verbose)
(# ./rustup.sh -v)

rustup ajoute /root/.cargo/bin dans le PATH, ce qui permet à root d’accéder directement aux commandes rustup, rustc et cargo.

Pour récupérer tout le contenu de la fenêtre PuTTY, cliquer droit sur le haut de la fenêtre et cliquer sur « Copy All to Clipboard », coller ensuite dans un fichier texte qui peut être posté le cas échéant.

Le problème de compilation nécessaire de cryptography avec rust peut apparaître sur d’autres plugins qui utilisent cryptography, tels que par exemple xiaomihome ou broadlink,

et voir aussi plus bas dans cet article : [RTEX] installation dépendances plugin-zigbee Raspberry Pi OS 32-bit armhf – Rust Cryptography - #33 par akenad

Voila j’espère que ce retour d’expérience sera utile aux membres Jeedom.

akenad :slight_smile:

7 « J'aime »

Akenad,

J’ai essayé la manip (ajout de la ligne pour cryptography dans packages.json).
De mon côté cela ne fonctionne pas (j’ai fait deux essais), je ne sais si quelqu’un d’autre a essayé.

Je mets mon log en PJ

Merci
zigbee_packages.txt (191,6 Ko)

tribaldam,

j’ai modifié le premier post.
Peux-tu essayer ?

akenad :slight_smile:

J’ai exactement les memes erreurs…

Pour info, je pense avoir reinstallé mon jeedom avec une version d’image qui date du 26 juillet 2021.
Par contre, je suis parti de raspbian et ensuite j’ai installé jeedom. Je n’ai pas pris la version packagée.

Pour ma part, rust devait deja etre installé avant l’installation des dependances zigbee car j’en ai eu besoin pour le certificat let’s encrypt avec challenge DNS ovh.
Quand je regarde mes notes pour mettre en place ca, j’ai mentionné rust à installer.

Peut etre que les autres utilisateurs ont le meme souci d’installation a cause de let’s encrypt du coup

la commande rust n’est pas accessible directement, je dois taper : /usr/bin/rustc pour pouvoir l’utiliser.
peut etre un truc a corriger dans le script d’installation de dependances

Merci je vais essayer ça demain.
Au préalable il faut que je retire la ligne concernant cryptography dans le premier .json ?

oui

akenad :slight_smile:

Bonjour akenad,
2 questions de simple curiosité:

  • Pourquoi les exécutables du compilateur rust et son gestionnaire de dépendances cargo sont-ils supprimés après l’installation des dépendances du plugin zigbee? Les paquets rustc et cargo sont installés mais non fonctionnels.
  • Comment traduisez-vous log pour le mettre au féminin? Ce n’est pas une bûche. :thinking:
1 « J'aime »

Bonjour jpty,

C’est une question à poser à Jeedom SAS.

Modifié. Merci.

akenad :slight_smile:

Bonjour kornflex,

j’ai complété le premier post.

akenad :slight_smile:

J’ai essayé avant la modification d’il y a deux heures :
1er lancement dépendances : NOK
2ème lancement : je ne sais pas s’il s’est lancé mais en tout cas pour le moment je n’ai plus accès à mon jeedom…plus rien, ni en local, ni à distance, rien. :fearful:

Ouf ! fausse frayeur c’est revenu au bout de 20mn ! Installation en cours à 20%…à suivre !

Toujours NOK après deux essais
zigbee_packages.txt (168,9 Ko)

jai aussi pas mal de problèmes mais cette partie n’est pas OK chez moi alors jessaie de régler ca d’abord. pour toi c’est OK cette partie?

la bonne installation des dépendances est vérifiable dans Réglages > Système > Configuration > OS/DB > Vérification des packages système :
pour la partie pip3 :

Tout n’est pas ok non. J’ai plusieurs packages qui sont en orange « mise à jour » avec une proposition de correction.

Dans ton log il y a un « killed » pendant l’installation de rust :

info: downloading installer
info: profile set to 'default'
info: default host triple is armv7-unknown-linux-gnueabihf
info: syncing channel updates for 'stable-armv7-unknown-linux-gnueabihf'
info: latest update on 2022-11-03, rust version 1.65.0 (897e37553 2022-11-02)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
info: installing component 'rust-std'
Killed
+ echo 3

et
error: rustup could not choose a version of rustc to run, because one wasn't specified explicitly, and no default is configured.

manifestement le processus d’installation de rust a été interrompu (lié peut être à ta remarque « je n’ai plus accès à mon jeedom ».)
je t’invite à relancer l’installation des dépendances.

akenad :slight_smile:

Je viens de refaire deux essais d’installation avec le nouveau protocole (modification du pre et du post install).
Lors de l’essai d’hier je n’avais ajouté qu’une seule ligne à post_install (sudo rm -rf /root/.rustup).
Toujours NOK
zigbee_packages.txt (167,4 Ko)

Donc même comportement que précédemment, à savoir un « Killed » dans la log durant l’installation de rust via l’installation des dépendances du plugin.
Tu dois avoir quelque chose de particulier sur ton RPi qui le provoque.
Si tu as un peu de temps je te propose d’installer rust en manuel en suivant la fin de mon premier post.
Cela permettra de visualiser des informations supplémentaire dans la console SSH, que l’on ne voit pas forcement dans le log du plugin, à savoir lors du lancement de :
# ./rustup.sh

akenad :slight_smile:

Ok j’essaye ça ce soir (il faut que je sois en local). A suivre ! (et merci encore)

Essai réalisé : en ssh presque tout a fonctionné mais il y a un « killed » à la fin sur rust :

info: profile set to 'default'
info: default host triple is armv7-unknown-linux-gnueabihf
info: syncing channel updates for 'stable-armv7-unknown-linux-gnueabihf'
info: latest update on 2022-11-03, rust version 1.65.0 (897e37553 2022-11-02)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-std'
 27.3 MiB /  27.3 MiB (100 %)  10.0 MiB/s in  3s ETA:  0s
info: downloading component 'rustc'
 79.0 MiB /  79.0 MiB (100 %)  16.1 MiB/s in  6s ETA:  0s
info: downloading component 'rustfmt'
info: installing component 'cargo'
  6.1 MiB /   6.1 MiB (100 %)   3.3 MiB/s in  2s ETA:  0s
info: installing component 'clippy'
info: installing component 'rust-docs'
 18.8 MiB /  18.8 MiB (100 %)   1.2 MiB/s in 29s ETA:  0s    
info: installing component 'rust-std'
 27.3 MiB /  27.3 MiB (100 %)   2.7 MiB/s in 10s ETA:  0s
info: installing component 'rustc'
 72.0 MiB /  79.0 MiB ( 91 %)   2.7 MiB/s in 27s ETA:  2sKilled

J’ai quand même essayé l’installation des dépendances mais sans succès :
zigbee_packages.txt (164,9 Ko)

Donc reste à comprendre pourquoi sur ton rpi l’installation de rustc s’arrête avant la fin ou bien de repartir sur une nouvelle image et restaurer jeedom

akenad :slight_smile: