Démon NOK avec la version 2022-07-19 01:01:16

Je try demain de relancer la stack sans privileged, je pense que c’est le pb.

Hello,

Je suis passé en Docker hier soir, et il y a un bien un impact lié au privilège.
La doc officielle indique de se mettre en --privileged
C’était un peu trop permissif à mon gout.
J’ai donc cherché la permission nécessaire à jMQTT.
Il s’agit de --cap-add=SYS_PTRACE
En rajoutant cette capabilities, ca fonctionne :smiley:

2 « J'aime »

Ok, merci @Domochip

Je confirme que sans privileged: true le compose ci-dessus ne permets pas le lancement de jMQTT.
Par contre avec celui-ci (qui revient à ajouter --cap-add=SYS_PTRACE), jMQTT est OK :

version: "3.1"
services:
  jeedom:
    image: jeedom/jeedom:alpha
    container_name: jeedom
    cap_add:
      - SYS_PTRACE
    volumes:
      - data:/var/www/html
      - db:/var/lib/mysql
    ports:
      - 9080:80
    restart: unless-stopped
volumes:
  data:
  db:

Pareil, c’était beaucoup trop privileged à true, surtout que j’ai que des satellites, donc chez moi jeedom ne sert qu’interface de gestion.

En tout cas ça marche avec cette capacité, merci pour ta contribution.

Hello

Dsl pour hier soir, j’avais les yeux qui se croisaient :dizzy_face:

Entièrement d’accord : aucun container en privileged

En tout cas, bien vu @Domochip ! :clap:
Tout fonctionne aussi de mon coté, avec ou sans le patch.

Merci à vous pour la reprise et l’incoryable upgrade de ce plugin, ainsi que votre support ultra réactif :star_struck:

1 « J'aime »

Hello @BlacKTM, @defmy

Pouvez-vous svp tester le patch suivant (sans --privileged=true ou les droit spécifiques plus haut) ?

Remplacer dans jMQTT/core/class/jMQTT.class.php les lignes 1255, ça :

		// Checking PID match for the PORT in RemoteUID
		$output = null;
		$retval = null;
		exec(system::getCmdSudo() . 'fuser ' . $rport . '/tcp 2> /dev/null', $output, $retval);
		if ($retval != 0 || count($output) == 0) { // Execution issue, could not get a match
			self::logger('warning', sprintf(__("Démon [%s] : N'a pas pû être validé", __FILE__), $ruid));
			return '';
		}
		if (intval(trim($output[0])) != $rpid) { // No match
			self::logger('warning', sprintf(__("Démon [%s] : Port incohérent", __FILE__), $ruid));
		}

par ça :

		// Searching a match for RemoteUID (PID and PORT) in listening ports
		$output = null;
		$retval = null;
		exec("netstat -lntp | grep -E '[:]" . $rport . "[ \t]+.*[:][*][ \t]+.+[ \t]+" . $rpid . "/python3' 2> /dev/null", $output, $retval);
		if ($retval != 0 || count($output) == 0) { // Execution issue, could not get a match
			self::logger('warning', sprintf(__("Démon [%s] : N'a pas pû être authentifié", __FILE__), $ruid));
		}

Merci,
Bad

1 « J'aime »

Pour info, le correctif sera en stable demain.
Bonne soirée

Hello

Pas fonctionnel pour moi sans le --cap-add=SYS_PTRACE
Dsl pour la reponse tardive mais à chaque rm -f puis run, j’ai une corruption de la db…
Faut que je reparte du scratch puis restore…

Hello,

Merci pour ton retour,
Pas ok avec le correctif sur jMQTT.class.php ?

Tu ne peux pas juste backup les répertoires data et db du docker avant de test ? Ou j’ai loupé quelque chose ?

Bad

Hello
Autant pour moi ca fonctionne !
J’avais zappé de supprimer le /tmp/jeedom/jMQTT/jmqtt.py.pid:face_with_open_eyes_and_hand_over_mouth:
Le container est donc sans la capacité, le jMQTT.clas.php avec ce patch mais sans le précédent et le plugins/jMQTT/resources/jmqttd/JeedomMsg.py d’origine.

C’est ce que je fait mais le problème des run c’est qu’il faut les rm -f pour les recréer.
J’avoue, j’y suis peut être aller un peu bourrin en n’eteignant proprement ni jeedom ni le container :innocent:

OK tant mieux, tiens moi au jus si tu as besoin de plus :wink:

Pour info, la dernière stable de ce matin intègre tous les correctifs/patch de cette semaine.

1 « J'aime »

Je me suis remis d’origine : daemon ko.
Passé la mise à jour : daemon ko.
Supprimé le /tmp/jeedom/jMQTT/jmqtt.py.pid : daemon ok !

C’est juste parfait :star_struck:
Pas de privileged, pas de cap-add : très beau taf ! mes respects :raised_hands:
Merci à vous pour votre sollicitude.
Merci Bad pour ta sagacité.
Longue vie au #plugin-jmqtt !

3 « J'aime »

Moi ça plante chez moi :

requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=9080): Max retries exceeded with url: /plugins/jMQTT/core/php/callback.php?apikey=****&uid=**** (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))

Ce qui est normal car je ne suis pas sur le port 9080 dans le Docker mais 80. Le 9080 c’est pour l’accès interne chez moi.

Du coup j’ai mis port 80 en attendant. Par contre ça ne marche pas chez moi encore car je n’ai pas la commande netstat dans mon container. On ne peut pas utiliser ss ? net-tools est déprécié, ss est censé être le remplaçant de netstat.

Du coup, j’ai fait ça chez moi :

"ss -lntp 'sport = :" . $rport ."' 2> /dev/null"

Je vais regarder tout ça de près, mais en effet il y a pas mal de problèmes avec Docker…

Il va probablement falloir un champ de configuration spécifique pour port de Jeedom en docker, à moins que tu ne vois une autre possibilité ?

Je ne vois pas non plus, dans la zone Installation, une case à cocher si environnement Docker et remplissage par défaut du port à 80.

Après c’est vrai que j’aurais pu mettre le même port que celui configuré dans Accès Interne, mais le port 80 me paraissait plus standard.

Je suis en train de regarder les différents correctifs à déployer demain.

Peux-tu me préciser si c’est réellement nécessaire de supprimer le fichier PID ?

Normalement que ce soit Jeedom ou le Daemon, ils sont assez « intelligents » pour gérer un ficher PID avec un PID mort dedans.

Merci,
Bad

Hello

Je ne sais pas si c’est exhaustif comme test mais j’ai remplacé dans le jMQTT.class.php :

// Searching a match for RemoteUID (PID and PORT) in listening ports
		$output = null;
		$retval = null;
		exec("netstat -lntp | grep -E '[:]" . $rport . "[ \t]+.*[:][*][ \t]+.+[ \t]+" . $rpid . "/python3' 2> /dev/null", $output, $retval);
		if ($retval != 0 || count($output) == 0) { // Execution issue, could not get a match
			self::logger('warning', sprintf(__("Démon [%s] : N'a pas pû être authentifié", __FILE__), $ruid));
		}

Par :

// Checking PID match for the PORT in RemoteUID
		$output = null;
		$retval = null;
		exec(system::getCmdSudo() . 'fuser ' . $rport . '/tcp 2> /dev/null', $output, $retval);
		if ($retval != 0 || count($output) == 0) { // Execution issue, could not get a match
			self::logger('warning', sprintf(__("Démon [%s] : N'a pas pû être validé", __FILE__), $ruid));
			return '';
		}
		if (intval(trim($output[0])) != $rpid) { // No match
			self::logger('warning', sprintf(__("Démon [%s] : Port incohérent", __FILE__), $ruid));
		}

Le daemon est bien ko au redémarrage.
Puis j’ai fait l’inverse : deamon ko après redémarrage.
Laissé les +45s pour redémarrer 3 autres fois : toujours ko.
Il n’est ok après redémarrage qu’une fois le jmqtt.py.pid supprimé.

Je n’ai par contre rien fait de plus (redemarrer Jeedom ou le container,…).
Et j’ai zappé de remettre en debug avant les tests… :expressionless:

Cependant, maintenant que le jMQTT.class.php est en phase avec la stable, je le redémarre sans problème sans avoir à supprimer le jmqtt.py.pid.

N’hésites pas si tu veux tester plus en profondeur, quitte à faire une session de debug :saluting_face:

Hello,

Il y aura ça sous Docker dans la MaJ stable de demain :

Je te laisse tester,

Bad

Hello,

Le fichier PID sera supprimé par jMQTT dans la stable de demain, je te laisse re-tester.

Bad

2 « J'aime »