Tous les articles par admin

Mise à jour de debian 8 à 10

J’ai migré de Jessie à Buster mon raspberry pi. C’est ma centrale domotique principale. Elle héberge plusieurs services dont

  • Homebridge, un portail permettant d’attaquer le serveur par l’écosystème apple homekit
  • apache/php/mariadb/python et mon système diego qui permettent de gérer l’état de quelques modules domotiques fabriqué maison, et qui pilotent entre autres le module ci-dessous
  • telldusd, qui me permet de piloter des (micro)modules RF 433MHz

Ce qui m’a motivé à faire cette mise à jour, c’est l’acquisition d’un module LoraTap pour piloter un volet roulant électrique. Celui-ci s’intègre parfaitement dans le homebridge grâce à l’extension milo526/homebridge-tuya-web. Or, celui-ci nécessite une version récente de node.js.

Sauvegarde de l’installation

J’ai suivi 2 tutos pour la sauvegarde. Le premier nécessite de débrancher le serveur, et consiste à faire une image de la carte SD, en suivant ce genre de tuto: https://all3dp.com/2/back-up-raspberry-pi-sd-card/. Ça consiste à

  • Connecter dans mon cas sur mon mac la carte SD
  • Lancer l’utilitaire de disque
  • Afficher tous les appareils (menu présentation)
  • Faire une image sur le disque

Le deuxième tuto me parait beaucoup plus élégant. J’ai itéré plusieurs fois dessus, en modifiant quelques options de la ligne de commande. Au final, sur le raspberry pi, j’ai fait

sudo tar -cvp --one-file-system / /boot | nc -q 0 192.168.1.10 1024

J’ai oublié le /boot lorsque je l’ai fait, mais sans conséquence puisque je n’en ai pas eu besoin
Sur la machine de destination:

nc -l 1024 > backup.tar

1024, c’est le numéro de port. Ça peut prendre à peu près n’importe quelle valeur.

Mise à jour du système

Pour faire la mise à jour du système, j’ai modifié mon /etc/source.list, sur la ligne

deb http://raspbian.raspberrypi.org/raspbian/ jessie main contrib non-free rpi

J’ai modifié jessie en buster, puis

sudo apt-get update
sudo apt-get dist-upgrade

Après cette manip, j’avais des messages bizarres me disant que certains paquets n’étaient pas mis à jour. J’ai insité, mais au final, c’est mon paquet telldus qui a disparu, car dépendant de librairies obsolètes.

Recompilation de telldus-core

J’ai donc suivi un autre tuto

Après quoi, j’ai dû mettre à jour le chargement des librairies pour qu’il les trouve en ajoutant un fichier contenant /usr/local/lib/ dans /etc/ld.so.conf.d/telldus.conf, puis relancé ldconfig.

Ajout du service telldusd

teddusd, le démon de telldus-core ne se lançait pas seul. Pour cela, j’ai dû recréer un service. L’ancienne façon ne me convenait pas, avec un fichiers dans /etc/init.d. Pour une raison qui m’échappe, il ne lançait pas correctement le démon. J’ai fini par re-créer un fichier trouvé dans https://aur.archlinux.org/cgit/aur.git/tree/telldusd.service?h=telldus-core-git pour créer le fichier telldusd.service ci-dessous, à mettre dans /lib/systemd/system/telldusd.service

[Unit]
Description=Telldus-core service telldusd
After=basic.target

[Service]
Type=forking
PIDFile=/run/telldusd.pid

ExecStart=/usr/bin/telldusd

ExecReload=/usr/bin/kill --signal HUP "${MAINPID}"

[Install]
WantedBy=multi-user.target

et à partir de là, j’ai mis à jour la cache de systemd par

sudo systemctl daemon-reload

puis, je pouvais lancer telldusd

sudo system start telldusd

Je redémarre la machine pour m’assurer que ma configuration résiste à un reboot. C’est le cas. Puis j’essaie mon front-end web diego. Mais il ne fonctionne pas. Après une multitude d’essais, je comprends que c’est apache qui est lancé par systemd avec l’option PrivateTmp=true.

Cette option crée un répertoire /tmp différent pour le service, améliorant la sécurité. Mon problème est que telldusd utilise des pipes nommés dans ce répertoire pour communiquer avec l’outil tdtool. Ainsi, mon code php ne peut y accéder. J’ai commenté cette option dans le fichier service /lib/systemd/system/apache2.service, et ai relancé le service. Depuis, ça fonctionne très bien.

Enfin, j’ai mis à jour la configuration de homebridge pour intégrer mon volet roulant, et voilà !

Ça m’a valu quelques soirées à travailler pour démêler tout ça. Au final, je suis satisfait d’avoir mon serveur qui fonctionne à nouveau, qui a une installation plus récente. J’ai pu renouveler l’export de mes services perso via homebridge. J’ai aussi améliorer mes connaissances en matière de services.

J’aurais aimé une solution un poil plus élégante, du genre changer l’emplacement des fichiers socket ailleurs que dans /tmp. Mais c’est codé en dur dans telldus-core, et ne souhaitais pas modifier plus ce code. J’aurais bien vu quelque chose dans /var/run. En vrai, mon serveur apache n’est pas exposé à l’extérieur de mon LAN, ou très peu, et ponctuellement. Donc cette sécurité supplémentaire n’est pas critique.

Migration

Ça y est. Avec le serveur mysql, ça commence à faire trop opur le dockstar. Les temps de réponses sont trop long pour que l’interface soit agréable. J’ai donc décidé de le migrer vers un raspberry pi 2.

Pour la migration, facile ! J’ai pris une raspbian. Ensuite, j’ai cherché à récupérer la liste des paquets que j’avais installé.  Pas si évident. J’ai du tricoter un peu:

On extrait la liste des

sudo apt-get dotty > paquets.txt
grep -- "->" installed.dot | grep -v springgreen | cut -d \" -f 2 | sort -u > installed
grep -- "->" installed.dot | grep -v springgreen | cut -d \" -f 4 | sort -u > dep
grep -vf dep installed > min_list

Et voilà, dans min_list, la liste des paquets installés.

J’ai tout de même fait la même chose sur mon autre install avant de commencer afin de retirer la liste des paquets en commun, celle de la distrib.

Je finissais alors avec une liste d’une cinquantaine de paquets, qui correspondaient à ceux que j’avais installés à la main.

Naturellement, j’ai réinstallé que ceux qui me semblaient nécessaires, à savoir apache2, mariadb, telldus-core, vim.

et hop, ça fonctionnait.

Prochaine étape: le SSL !

Du MySQL !

Allez, c’est parti.

Grosse mise à jour aujourd’hui, puisque je rebase mon front-end web sur une base de données.

Alors, au niveau de la sécurité, j’ai un compte qui n’a accès qu’en lecture et à l’update des status, histoire que même en cas d’attaque réussie d’injection SQL, rien ne puisse être fait.

J’ai découvert comment faire des vues, histoire de simplifier les requêtes dans mon code PHP, ainsi que des triggers, afin de garder la DB dans un état cohérent.

Au niveau des mises à jour, bien entendu, l’accès à la DB, avec l’accès à la liste des commandes au lieu d’invoquer directement tdtool, et seul diego.php, le script d’exécution, invoque finalement l’outil. J’ai en outre créé des interrupteurs abstraits. Les prochains en prévision sont :

  • Une commande simple (bouton -> exec)
  • Une commande avec un paramètre, qui sera sous forme de liste, ou de curseur.

Au niveau des fonctionnalités du front end, je ne suis pas satisfait car j’ai souvent Lumière en premier mot, je voudrais rassembler ça en une icône. ensuite, j’aimerais à terme pouvoir faire des regroupements. Je n’ai pas défini précisément, mais  ce sera probablement avec une table d’index, qui pointera sur les contrôles.

En fonction du temps

Premier jet du calcul contextuel de météo.

En gros, j’utilise  yahoo weather pour me dire le temps qu’il fait.
En fonction de ça, je vérifie s’il pleut, et donc si je dois arroser.

L’utilisation se fera avec un « && » dans un shell script. Genre : weather.py && switch_on arrosage

Je prévois une application similaire pour l’allumage de l’aurore, dans la chambre. Uniquement si le soleil ne s’est pas déjà levé.

Un peu d’AJAX

Ça y est, j’ai mon GitHub Domotux. Bon, pour l’instant, il est un peu léger.  Le but est de partager ce qui est stable.

J’avais de gros soucis de réactivité sur le chargement de la page. Soucis venant en partie du chargement de ce qui doit être chargé, de la lenteur de mon upload, sans doute un peu du python, qui constituait la base de mon premier script.

Du coup, j’ai migré en PHP/Javascript, avec le backend qui utilise toujours tellstick. Ça marche de façon tout à fait satisfaisante.

La seule limitation, pour l’instant, c’est que  j’ai codé en dur la dépendance sur tdtool. J’aimerais m’en abstraire. Reste à choisir la couche d’abstraction.

En plus de ça, j’ai mis en place la sécurité SSL. Du coup, à présent, seuls les browsers où j’ai installé ma clé pourront accéder à mes commandes domotiques. C’est une grosse avancée en terme de sécurité, même si au final, je n’ouvre pas mon réseau directement sur Internet.

Un dongle wifi ? Premier Hack (facile) de driver !

Un peu au hasard, j’ai acheté une clé usb wifi.

La clé est une WNA1000M-100FRS. J’ai pas mal galéré à la configurer. J’y ai passé toute la soirée.

Alors, ce que j’ai trouvé:

http://ubuntuforums.org/showthread.php?t=1806839

Dans lequel il dit que le driver associé est rtl8192cu

Par contre, le driver ne reconnaissant pas ma carte, je lui ai ajouté l’info.
{USB_DEVICE(0x0846, 0x9041)},//NetGear WNA1000M

S’en suit la phase de make, make install, et de copie de fichiers sur ma carte.

Ensuite, comme j’avais un peu cassé mes paquest de firmware, je les ai ré-installés

apt-get remove firmware-realtek
apt-get install firmware-realtek

Puis, j’ai remis ma config telle que je l’avais configurée, à la main (ça aurait marché avec wicd, sinon)

En pratique, c’est ma config dans /etc/networks qui semble faire son boulot. à confirmer au prochain reboot. Là je suis trop fatigué pour refaire des essais.

Carte fille fonctionelle

Hier soir, petite session. Juste pour tester la chaine sysfs –> relai.
Ça fonctionne comme je le voulais. Petit temps perdu à débugguer la connectique car j’ avais oublié que le +5V est toujours actif sur le fil rouge et que les 3 autres fils servent à contrôler les relais, actif à l’état bas, du coup.

Un rapide passage sur la page de mon projet chauffage originel m’a permis de me remémorer le truc.

Du coup, ça fonctionne. Prochaines étapes:

  • Avoir un script au démarage qui me configure le truc et ouvre les devices sur sysfs, de manière facile à identifier.
  • Commencer à songer aux ordres en réception. J’irais bien essayer les commandes par IR.

Compilation de mon noyau linux-sunxi pour cubieboard 1

Bonjour,

Aujourd’hui, je vais compiler un noyau linux. J’espère.

Pourquoi le recompiler alors qu’il y en a à télécharger déjà tout prêts ?
Parce que mon module ethernet boude, sans doute un problème de quartz.

Comment faire ?

git clone https://github.com/mmplayer/linux-sunxi.git
cd linux-sunxi
sudo apt-get install gcc-arm-linux-gnueabihf
sudo apt-get install u-boot-tools
sudo apt-get install libncurses5-dev
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sun4i_defconfig
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

Sauvegarder la conf en tant que .config.
Dans mon cas, je l'ai aussi sauvegardée en gab.config pour la rouvrir plus tard.

make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=output modules_install
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=output firmware_install

Et ensuite, il faut copier tout ça sur la carte mémoire.