Flyounet : (Digital|Real)? life

Une sorte de journal quotidien, mais en vachement plus espacé dans le temps

Valider sa connexion externe à Jeedom

Rédigé le . Édité le .

Pour savoir ce qu'est Jeedom, il faut lire les épisodes précédents. Cependant, j'ai un petit soucis depuis le passage en 3.x, mon accès VPN décroche sans arrêt. Voici, comment, j'ai en partie palier au problème.

Description du problème

Lors de l'arrivée de la version 3.x de Jeedom, ma carte SD a décidé de mourrir (juste parce que j'ai éteint le Raspberry PI un peu comme un bourrin). Ce n'était pas la faute de Jeedom.
Et comme la méthode d'installation a changé légèrement elle aussi au même moment, dites-vous que j'en ai chié.
Heureusement, la sauvegarde effectuée la veille du crash m'a sauvé.

Bref, depuis ce temps là, mon accès externe en utilisant les DNS de Jeedom et un accès VPN tombait régulièrement (et ça continue)*. Ce qui m'obligeait à aller dans l'interface pour redémarrer le réseau de la Jeedom.

Solution

Petit rappel : si vous êtes ici suite à une recherche, c'est que vous avez un minimum de connaissances. On va donc se faciliter la vie en disant que vous savez éditer un fichier, installer un plugin, vous connecter à votre Jeedom, etc.

Je suis une grosse feignasse, plutôt que de faire ça trois ou quatre fois par jour (et surtout la nuit). C'est Jeedom qui redémarre à ma place.

Donc pour cela, on met un script en place et on utilise un scénario.

Le script

Chez moi il s'appelle : jdom_check_network_external.sh (chez toi ce sera comme tu veux).
Il doit aller dans ce répertoire : /var/www/html/plugins/script/core/ressources
Il doit être exécutable, et appartenir au bon user. Non, il n'y aura pas de description de quoi faire, c'est tout ce qu'il y a de plus con sous unix.

#!/usr/bin/env bash
#set -xv
# domain to contact Jeedom
_dom="chezmoi.dns.jeedom.com"
_url="https://${_dom}/here.html"

while [ ${_cpt:=1} -le 2 ]; do
    # Connection timeout is forced to 10 second and global timeout to 20s
    _res="$(curl --connect-timeout 10 -m 20 -Lks "${_url}" 2>&1)"
    _rc=${?}
    if [ ${_rc} -eq 0 -a "${_res,,}" = "ok" ]; then
        printf '%i\n' 0; exit 0
    fi
    printf '[%s] rc=%s "%s"\n' "$(date '+%Y%m%d-%H:%M:%S')" "${_rc}" "${_res}" >> "${0}.log"
    ((_cpt++))
done
printf '%i' 1; exit 0

Juste vous remplacez le fqdn (qui n'est pas réellement le mien) dans la variable _dom et voilà. Sachez qu'en lisant les sources on fini par trouver que le menu Santé de la Jeedom fait à peu de chose près ce que je fais pour tester ; il utilise le fichier here.html.

Sachez aussi que le script écrit dans un fichier de log quand ça déconne :

$ cat jdom_check_network_external.sh.log
[20171119-10:59:22] rc=6 ""
[20171119-11:33:41] rc=28 ""

6: Couldn't resolve host. The given remote host was not resolved.
28: Operation timeout. The specified time-out period was reached according to the conditions.

Pour vous aider, le man de curl vous dira pourquoi ça déconnait, dans la plupart des cas, une erreur 6, c'est chez vous que ça merde, une 28 je dirais que c'est chez Jeedom.

Ce qui me fait dire que le soucis est chez Jeedom ? Bah, premièrement mes logs :

[20171114-23:02:23] rc=28 ""
[20171114-23:02:43] rc=28 ""
[20171115-00:02:03] rc=6 ""
[20171115-20:02:13] rc=28 ""
[20171115-20:02:23] rc=28 ""
[20171115-23:02:22] rc=28 ""
[20171116-23:02:23] rc=28 ""
[20171117-23:02:22] rc=28 ""
[20171118-23:02:23] rc=28 ""
[20171119-23:02:22] rc=28 ""
[20171120-23:02:23] rc=28 ""
[20171121-23:02:23] rc=28 ""
[20171122-23:02:23] rc=28 ""

Sachant que pendant ce temps mes connexions depuis et vers l'exterieur non pas souffert le moins du monde. Du coup, j'ai pas de deuxièmement.

Mais bon pour le moment, je me contente du script qui fait le taf. Je vous ai parlé de ma flemme ?

 Le scénario

J'aurais plutôt dû mettre les scenarii. C'est mon côté : Y a un peu plus, je laisse ?

Quelques facts :

Juste pour vous habituez aux noms que j'utilise :

  • [Système][DNS Jeedom] est mon objet VPN
  • #[Système][vpnConnexion][scanVPN]# est le code retour de mon script : jdom_check_network_external.sh. Pour être pllus précis, c'est l'appel à mon script (et donc son code retour).
  • DNS-Validation+Restart est le nom du scenario qui valide si le network est OK
  • DNS-Restart est le nom du scenario qui effecture le restart du network
  • varDNSRestartInProgress est une variable qui indique si un restart est déjà en cours

VPN

Vous l'avez configuré, vous savez donc où le trouver. On a besoin de connaître son parent et son nom.

VPN

Appel du script

Donc le module Script est nécessaire (le 1 sur l'image), et l'objet que j'ai créé s'appelle [Système][vpnConnexion] (le 2 sur l'image).

Script et module

Voilà de plus près l'objet :

Script

Et surtout sa configuration:

Script configuration

Finalement, c'est plutôt simple, non ?! Donc, la valeur de retour du script est stockée dans scanVPN

Les scénarios

Comme je disais plus haut, j'en ai deux, un qui fait le restart à proprement parler.
Et le second qui lui fait le test et si nécessaire appelle le scénario du restart.

Vous pouvez tout mettre dans le même. Je préfère séparer pour pouvoir appeler le scénario de restart depuis Telegram lorsque je le souhaite.

Scénario : Restart

Au début du scénario je change la valeur d'une variable pour indiquer qu'un restart est en cours. C'est juste pour que les scénario appelant icelui sache qu'il est déjà en train de tourner (il y a peut-être plus simple, mais j'ai pas cherché).

Scenario Restart

Ce scénario ne constiste qu'en un arrêt suivi 20 secondes plus tard d'un start. Le plugin openVPN a déjà les commandes existantes, il suffisait juste de les appeler.
Comme vous pouvez le constater, j'ajoute des logs pour faire bien.

Scénario : Test

La configuration de ce scénario est on ne peut plus basique, il est programmé toutes les minutes et est configuré en synchrone.

Scenario Test+Restart

Le scénario en lui regarde la varDNSRestartInProgress est à 1 et dans ce cas, il stoppe. SInon, il attend 10 secondes. C'est pour être sûr que le script a eu le temps de valider si le VPN était dispo.

Je suis conscient qu'on pourrait avoir le scénario qui tournerait en parallèle, mais c'est un peu pour ça que j'ai ajouté la variable qui dit que c'est déjà en cours.

Scenario Test+Restart

Donc, si le script renvoi 0, on appelle le scénario de restart et on balance un Telegram pour dire qu'il y a eu restart.

Voilà, c'est pas plus compliqué que ça. Et comme je t'aime bien lecteur et qu'il me restait une image à afficher, je te propose la cartographie de mon restart dans Jeedom (ça prend en compte tous les objets liés à ce que je viens d'expliquer).

Scenario Relations

[*] La petite note de bas de page (si tu la vois pas : achètes un labrador)

Cette option est incluse dans les packs Jeedom (au moins le pack power). De mémoire, ils appellent cela DNS dynamique et HTTPS.

Au moins vous serez pas venu voir cette note pour rien... Retourne où tu étais.