L'option "jamais repeter" ne fonctionne pas avec le plugin script

Bonjour,

J’ai créé une commande de type Autre avec un script BASH qui tourne toute les minutes

Le résultat de la commande peut prendre 2 valeurs : soit du texte, soit une chaîne vide

J’ai bien coché l’option ne jamais répéter

Ensuite, dans mon scénario , j’ai mis cette commande comme déclencheur

Et bien, le scénario s’exécute toute les minutes malheureusement

Bien sûr, je peux ne pas autoriser la répétition des actions, mais j’aurai voulu limiter les déclenchements à la source.

Est-ce que c’est un comportement normal que l’option « Jamais répéter » répète tout de même la valeur de la commande dans le plugin script ?

Bonjour,

C’est curieux:

  • je ne reproduis pas: j’ai une commande script qui renvoi mon IP et un scénario qui se déclenche sur la commande, donc exactement comme toi sur le principe.
  • j’ai vérifié dans le code du plugin script et il utilise la méthode checkAndUpdateCmd du core donc
    • c’est standard et pas spécifique au plugin donc pas de raison d’avoir un comportement différent (de toute façon ce ne sont JAMAIS les plugins qui déclenche les scénarios).
    • cette méthode a « toujours » pris en compte la config (même pre-4.1.23)
  • les commandes « autres » n’était pas impactées par le bug pre-4.1.23

C’est bien entendu clair pour toi que si la valeur change, alors l’event aura lieu? le « jamais repeter » n’intervient que si la valeur est la strictement la même.

Oui, je ne devrais avoir que 2 valeurs en principe
Ma commande est le retour d’un lsusb | grep -i XXXX:XXXX avec comme argument l’id XXXX:XXXX de la clé USB

#!/bin/bash
id=$1

value=`(lsusb | grep -i $id 2>&1 | tee)`

echo -n $value

Que tu en aies deux ou milles ne change rien

J’ai remarqué que lorsque la commande lsusb | grep retourne quelque chose, il n’y a pas de problème de répétition. En revanche lorsque la chaîne de caractère est nulle, le résultat de la commande est transmis à chaque fois. C’est comme si

La nouvelle chaîne nulle est différente de la précédente chaîne nulle

Dans le scénario, la non répétition de la chaîne de caractère nulle fonctionne.

[2021-07-12 20:32:30][SCENARIO] Start : Scenario execute automatiquement sur evenement venant de : [Passerelle][USB][Huawei E3531].
[2021-07-12 20:32:30][SCENARIO] Exécution du sous-élément de type [condition] : if
[2021-07-12 20:32:30][SCENARIO] Evaluation de la condition : ["" matches "/12d1:1001/"  ] = 0
[2021-07-12 20:32:30][SCENARIO] Non exécution des actions pour cause de répétition
[2021-07-12 20:32:30][SCENARIO] Fin correcte du scénario

La nouvelle chaîne nulle est bien identique à la précédente chaîne nulle

Salut,

Et si tu modifies le déclencheur du scénario par :

#[passerelle][usb][Huawei]# != ''

?

En fait, j’ai besoin de connaître les 2 états :

  • clé USB connectée avec #[passerelle][usb][Huawei]# matches "/12d1:1001/"
  • clé USB déconnectée avec #[passerelle][usb][Huawei]# == '' (celui va se déclencher toutes les minutes, il faudra ne pas autoriser la répétition dans le scénario)

Autant laisser #[passerelle][usb][Huawei]# comme déclencheur.

Pour faire plus propre, je vais modifier mon script afin qu’il retourne un NOK lorsque le lsusb ne retourne rien. Avec un NOK, le « Jamais répéter » devrait fonctionner et le scénario ne s’exécuterait plus inutilement

Reste le problème de l’option « Jamais répéter » avec une chaîne vide.

Salut,

J’ai vérifié et la réponse est: quand l’ancienne valeur est vide on répète toujours, quelque soit la nouvelle valeur:
extrait de checkAndUpdateCmd de la class eqLogic:

		if ($oldValue !== $cmd->formatValue($_value) || $oldValue === '') {
			$cmd->event($_value, $_updateTime);
			return true;
		}

Je ne peux pas dire pourquoi on fait ça.

1 « J'aime »

Merci @Mips pour l’explication de la fonction. Le comportement observé est logique.

Je vais retravailler mon script afin qu’il renvoie toujours une chaîne de caractère non vide.

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.